TCP的连接释放俗称TCP的四次挥手,即客户端与服务器端之间传输4次报文段。
其具体的释放过程如图:
- 在释放之前,双方都处于连接(ESTABLISHED)状态。若客户端A进程已经没有数据向服务器B进程发送了,并且乡释放连接,则便向B发送连接释放报文段,其中FIN=1,序号seq=u(之前发送数据的最后一个字节的序号为u-1),这个报文表示:我已经没有数据要发送了,我要结束TCP连接了,所以告诉你一声。发送后便进入FIN-WAIT-1状态。
- 当B收到 A的连接释放请求报文段后立即发送确认报文段,此报文段中ACK=1,并将确认号ack=u+1,自己的序号seq=v(最后一个数据的序号+1)。此报文段表示我知道你没有数据要发送了,但我还不确定我有没有数据要发送给你。此时B进入CLOSE-WAIT(关闭等待)状态。此时TCP处于半关闭状态,即A没有数据向B发送了,B有可能向A发送数据。
- 当A收到B发送的确认报文段后,进入FIN-WAIT-2状态。此状态期间可以继续接受B发送来的数据。
- 当B也没有发送的数据后,应用程序便通知B释放TCP连接,此时B向A发送确认连接释放报文段,并FIN=1,ACK=1,确认号ack=u+1,序号seq=w。之后B便进入LAST-ACK状态。
- 当A收到B的确认连接释放报文段后,立即发送一个确认报文段,此时ACK=1,seq=u+1,ack+w+1。进入TIME-WAIT状态,等待2MSL时间,防止自己刚刚发送的确认报文段丢失,在此期间如果没有再收到B发来的报文段,则进入CLOSE状态。
- 当B收到A的确认报文段后也进入CLOSE状态,此时TCP连接才算真正的结束。
总结:
连接释放过程可以想象成两个人马上打完电话时的状态:
A:我没啥事情了,你呢?
B:行,我知道了。我想想我还有啥事。
A:(等待B想事情中...)
B:想起来了!还有一件事....
A:(黑脸中,但还是默默记录下B说的事情)
B:对不住,又忘了一件事....
A:(心想B真是个事儿逼,但没办法,默默地听着)
B:我没啥事了,挂电话吧。
A:好嘞!我马上挂!(心想终于完事了)
B:(自己挂了电话)B掉线了
A:(心想,他不会以为我没挂吧,我先等等,确定一下)
4分钟过去了........
A:(他娘的他还真挂了,我也挂吧)A也掉线了