TCP中的最大分段生存时间(MSL)是什么?

14
我们有一个自己开发的 XMPP 服务器,我被问到我们服务器的 MSL(最大分段生存时间)是多少。
这意味着什么,我该如何获取它?它是否在 Linux 的 /proc TCP 设置中?
3个回答

12

MSL(最大分段生存时间)是TCP分段在网络中预期存在的最长时间(以秒为单位)。它在TCP连接关闭期间特别重要 - 在CLOSE_WAIT和CLOSED状态之间,机器会等待2个MSL(概念上是互联网往返)以等待任何延迟的数据包。在此期间,机器保留了大部分关闭连接的资源。如果服务器繁忙,则以这种方式保持的资源可能会成为问题。一种“解决方案”是降低MSL,以便更早地释放它们。通常这样做没问题,但有时会导致混乱的故障情况。

在Linux中(至少在我熟悉的RHEL上),“变量”/proc/sys/net/ipv4/tcp_fin_timeout是2 * MSL值。通常为60(秒)。要查看它,请执行:

cat /proc/sys/net/ipv4/tcp_fin_timeout

要更改它,可以像这样做:

echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout

这是一个TCP状态图。你可以在底部找到待定的等待。


TCP State Diagram

2
我认为你的意思是“在TIME_WAIT和CLOSED状态之间”。 - claymation
4
TIME_WAIT 和 CLOSED 之间的延迟时间无法通过 tcp_fin_timeout 进行配置。 - Greg Bray
TCP协议规定,任何数据包在网络中的存活时间都不能超过MSL,但我仍然非常好奇——网络是如何确保数据包的最大生命周期的?据我理解,这需要一个全局同步的时钟,对吗?否则,任何路由器怎么知道它接收到的数据包是否即将死亡,并相应地停止转发呢? - Weipeng
这个答案完全是错的,根据文档,tcp_fin_timeout 是等待最后一个 FIN 数据包的时间,它应该是 FIN_WAIT_2 状态的超时设置。 //// tcp_fin_timeout(整数;默认值:60;自 Linux 2.2 起) 这指定了在套接字强制关闭之前等待最终 FIN 数据包的秒数。这严格违反了 TCP 规范,但是为了防止拒绝服务攻击而必须这样做。在 Linux 2.2 中,默认值为180。 - woosley. xu

10

你也可以使用netstat或ss中的-o选项查看套接字的倒计时计时器,这有助于显示关于等待时间的具体数字。例如,TIME_WAIT不会使用tcp_fin_timeout(它基于TCP_TIMEWAIT_LEN,通常硬编码为60秒)。

cat /proc/sys/net/ipv4/tcp_fin_timeout
3

# See countdown timer for all TIME_WAIT sockets in 192.168.0.0-255
ss --numeric -o state time-wait dst 192.168.0.0/24

NetidRecv-Q  Send-Q    Local Address:Port    Peer Address:Port                             
tcp  0       0         192.168.100.1:57516   192.168.0.10:80    timer:(timewait,55sec,0)   
tcp  0       0         192.168.100.1:57356   192.168.0.10:80    timer:(timewait,25sec,0)   
tcp  0       0         192.168.100.1:57334   192.168.0.10:80    timer:(timewait,22sec,0)   
tcp  0       0         192.168.100.1:57282   192.168.0.10:80    timer:(timewait,12sec,0)   
tcp  0       0         192.168.100.1:57418   192.168.0.10:80    timer:(timewait,38sec,0)   
tcp  0       0         192.168.100.1:57458   192.168.0.10:80    timer:(timewait,46sec,0)   
tcp  0       0         192.168.100.1:57252   192.168.0.10:80    timer:(timewait,7.436ms,0) 
tcp  0       0         192.168.100.1:57244   192.168.0.10:80    timer:(timewait,6.536ms,0)

这应该是被接受的答案。 - Hosi Golden
1
今天对我来说,证实的链接有些悬而未决,但是https://serverfault.com/questions/913526/finding-the-value-of-time-wait给出了可信的引用来源。 - Martin Dorey

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接