相关疑难解决方法(0)

Linux上TCP重传的应用控制

对于不耐烦:

如何改变的价值/proc/sys/net/ipv4/tcp_retries2在Linux中单个连接,使用setsockopt(),ioctl()或者这样,或者是这可能吗?

更长的解密:

我正在开发一个使用长轮询HTTP请求的应用程序.在服务器端,需要知道客户端何时关闭连接.准确性并不重要,但肯定不能是15分钟.接近一分钟就可以了.

对于不熟悉该概念的人,长轮询HTTP请求的工作方式如下:

  • 客户端发送请求
  • 服务器使用HTTP标头进行响应,但保持响应处于打开状态.使用分块传输编码,允许服务器在可用时发送数据位.
  • 当发送所有数据时,服务器发送"关闭块"以表示响应已完成.

在我的应用程序中,服务器每隔一段时间就向客户端发送"心跳"(默认为30秒).心跳只是一个作为响应块发送的换行符.这是为了保持线路忙,以便我们通知连接丢失.

客户端正常关闭时没有问题.但是当它强制关闭时(例如客户端机器断电),不会发送TCP重置.在这种情况下,服务器发送心跳,客户端不会发送确认.在此之后,服务器在放弃并向应用层(我们的HTTP服务器)报告失败后,继续重传该数据包大约15分钟.在我的情况下等待15分钟太久了.

我可以通过写入以下文件来控制重传时间/proc/sys/net/ipv4/:

tcp_retries1 - INTEGER
    This value influences the time, after which TCP decides, that
    something is wrong due to unacknowledged RTO retransmissions,
    and reports this suspicion to the network layer.
    See tcp_retries2 for more details.

    RFC 1122 recommends at least 3 retransmissions, which is the
    default.

tcp_retries2 - INTEGER
    This value influences the timeout of an alive TCP connection,
    when RTO retransmissions …
Run Code Online (Sandbox Code Playgroud)

linux network-programming tcp

29
推荐指数
2
解决办法
4万
查看次数

标签 统计

linux ×1

network-programming ×1

tcp ×1