网站制作的常见布局,做问卷赚钱的网站,兰州市做网站的,网上帮做一些小事赚零花钱的网站上一篇博客说了三次握手为什么是是三次#xff08;点这里#xff09;#xff0c;那么现在就介绍一下四次挥手。大家都知道TCP是全双工的#xff0c;再建立连接时的三次握手中的SYN和ACK一起发送#xff0c;这里就会有疑问#xff0c;为什么在四次挥手的时候没有将SYN和AC… 上一篇博客说了三次握手为什么是是三次点这里那么现在就介绍一下四次挥手。大家都知道TCP是全双工的再建立连接时的三次握手中的SYN和ACK一起发送这里就会有疑问为什么在四次挥手的时候没有将SYN和ACK一起发送呢带着这个问题继续向下看答案就在其中。 说到四次挥手顾名思义就是在关闭连接的时候双方一共要操作四次来看一下这四次都是怎么操作的 从图中可以看出来在四次挥手的时候双方一共进入了六种状态这六种状态就是理解四次挥手的关键所在我们来看一下
四次挥手的状态 FIN_WAIT_1:这个状态和FIN_WAIT_2状态都在再等待对方的回复但是这两种状态是有区别的,FIN_WAIT_1就是主动方在ESTABLISHED状态的时候想要主动关闭连接向对方发送FIN报文这时候就进入了FIN_WAIT_1状态。当他收到对方回复的ACK报文后就进入了FIN_WAIT_2状态。 但是在实际操作中是很难遇到FIN_WAIT_1状态的因为无论对方是什么情况都应该立刻回应ACK报文但是FIN_WAIT_2状态还是可以在主动方中用netstat看到的。 FIN_WAIT_2上面已经对FIN_WAIT_2讲解过了当主动方进入FIN_WAIT_2时就表示着半连接状态也就是主动方还有数据要发给对方这个数据就是之后的ACK所有他要等一会儿才关闭连接。 CLOSE_WAIT这个状态从表面也可以看出它的作用就是等待关闭。当被动方接收到FIN时会立刻回复一个ACK给对方接下来就是进入CLOSE_WAIT状态。在这个状态中被动方需要考虑自己还有没有数据要发送给对方如果有可以继续发送如果没有了就可以关闭连接了发送一个FIN给对方。 这个状态其实也就是给自己一个缓冲的时间让自己处理完需要处理的事然后去关闭连接。 TIME_WAIT这个状态就是一段时间后进行一些操作。当主动方收到了对方发来的FIN报文并发出ACK报文接下来就等2MSL就可以进入CLOSED状态了。其实如果主动方在FIN_WAIT_1状态下收到了对方的FINACK标志的报文就可以跳过FIN_WAIT_2状态直接进入TIME_WAIT状态了。 LAST_ACK这个状态从表面不难不理解他的意思这个状态就是被动方发送了FIN报文后最后等待对方的ACK报文收到ACK报文后就可以进入CLOSED状态了。 CLOSED上面提到了几次这个状态相比也猜出来了这个状态表示的就是连接中断已经关闭。 在上面的TIME_WAIT状态中有提到过2MSL那么什么是2MSL呢那么来详细说一下TIME_WAIT状态和里面的2MSL。
为什么需要TIME_WAIT? TIME_WAIT在四次挥手中有着不可替代的位置如果没有TIME-WAIT主动方就会直接进入CLOSED状态假设主动方时客户端被动方时服务端这时候如果立即重启客户端使用相同的端口如果因为网络中种种原因最后一次ACK丢失了服务端就会重复FIN请求这时这个FIN就会被重新启动的客户端接收到或者新启动的客户端向服务端发起请求的时候因为服务端正在等待最后一次ACK因此新连接请求发送的SYN就会被服务端认为时请求码错误服务端就会回复RET重置连接。所以就需要主动方发送最后一次ACK之后进入TIME_WAIT状态等待2MSL两个报文最大生命周期等待这段时间就是为了如果接收到了重发的FIN请求能够进行最后一次ACK回复让在网络中延迟的FIN/ACK数据都消失在网络中不会对后续连接造成影响
那么为什么TIME_WAIT的时间是2MSL呢 MSL是TCP报文的最大生命周期因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失否则服务器立即重启可能会收到来自上一个进程迟到的数据但是这种数据很可能是错误的同时也是在理论上保证最后一个报文可靠到达假设最后一个ACK丢失那么服务器会再重发一个FIN这是虽然客户端的进程不在了但是TCP连接还在仍然可以重发LAST_ACK。