三次握手,四次挥手,为什么挥手不能用三次
三次握手
确认双方能够互相通信,确认双方收发能力
- 客户端发送握手请求 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