因此在linux上,shutdown()可以使用参数SHUT_RD,SHUT_WR或SHUT_RDWR来仅关闭部分通信通道。但就发送给对等体的TCP消息而言,它是如何工作的?
在TCP状态机中,关闭以4向握手方式工作,
(1) (2)
FIN---------->
<----------ACK
<----------FIN
ACK----------->
那么当我关机(袜子,SHUT_RD)或关机(袜子,SHUT_WR)时会发出什么消息?
答案 0 :(得分:16)
shutdown(sd, SHUT_WR)
发送一个FIN,对等端通过ACK响应。任何进一步尝试写入套接字都会导致错误。但是,对等方仍然可以继续发送数据。
shutdown(sd, SHUT_RD)
在网络上不发送任何内容:它只是调整本地API以便为套接字上的任何后续读取返回EOS。在已关闭以进行读取的套接字上接收数据时的行为与系统有关:Unix将对其进行确认并将其丢弃; Linux将确认并缓冲它,这最终会阻止发送方; Windows将发出RST,发件人将其视为“通过对等方重置连接”。
答案 1 :(得分:1)
FIN数据包不必是对称的。当本地作者关闭套接字时,每一端都发送FIN。
答案 2 :(得分:0)
关闭写端发送 FIN 并关闭将关闭套接字。因此任何发送关闭套接字的尝试都将导致 RESET 数据包。
我遇到了一个有趣的问题 发件人发送: 数据包A发送 Pakcet B 发送 关闭写 FIN 关机读取 关闭套接字
但接收器接收乱序 数据包A 包含 FIN 的数据包 数据包B 来自接收方的ACK,这会导致连接重置。