题记
前面理解了TCP的三次握手(建立连接的方式),释放连接的方式就是四次挥手了。
为什么要四次挥手呢?
白话版(解释):
第一步:A向B说,我不会再见你了。
第二步:B向A说,哦!我知道了。(但是此时只是A不想见B了,B还能找A啊!!!)
第三步:B也向A说,我也不会想见到你了。
第四步:A说:哦!!!
PS:(从此两人不再相见)
理解版(解释):
因为TCP是属于全双工的连接,所以在A发送请求并释放自己的连接的时候,B需要确认,但是B只是确认了不收A的消息,而A依然能够收到B的消息。但是B在释放自己的连接之后A也需要向A发送自己需要释放资源的报文段,A收到了也需要回应,所以需要4次。
需要了解的概念(重要):
终止比特FIN:释放一个连接。当FIN=1时,表明报文段的发送端的数据已发送完毕,并要求释放传输连接。
确认比特(ACK):只有当ACK=1时,确认号字段才有效,当ACK设置为0的时候,确认号无效,建立起链接之后,所有传送的报文段都必须把ACK设置为1。
TCP四次挥手的过程
第一步:数据传输结束之后,通信的双方都能够释放连接。例如A向B服务器发送一个释放报文段,并且A自己停止发送数据,主动关闭TCP连接。A将释放连接的报文段首部的FIN设置为1,序列号seq=u,等待B确认该条报文段。此时需要注意,由于TCP是全双工的,A停止发送数据,但是B还能够发送数据。
第二步:此时B需要发送确认消息,确认好ack=u+1(即A发送的序列号+1),报文自己的序列号就假定为seq=v,然后B的TCP通知高层应用进程。在第二次的时候由A到B这个方向的连接就释放了。但连接仍然是处于半开放状态,即B发送消息,A还是能够接收。
第三步:前面第二步已经知道,现在B发送消息A还是能够接收的。此时如果B已经没有需要向A发送数据了,其应用进程就通知TCP释放连接。
第四步:A收到连接释放的报文段的时候,必须发出确认,在确认报文段中。因为是确认的报文段,所以ACK=1,确认号为ack=w+1,自己的序号为seq=u+1。
经过了四个完整的步骤之后TCP连接才算是真正的释放。
图片过程方式解释过程
第一步:
第二步:
第三步:
第四步: