Skip to content

三次握手,四次挥手,为什么挥手不能用三次

三次握手

确认双方能够互相通信,确认双方收发能力

  • 客户端发送握手请求 seq = 0
  • 服务器回复 seq = 0; ack = 1 (客户端请求 seq+1)
  • 客户端回复 seq = 1(服务器的 ack) ack = 1(服务器上一个 seq+1);

ack = 上一次 seq + len (数据长度); seq = 上一次 ack

四次挥手

  • 客户端发送请求,我要断开链接 FIN, 发送数据 seq = x+1 ack
  • 服务器回复,确认收到断开请求 ack: x+1+1
  • 服务器发送 FIN, 表示也要断开请求 seq = y+1
  • 客户端回复一个: ack: y+1+1

服务器关闭是一个异步过程,需要先回复收到断开请求,然后等待服务器关闭后,发送断开请求信号 FIN 服务器关闭断开还有一些数据没有发送完

四次挥手最后一次,客户端发送 TIME_WAIT, 为什么等一会 CLOSE

  • 客户端发送: ack 收到断开请求,服务器可能没收到 ack, 若没收到,服务器会再次发送 FIN 断开请求信号,故客户端会等一会 close

三次握手四次挥手带长度

握手

  • client PUSH_ACK 发送 seq = 1 ack = 1 len = 5
  • server ACK 确认 seq = 1; ack = 6 ;
  • server PUSH_ACK 发送 seq = 1; ack = 6 len = 2;
  • client ACK seq = 6; ack = 3

挥手

  • client FIN seq = 6; ack = 3;
  • server ACK seq = 3; ack = 6 + 1;
  • server FIN seq = 3; ack = 6 + 1;
  • client ACK seq = 7; ack = 3 + 1;
  • time_wait
  • close

在 MIT 许可下发布