TCP四次挥手
关于TCP三次握手以及为什么要握三次的原因可以看我的另外一篇博客《TCP三次握手》
第一次挥手:
在完成数据传输后客户端和服务端都可以发起关闭连接请求,假设是客户端发起到的。客户端给服务端发送了一个FIN包表示要关闭连接,客户端自己进入终止等待1状态。因为客户端就好比谈恋爱要分手总得要告知下对方,看下对方什么反应吧。
第二次挥手
服务端接收到后,给客户端发送一个ACK包,表示我知道了,我这还要进行一些收尾工作,发一些还没发完的数据,你给我等着。于是服务端进入了关闭等待状态,此时它还可以发表临终遗言,还可以发数据,客户端还可以接收数据,听听看服务端还有啥说的没有,就进入终止等待2状态。
第三次挥手,
服务端数据处理完后,就可以给客户端发送一个FIN包,告知客户端我这没啥说的了。
第四次挥手
客户端收到FIN包后,给服务端发送一个ACK包,确认一下我知道这边关好了,服务端收到ACK包后立刻关闭连接,客户端则进入超时等待状态,过了超时时间后客户端就关闭连接。
问题少年:为什么要客户端最后要进行超时等待?
答:因为如果客户端一发送ACK后立马关闭连接,那如果就这么不巧,服务端就是没收到这个ACK包,那么服务端将一直苦苦地等待,一直狂call客服端,你那边关了没有啊?咋不理我啊?而此时客户端早已跑路。如果客户端有等一下,在这超时时间内,服务端如果没收到ACK包,就可以回到第三步重发FIN包,客户端则会响应这个FIN包。
问题少年:简单点说TCP四次挥手
答:
房东:今天退租是吗?
租客:是的,我收拾一下东西。
租客:我收拾好了。
房东:好,那咱们就退租了。