转自:https://blog.csdn.net/benjiazhen/article/details/53187568
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。
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端。