TCP四次挥手的过程(含状态转换,报文中的参数)
-
第一次挥手:
-
客户端进程向服务器进程发送
TCP连接释放报文段,并进入终止等待1 FIN-WAIT1状态。该报文段首部中的终止位FIN=1,确认位ACK=1,表明这是一个TCP连接释放报文段。**同时,这也是对之前收到的报文段的确认。**序号seq字段的值设置位u,u是TCP客户进程之前最后传送的数据的最后一个字节的序号+1,FIN位1的报文段不带数据也要消耗报文段。确认号ack=v,v表示TCP客户进程之前最后接收到的数据的最后一个字节的序号+1。 -
第二次挥手:
- TCP服务器进程接收到连接释放报文段后,发送一个
普通的TCP确认报文段并进入关闭等待状态 CLOSE-WAIT。该报文段的首部确认位ACK=1,表明这是一个普通的TCP确认报文段,序号seq为v,与第一次挥手的确认号匹配,确认号ack=u+1,是对第一次挥手的序号的确认。
此时,从TCP客户端到服务器端的进程就释放了。这时候TCP客户进程已经没有数据发送了,但是如果服务器还要发数据给客户端,客户进程还要接收。
- TCP服务器进程接收到连接释放报文段后,发送一个
-
第三次挥手:
- TCP客户进程接收到TCP确认报文段后就进入
终止等待2状态 FIN-WAIT2,等待TCP服务器发送TCP连接释放报文段。 - 这时候TCP服务器进程发送
TCP连接释放报文段,并进入最后确认状态 LAST-ACK。该报文段首部中的终止位FIN=1,确认位ACK=1,表明这是一个TCP连接释放报文段。**同时,这也是对之前收到的报文段的确认。**假定seq=w,不是u+1的原因是:可能在两次挥手后,服务器又发送了一些数据。确认号ack=u+1,这是对第一次挥手的重复确认。
- TCP客户进程接收到TCP确认报文段后就进入
-
第四次挥手:
- 客户端接收连接释放报文段后,发送普通的确认保文段,并进入时间等待状态 TIME-WAIT。该报文段的首部
确认位ACK=1,表明这是一个普通的TCP确认报文段,序号seq为u+1,是因为第一次挥手消耗了一个序号,确认号ack=w+1,是对第三次挥手的序号的确认。 - 服务器接收到该报文段进入关闭状态,而客户进程要等
2MSL->最长报文段寿命,RFC793文档建议为2分钟,也就是4分钟,才能进入关闭状态。
- 客户端接收连接释放报文段后,发送普通的确认保文段,并进入时间等待状态 TIME-WAIT。该报文段的首部