计算机网络-TCP3次握手4次挥手

为什么TCP建立连接是3次握手,断开连接却需要4次挥手?

1.1 建立连接

计算机网络-TCP3次握手4次挥手

  1. 客户端第一次发送SYN同步报文、客户端序号seq=x给服务端,申请建立连接,此时客户端进入SYN_SENT状态
  2. 服务端收到SYN同步报文后,响应确认SYN同步报文、ACK确认报文、服务端序号seq=y、确认序号为对方序号ack=x+1给客户端,此时服务端进入SYN_RECV状态
  3. 服务端收到SYN同步报文后,响应ACK确认报文、客户端序号seq=x+1、确认序号为对方序号ack=y+1给客户端,此时服务端进入SYN_RECV状态服务端收到SYN同步报文后,响应确认SYN报文以及ACK报文给客户端,此时服务端进入SYN_RECV状态

    客户端收到ACK响应报文后,发送ACK报文至服务端,此时客户端进入ESTAB-LISHED状态

1.2 至此建立连接完成,为什么需要第三次握手?

  1. 如果第一次建立连接请求发送后,由于某些网络节点阻塞,客户端超时后重试再次发送请求连接,待第一次的阻塞恢复后,服务端总共收到两次请求连接的报文,均给确认回复后,建立两个连接造成资源的浪费。如果有了第三次确认就不会出现此类情况,因为第一次发送的请求连接报文因为延迟,导致客户端延迟收到服务端确认响应后,但是客户端发现自己没有新建连接的请求,不确认给服务端,便只会保留一个正常的连接,不会出现资源浪费

2.1 断开连接

计算机网络-TCP3次握手4次挥手

  1. 客户端发送FIN结束报文、客户端序号seq=u,此时客户端进入FIN-WAIT-1状态
  2. 服务端响应ACK确认报文、服务端序号seq=v、确认序号为对方序号ack=u+1,此时服务端进入CLOSE-WAIT状态
  3. 客户端收到ACK确认报文、服务端序号seq=v、确认序号ack=u+1,此时客户端进入FIN-WAIT-2状态
  4. 至此客户端不再向服务端写入数据,但是仍然可以接收数据
  5. 服务端完成数据写入后,向客户端发送FIN结束报文、ACK确认报文、服务端序号seq=w,确认序号为对方序号ack=u+1,此时服务端进入LAST-ACK状态
  6. 客户端收到服务端的结束报文后发送ACK确认报文、客户端序号seq=u+1、确认序号ack=w+1,此时客户端进入TIME-WAIT状态,2MSL后进入CLOSED状态

2.2 断开连接为什么需要4次挥手?

  1. 因为TCP为全双工通信,客户端发送FIN结束报文后,保证了客户端不会再想服务端写入数据,但是仍然可以继续接受服务端的数据,在服务端发送结束报文后,保证了服务端不会再想客户端写入数据,至此,客户端既不会写入数据到服务端,也不会再收到服务端的数据,连接正常结束
  2. 原因很明显就是服务端收到客户端结束报文后,有可能还会想客户端写入数据,所以先响应客户端我已收到结束报文,在服务端写入数据需求完成后,再次发送FIN结束报文,关闭双工的第二个信道,至此双工的读写信道均完成关闭