【问题标题】:Has the client ACK'd all the data I sent to it?客户端是否确认了我发送给它的所有数据?
【发布时间】:2015-01-18 08:10:07
【问题描述】:

RFC 7230 定义了 HTTP/1.1 协议,它在 6.6 中有一段有趣的段落,“连接管理。拆除”:

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

基本上可以归结为以下几点:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Sockets 接口通过很少使用和不太了解的SO_LINGER 选项提供了这种方法。它允许您除其他外定义一个超时,在此期间close() 和可能shutdown() 将在发送未决数据时阻塞。它几乎没有实际用途,而且正如我所说的,它很少使用……至少很少正确使用。

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 2016-10-19
      • 2017-08-17
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多