为什么要四次挥手?
tcp 协议是一种面向连接,可靠,基于字节流的传输层通信协议。tcp 是全双工模式(同一时刻可以同时发送和接收),这就意味着,当主机1发出 fin 报文段时,只是表示主机1已结没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回 ack报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次tcp连接。
为什么要等待 2msl
msl:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间
原因如下:
保证tcp协议的全双工连接能够可靠关闭
保证这次连接的重复数据从网络中消息
第一点: 如果主机1直接 关闭,由于ip协议的不可靠性或者其他网络原因,导致主机2没有收到主机1最后回复的 ack。那么主机2就会在超时之后继续发送 fin,此时由于主机1已经关闭,就找不到与重发的 fin 对应的连接。所以,主机1 不是直接进入 关闭,而是time_wait 状态。当再次收到 fin 的时候,能够保证对方收到 ack ,最后正确关闭连接。
第二点:如果主机1直接 关闭,然后又再向主机 2 发起一个新连接,我们不能保证这个新连接与刚才关闭的连接端口是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但还是有特殊情况出现;假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中( lost duplicate ),那些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,tcp 协议就认为哪个延迟的数据时属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以tcp连接要在 time_wait 状态等待两倍 msl ,保证本次连接的所有数据都从网络中消失。