Linux: socket schließen () vs shutdown ()

8

Linux kann also shutdown () einen Parameter SHUT_RD, SHUT_WR oder SHUT_RDWR nehmen, um nur einen Teil des Kommunikationskanals abzuschalten. Aber in Bezug auf die TCP-Nachrichten, die an den Peer senden, wie funktioniert es?

In der TCP-Statusmaschine funktioniert das Schließen in einer 4-Wege-Handshake-Art,

%Vor%

Also, welche Nachrichten dosieren sendet es, wenn ich eine Abschaltung (Sock, SHUT_RD) oder Shutdown (Sock, SHUT_WR) mache?

    
wei 06.02.2013, 23:27
quelle

2 Antworten

15
  1. shutdown(sd, SHUT_WR) sendet ein FIN, auf das der Peer mit einem ACK reagiert. Bei weiteren Versuchen, in den Socket zu schreiben, tritt ein Fehler auf. Der Peer kann jedoch weiterhin Daten senden.

  2. shutdown(sd, SHUT_RD) sendet nichts im Netzwerk: Es wird lediglich die lokale API so konditioniert, dass EOS für alle nachfolgenden Lesevorgänge auf dem Socket zurückgegeben wird. Das Verhalten beim Empfang von Daten auf einem Socket, das zum Lesen heruntergefahren wurde, ist systemabhängig: Unix wird es bestätigen und wegwerfen; Linux wird es quittieren und puffern, was den Sender schließlich zum Stillstand bringen wird; Windows wird eine RST ausgeben, die der Absender als "Verbindung durch Peer zurückgesetzt" sieht.

EJP 07.02.2013, 04:15
quelle
1

Die FIN-Pakete müssen nicht symmetrisch sein. Jedes Ende sendet FIN, wenn sein lokaler Schreiber den Socket geschlossen hat.

    
Andy Ross 06.02.2013 23:37
quelle

Tags und Links