居然很少有人质疑: 2MSL的TIME_WAIT时间真的足够保证旧连接上的所有包都消失吗?

来源:互联网 发布:学了Java再学什么 编辑:程序博客网 时间:2024/05/17 11:32

        看了不少TIME_WAIT方面的书籍和网络文章, 很多地方不过是在人云亦云的拷贝别人的说法和思想而已, 看得让人颇为无趣。

        对于TIME_WAIT, 言必称2MSL, 当然, 如果是笔试面试, 我也会这么答, 因为这就是所谓的标准答案啊。 然而, 2MSL的TIME_WAIT时间真的足够保证旧连接上的所有包都消失吗? 我最近一直在思考这个问题。 从理论上来讲, 这是扯淡。

        如果tcp四次挥手最后的ACK有好几次没有达到, 那么对端会重传FIN包, FIN包过来, 加上最后的新ACK, 要保证他们消失, 岂是2MSL时间能做到的? 别忘了, 从TIME_WAIT的起点到最后的新ACK的达到, 经历的理论时间为:  Tx(刚进入CLOSE_WAIT状态到对端发最后FIN的时间差) + MSL(最后FIN包传输对应的MSL) +  MSL(最后的新ACK传输对应的MSL)

        显然, TIME_WAIT的理论时间, 可以比2MSL还大。

        大家不要再以讹传讹了。


        当然, 到处在说2MSL, 说明这个东西并非没有道理, 其实, 2MSL只是一个经验值, 而非理论值。 在RFC中, 2MSL的值被建议为4分钟, 而在很多实现中, 2MSL的值被实现为1分钟。 所以, 你看, 2MSL这个东西, 是根据经验和系统环境而定的。 把TIME_WAIT定义为2MSL -1秒, 系统会异常吗? 不会, 几乎没什么影响的!

        2MSL能尽力而为地期望(而非百分之百地保证), 旧连接上的所有数据包都消失。 其实, 在实际中, 这个时间足够了, 已经是仁至义尽了。


        为了不至于误会(不是随大流), 以后在谈论TIME_WAIT的时候, 我让人会用2MSL来说话。