我们有一个自己开发的 XMPP 服务器,我被问到我们服务器的 MSL(最大分段生存时间)是多少。
这意味着什么,我该如何获取它?它是否在 Linux 的
这意味着什么,我该如何获取它?它是否在 Linux 的
/proc
TCP 设置中?/proc
TCP 设置中?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状态图。你可以在底部找到待定的等待。
你也可以使用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)
这看起来可以回答你的问题:
http://seer.support.veritas.com/docs/264886.htm
我建议你询问为什么有人会问你这个问题,并了解它如何适用于XMPP。
TCP/IP Illustrated卷1在线上提供了更详细的2MSL描述:这里