面试题-计网:四次挥手的过程(含状态转换,报文中的参数)

255 阅读2分钟

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确认报文段后就进入终止等待2状态 FIN-WAIT2,等待TCP服务器发送TCP连接释放报文段
    • 这时候TCP服务器进程发送TCP连接释放报文段,并进入最后确认状态 LAST-ACK。该报文段首部中的终止位FIN=1,确认位ACK=1,表明这是一个TCP连接释放报文段。**同时,这也是对之前收到的报文段的确认。**假定seq=w,不是u+1的原因是:可能在两次挥手后,服务器又发送了一些数据。确认号ack=u+1,这是对第一次挥手的重复确认。
  • 第四次挥手:

    • 客户端接收连接释放报文段后,发送普通的确认保文段,并进入时间等待状态 TIME-WAIT。该报文段的首部确认位ACK=1,表明这是一个普通的TCP确认报文段,序号seq为u+1,是因为第一次挥手消耗了一个序号,确认号ack=w+1,是对第三次挥手的序号的确认。
    • 服务器接收到该报文段进入关闭状态,而客户进程要等2MSL->最长报文段寿命,RFC793文档建议为2分钟,也就是4分钟,才能进入关闭状态。

image-20210331173541393.png