Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 什么时候TCP连接被认为是空闲的?_Linux_Sockets_Tcp_Keep Alive_Retransmit Timeout - Fatal编程技术网

Linux 什么时候TCP连接被认为是空闲的?

Linux 什么时候TCP连接被认为是空闲的?,linux,sockets,tcp,keep-alive,retransmit-timeout,Linux,Sockets,Tcp,Keep Alive,Retransmit Timeout,我需要在任何连接上启用TCP keepalive,现在我正在努力处理测试用例的结果。我想这是因为我不太明白第一个keepalive探测是什么时候发送的。我在Linux上的tcp\u keepalive\u time文档中阅读了以下内容: 发送的最后一个数据包(简单ack不被视为数据)和第一个keepalive探测之间的间隔;之后 连接被标记为需要保留,此计数器不被使用 进一步 其他一些来源指出这是连接空闲的时间,但它们没有进一步定义这意味着什么。我还调查了史蒂文斯,以找到更正式的定义,因为我想知

我需要在任何连接上启用TCP keepalive,现在我正在努力处理测试用例的结果。我想这是因为我不太明白第一个keepalive探测是什么时候发送的。我在Linux上的
tcp\u keepalive\u time
文档中阅读了以下内容:

发送的最后一个数据包(简单ack不被视为数据)和第一个keepalive探测之间的间隔;之后 连接被标记为需要保留,此计数器不被使用 进一步

其他一些来源指出这是连接空闲的时间,但它们没有进一步定义这意味着什么。我还调查了史蒂文斯,以找到更正式的定义,因为我想知道在考虑重传时,“发送的最后一个数据包”实际上意味着什么

在我的测试用例中,我有一个连接,其中数据仅以相当高的速率从服务器发送到客户机。为了测试keepalive,我们拔下了客户端NIC上的电缆。我现在可以看到网络堆栈尝试发送数据并进入重新传输状态,但没有发送保持活动的探测。在重传期间不发送保持活动的探测是否正确

我有一个连接,数据只从服务器发送到客户端 以相当高的比率

那你就永远见不到keepalives了。当“电线上没有声音”时,发送Keepalives。有一些关于保留的解释

“保持活动”机制定期探测网络的另一端 连接当连接处于空闲状态时,即使存在 没有要发送的数据

回到你的问题:

一些其他来源指出,这是连接空闲的时间, 但他们没有进一步定义这意味着什么

这是TCP在戳到对等方“hoy!还活着?”之前要等待的时间

换句话说,您一直在使用TCP连接,这非常好。然而,在过去的两个小时里,没有任何东西可以发送。假设连接仍然存在是否合理?假设中间所有的中间框仍然有关于连接的状态是合理的吗?意见不一,保留不属于RFC793的一部分

TCP规范不包含保持活动状态的机制 可能:(1)在瞬态过程中导致完全良好的连接中断 互联网故障;(2) 消耗不必要的带宽(“如果没有人 使用该连接,谁在乎它是否仍然良好?”)


为了测试keepalive,我们拔下了客户端NIC上的电缆

这不是在测试keepalive。这是在测试您的TCPs重传策略,即TCP将尝试让您的消息通过的次数和频率。在Linux机箱上,这(可能)最终会测试:

在终止活动TCP连接之前,可能需要多少次重试。RFC1122 表示限制应大于100秒。它太小了 号码。默认值15对应于13-30分钟,具体取决于RTO

但提供了更多的方式来影响它

TCP用户超时控制传输的数据可以保留多长时间 在强制关闭连接之前未确认

回到问题上来:

在重传期间不发送保持活动的探测是否正确

这是有道理的:TCP已经试图从另一个对等方获取响应,空的keepalive将是多余的


特定于Linux(2.4+)
  • TCP\u keepnt
    在断开连接之前,TCP应发送的最大keepalive探测数

  • TCP_keepile
    如果已在此套接字上设置套接字选项
    SO_keepalive
    ,则在TCP开始发送keepalive探测之前,连接需要保持空闲的时间(以秒为单位)

  • TCP_KEEPINTVL
    各个keepalive探测之间的时间(以秒为单位)

特定于Linux(2.6.37+)
TCP\u用户\u超时
中的最大时间量 传输的数据在之前可能未确认的毫秒数 TCP将强制关闭连接


因此,例如,您的应用程序可以使用此选项来确定在没有连接的情况下连接的生存时间(类似于NIC拔出示例)。例如,如果你有理由相信客户会回来(也许他们关上了笔记本电脑的盖子?有斑点的无线接入?)您可以指定12小时的超时,当他们返回时,连接仍将正常工作。

如果您“以相当高的速率发送”,您的“启用TCP keepalive的要求”一开始就没有意义。@EJP我们有其他连接,例如不发送任何数据,而其他连接仅以较低的速率发送数据。此外,这是客户直接强加给我们的要求。他们在全局范围内使用它。我假设您指的是设置为所有连接都保持可用(默认设置为“关闭”)?如果是这样的话,您只会在之后看到一个keepalive数据包(linux上的默认值为2小时),但是拔出技巧应该会起作用(如果它不发送其他数据)。@rogerdpack是的,作为客户的强制性要求,我们必须在默认情况下启用所有连接上保持活动。发送第一个保持活动的数据包之前的时间还包括TCP重试时间。cnicutar的回答提供了详细信息。仅供参考,Linux 2.4+具有
TCP_KEEPIDLE
TCP_KEEPINTVL
TCP_Keepnt
选项,分别用于设置探测开始前的空闲时间、探测之间的时间间隔和要发送的最大探测数。@RemyLebeau Neat。请随意编辑答案,指出这一点@cnicutar您是否有我可以参考的来源,其中描述了在重新传输期间不发送保留探测?这似乎因系统而异,例如,在Windows上似乎有所不同。@Jens我没有来源。继续发送keepalive探测并不违法,但是
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200