9

所以在 linux 上,shutdown() 可以带一个参数 SHUT_RD、SHUT_WR 或 SHUT_RDWR 来只关闭部分通信通道。但就发送给对等方的 TCP 消息而言,它是如何工作的呢?

在 TCP 状态机中,关闭以 4 次握手方式工作,

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

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

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

那么当我关闭(sock,SHUT_RD)或关闭(sock,SHUT_WR)时它会发送什么消息?

4

3 回答 3

16
  1. shutdown(sd, SHUT_WR)发送一个 FIN,对等方使用 ACK 响应该 FIN。任何进一步写入套接字的尝试都将导致错误。但是,对等方仍然可以继续发送数据。

  2. shutdown(sd, SHUT_RD)在网络上不发送任何内容:它只是使本地 API 为套接字上的任何后续读取返回 EOS。在已关闭以供读取的套接字上接收数据时的行为取决于系统:Unix 将确认并丢弃它;Linux 会对它进行 ACK 并缓冲它,这最终会阻止发送者;Windows 将发出 RST,发件人将其视为“对等方重置连接”。

于 2013-02-07T04:15:49.810 回答
1

FIN 数据包不必是对称的。当本地写入器关闭套接字时,每一端都会发送 FIN。

于 2013-02-06T23:37:54.757 回答
0

shutdown with write end send FIN and close 将关闭套接字。因此任何发送关闭套接字的尝试都将导致 RESET 数据包。

我遇到了发送方发送的有趣问题:Packet A send Pakcet B send shutdown with write FIN shutdown read close socket

但是receiver从receiver收到乱序的Packet A Pakcket,其中包含FIN Packet B ACK,这会导致连接重置。

于 2021-08-11T14:45:09.587 回答