客户端是否已确认我发送给它的所有数据?

时间:2014-11-20 12:48:20

标签: sockets tcp network-programming httpserver http-proxy

RFC 7230定义了HTTP / 1.1协议,它在6.6和#34;连接管理中有一个有趣的段落。拆除":

  

为避免TCP重置问题,服务器通常会关闭连接   分阶段。首先,服务器通过仅关闭来执行半关闭   写入读/写连接的一面。然后服务器继续   从连接读取,直到它收到相应的关闭   客户端,或直到服务器合理地确定自己的TCP   stack已收到客户端对数据包的确认   包含服务器的最后一个响应。最后,服务器完全   关闭连接。

基本上归结为以下几点:

shutdown(s, SD_SEND);
while (recv(s, throaway_buffer, throaway_buffer_len, 0) > 0);
closesocket(s);

这是执行正常关闭的标准方法。但是,它还承认可能存在行为不当的客户端(即使在收到带有Connection: close标头的响应后也会继续发送请求),并且服务器必须通过在确定连接之后重置连接来应对它客户收到了最后的回复。

但是,套接字接口似乎没有提供功能来了解传递给send的所有数据是否已被实际发送并由远程主机确认。它真的存在吗?没有它,我能想到的就是设置一个排序计时器,然后调用recv直到它发出远程主机已关闭连接或时间结束的信号,以先到者为准。但什么是适当的超时? 60秒好吗?

1 个答案:

答案 0 :(得分:0)

套接字接口通过很少使用且不太了解的SO_LINGER选项提供此平均值。它允许您尤其定义一个超时,在此期间close()和可能shutdown()将在发送待处理数据时阻止。它几乎没有实际用途,正如我所说,它很少使用......至少很少使用正确。