Linux:socket close()vs shutdown()

时间:2013-02-06 23:27:19

标签: linux tcp

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

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

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

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

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

那么当我关机(袜子,SHUT_RD)或关机(袜子,SHUT_WR)时会发出什么消息?

3 个答案:

答案 0 :(得分:16)

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

  2. 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,这会导致连接重置。