MSL全称是Maximum Segment Lifetime,译为“最大报文生存时间”,它是一台机器上TCP协议中的一个指标。从字面上理解,应该是指一个TCP报文段从发送方发出到达接收方(可能是途径的路由器或最终的目的机)所用时间的最大值,如果超过这个时间,接收方应该丢弃该报文。然而,实际TCP协议的实现,却并未拿它用在此处。原因是什么呢?
MSL只是一个本地指标,各个操作系统的MSL可能并不一致,于是造成一个问题,接收方在计算一个报文是否超过MSL时,是用自己的MSL还是用对方的呢?要用对方的,并不知道。要用自己的会怎样呢?就要用自己的MSL与报文经过的时间做对比,那经过的时间怎么计算呢?到达时间接收方自己知道,发出时间呢?依赖TCP头选项中的时间戳选项吗?既然是可选项,就可能不包含,于是根本没办法计算。
所以,TCP使用另一个指标,就是TTL(Time To Live),用于判断一个报文是否超时,TTL是一个TCP头中的字段,是给路由器看的,这点与MSL是不同的,MSL是一个系统本地指标。
那MSL有啥用呢?实际上它只用于当一个TCP连接的一方进入TIME_WAIT状态时。可以认为它有3方面的作用,一是处于TIME_WAIT状态要多长时间,是2倍的MSL。二是处于TIME_WAIT状态时如果收到对方所发的包,会丢弃。三是处于TIME_WAIT状态的连接所用的端口号,在该状态结束前默认是锁定的(可以通过API选项SO_REUSEADDR解锁)。