Frage

Ich las über die SO_LINGER Socket-Option verwenden absichtlich, um die Zeit-Wartezustand ‚ermorden‘ durch die linger Zeit auf Null. Der Autor des Buches geht dann weiter zu sagen, wir sollten dies nie tun und im Allgemeinen, dass wir nie mit der Zeit-Wartezustand stören sollte. Er dann sofort empfiehlt die SO_REUSEADDR Option mit dem Zeit-Wartezustand zu umgehen.

Meine Frage ist, was ist der Unterschied? In beiden Fällen sind beenden Sie vorzeitig den Zeitwartezustand und nehmen das Risiko einer Aufnahme doppelte Segmente. Warum ist man gut und die andere schlecht?

War es hilfreich?

Lösung 2

Ich habe einige mehr lesen und das ist mein Verständnis von dem, was geschieht (hoffentlich richtige):

Wenn Sie auf eine Steckdose in der Nähe nennen, die SO_REUSEADDR Satz (oder die App stürzt ab) die folgende Sequenz auftritt:

  1. TCP Sendet alle verbleibenden Daten im Sendepuffer und einem FIN
  2. Wenn der Nähe genannt wurde es sofort zurück, ohne angezeigt, wenn ein verbleibender Daten wurden erfolgreich übermittelt.
  3. Wenn die Daten der Peer sendet eine Daten ACK
  4. gesendet wurde
  5. Die Peer sendet eine ACK des FIN und sendet sie eigene FIN-Paket ist
  6. Die FIN Peer acked und die Sockel Ressourcen werden freigegeben.
  7. Die Fassung nicht TIME-WAIT ein.

Wenn Sie schließen eine Buchse mit der SO_LINGER Zeit auf Null gesetzt:

  1. TCP verwirft alle Daten im Sendepuffer
  2. TCP sendet ein RST-Paket an den Peer
  3. Die Socket-Ressource freigegeben.
  4. Die Fassung tritt nicht in TIME-WAIT

So über die Tatsache hinaus, dass linger auf Null ist ein Hack und schlechter Stil ist es auch schlechte Manieren, da es nicht durch eine saubere Abschaltung der Verbindung gehen wird.

Andere Tipps

TIME_WAIT ist absolut normal. Es tritt nach einem TCP FIN auf der lokalen von einem TCP FIN ACK von der entfernten Stelle, gefolgt Seite. In TIME_WAIT warten Sie nur für jedes streun Paket an der lokalen Adresse zu gelangen. Allerdings, wenn es ein verlorenes oder Streu Paket ist dann sicher, dass TIME_WAIT TTL oder „Zeit zu leben“ abläuft, bevor die Adresse erneut verwenden.

Wenn Sie SO_REUSEADDR verwenden, dann sind Sie im Grunde sagen, gehe ich davon aus, dass es keine verloren gegangenen Pakete. Das ist immer wahrscheinlicher, mit modernen, zuverlässigen TCP-Netzwerken. Obwohl es immer noch möglich ist, ist es unwahrscheinlich.

Einstellung SO_LINGER auf Null bewirkt, dass Sie eine abnorme Nähe initiieren, auch genannt „die Verbindung Zuschlagen.“ Hier können Sie nicht TIME_WAIT respektieren und die Möglichkeit eines Streu Paket zu ignorieren.

Wenn Sie sehen FIN_WAIT_1 dann dies zu Problemen führen kann, da der Remote-Standort hat sich als Antwort auf Ihre FIN keine TCP FIN ACK gesendet. So wurde der Prozess entweder getötet oder die TCP FIN ACK wurde aufgrund einer Netzwerkpartition oder einem schlechten Weg verloren.

Wenn Sie CLOSE_WAIT sehen haben Sie ein Problem, hier sind Sie undichte Verbindungen, wie Sie das TCP FIN ACK nicht sendet, wenn das TCP FIN gegeben.

Ich habe SO_REUSEADDR verwenden, um Wildcard-Bind () an einem lokalen Anschluss, für die ein anderes Programm bereits eine Verbindung hatte öffnen auf. Es stellt sich heraus, diese besondere Anwendung wird nie so lange ein Problem verursachen, da keine zwei Sockets versuchen zugleich () auf der gleichen Adr / Port Combo zu hören.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top