Linux:socket close()与shutdown()的比较
因此,在linux上,shutdown()可以使用参数shuth_RD、shuth_WR或shuth_RDWR来仅关闭部分通信通道。但就发送给对等方的TCP消息而言,它是如何工作的 在TCP状态机中,关闭以4路握手方式工作Linux:socket close()与shutdown()的比较,linux,tcp,Linux,Tcp,因此,在linux上,shutdown()可以使用参数shuth_RD、shuth_WR或shuth_RDWR来仅关闭部分通信通道。但就发送给对等方的TCP消息而言,它是如何工作的 在TCP状态机中,关闭以4路握手方式工作 (1) (2) FIN----------> <----------ACK <----------FIN ACK-----------> (1)(2) FIN-----------> FIN数据包不必是对称的。当其
(1) (2)
FIN---------->
<----------ACK
<----------FIN
ACK----------->
(1)(2)
FIN----------->
FIN数据包不必是对称的。当其本地写入程序关闭套接字时,每一端发送FIN
shutdown(sd,shutu-WR)
发送一个FIN,对等方用ACK响应。任何进一步写入套接字的尝试都将导致错误。但是,对等方仍然可以继续发送数据
shutdown(sd,shutu\RD)
在网络上不发送任何内容:它只是调节本地API返回EOS,以便在套接字上进行任何后续读取。在已关闭以进行读取的套接字上接收数据时的行为取决于系统:Unix将确认数据并将其丢弃;Linux将对其进行确认和缓冲,这最终将使发送方停止发送;Windows将发出RST,发送方将其视为“由对等方重置连接”
如果主机1关闭了怎么办?什么都不会发送,对吗?如果对等主机2发送消息,会发生什么情况?HOST1是回复RST还是忽略它?我认为它应该发送RST,是的。但我懒得去测试。请注意,从读取端无法强制网络上的其他主机不发送任何数据包,因此我怀疑TCP实现可能在这方面有所不同……是的,确实如此。所以,如果HOST1回复RST,那么HOST2是否会关闭其套接字,因为HOST2不知道HOST1发生了什么,并且会将此RST视为常规RST?那么如果HOST2关闭套接字,HOST1剩下的写一半将不再工作,是吗?@wei在已关闭以进行读取的套接字上接收数据时的行为取决于系统:Unix将确认数据并将其丢弃;Linux将对其进行确认和缓冲,这最终将使发送方停止发送;Windows将发出RST,发送方将其视为“对等方重置连接”。@EJP,感谢您为我清除它。然而,我不知道如何接受评论作为回答。