欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

TCP为什么要3次握手和4次挥手时等待2MSL

程序员文章站 2022-06-22 18:05:42
1.TCP为甚要3次握手? 在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误&rd...

1.TCP为甚要3次握手?

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”,书中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”而是“两次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。说白了主要目的是防止server端一直等待,浪费资源。

2.四次挥手时为什么要等待2MSL?

和TCP三次同步握手不一样的是,TCP关闭连接用四次握手来实现,即A—>B Fin, B—>A ACK, B—>A Fin, A—>B ACK,为什么要这样?

A—>B Fin, B—>A ACK ,A属于主动关闭方,收到B的ACK后,A到B的方向连接关闭,即half shutown ,这时A不能再发送数据了。

这种状态下B还是可以单向发送数据的,B的数据发送完毕,也做关闭动作了:

B—>A Fin, A—>B ACK

B收到ACK,关闭连接。但是A无法知道ACK是否已经到达B,于是开始等待?等待什么呢?假如ACK没有到达B,B会为FIN这个消息超时重传 timeout retransmit ,那如果A等待时间足够,又收到FIN消息,说明ACK没有到达B,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:B的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。

MSL,Maximum Segment Life,这是TCP 对TCP Segment 生存时间的限制。

TTL, Time To Live ,IP对IP Datagram 生存时间的限制,255 秒,所以 MSL一般 = TTL = 255秒

A发出ACK,等待ACK到达对方的超时时间 MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到FIN。

综上所述,等待2MSL的目的是为了A最后发送的ACK能最终到达B端。