Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux:socket close()与shutdown()的比较_Linux_Tcp - Fatal编程技术网

Linux:socket close()与shutdown()的比较

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数据包不必是对称的。当其

因此,在linux上,shutdown()可以使用参数shuth_RD、shuth_WR或shuth_RDWR来仅关闭部分通信通道。但就发送给对等方的TCP消息而言,它是如何工作的

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

(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,感谢您为我清除它。然而,我不知道如何接受评论作为回答。