9

したがって、Linuxでは、shutdown()はパラメーターSHUT_RD、SHUT_WR、またはSHUT_RDWRを使用して、通信チャネルの一部のみをシャットダウンできます。しかし、ピアに送信するTCPメッセージに関しては、どのように機能しますか?

TCPステートマシンでは、クロージングは​​4ウェイハンドシェイク方式で機能します。

(1)           (2)
FIN---------->

   <----------ACK
   <----------FIN

ACK----------->

では、shutdown(sock、SHUT_RD)またはshutdown(sock、SHUT_WR)を実行すると、どのようなメッセージが送信されますか?

4

3 に答える 3

16
  1. shutdown(sd, SHUT_WR)ピアがACKで応答するFINを送信します。それ以上ソケットに書き込もうとすると、エラーが発生します。ただし、ピアは引き続きデータを送信できます。

  2. shutdown(sd, SHUT_RD)ネットワーク上では何も送信しません。それは、ソケットでの後続の読み取りのためにEOSを返すようにローカルAPIを条件付けるだけです。読み取りのためにシャットダウンされたソケットでデータを受信するときの動作は、システムに依存します。UnixはそれをACKして破棄します。LinuxはそれをACKしてバッファリングし、最終的に送信者を失速させます。WindowsはRSTを発行します。これは、送信者が「ピアによってリセットされた接続」と見なします。

于 2013-02-07T04:15:49.810 に答える
1

FINパケットは対称である必要はありません。ローカルライターがソケットを閉じたときに、両端がFINを送信します。

于 2013-02-06T23:37:54.757 に答える
0

書き込み終了でシャットダウンし、FINを送信して閉じると、ソケットが閉じます。したがって、ソケットを閉じるように送信しようとすると、RESETパケットが発生します。

送信者が送信する興味深い問題に遭遇しました:パケットA送信パケットB送信シャットダウンと書き込みFINシャットダウン読み取りクローズソケット

しかし、受信者は受信者からFINパケットB ACKを含むパケットAパケットを順不同で受信します。これにより、接続がリセットされます。

于 2021-08-11T14:45:09.587 に答える