一次完整请求的图解
TCP之四次挥手
首先明确特点:
-
断开连接Server或者Client都可以断开
四次挥手过程
-
A向B发送连接释放报文段并停止发送数据,此报文段中FIN=;seq=u(等于上次发送数据的最后一个字节加1),此时A进入FIN_WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据也要消耗一个序号。
-
B收到连接释放报文段后就发送确认报文,此时ACK=1;ack=u+1;seq=v;此时B进入close_wait(关闭等待)状态。TCP服务器进程通知应用进程A到B的连接释放了,此时TCP连接处于半关闭状态,B到A的连接并未断开,此时B发送数据A仍要接收。--->B在这时候做的动作是:通知系统关闭进程,A不能向B发送数据,但B可向A发送数据
-
A收到B的确认报文后就处于FIN_WAIT2状态,等待B发送连接释放报文段。
-
如果B没有数据要发送了,就发送连接释放报文段,此时,FIN=1;ACK=1;seq=w;ack=u+1;此时B处于last_ack(最后确认)状态。
-
A收到B的连接请求报文段后就发送确认报文段,此时ACK=1;ack=w+1;seq=u+1;此时A处于time_wait等待状态。
此时TCP连接还未释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的2倍的最长报文寿命MSL(Maximum Segment Lifetime)后A才进入到CLOSED,MSL建议设为2分钟。当A撤销相应的传输控制块TCB后,就结束了这次TCP连接。B收到A的确认报文就进入CLOSED状态,当B撤销相应的传输控制块TCB后,就结束了这次TCP连接。
为什么是四次挥手不是三次:
其实是可以三次挥手的,因为Client端有一个等待时间,超过这个时间未收到可以关闭连接
而Server端有一个保活时间,如果Server端已经发出了确认释放报文段没有收到Client的回复,过了保活时间可以另作处理