tcp_header.jpeg

序号和确认号

SYN、ACK 和 FIN

tcp_sequence.jpeg

三次握手和四次挥手

TCP 需要建立一条可靠的连接,那么对于一条可靠的连接来说,最起码的是发出去的请求能收到对方的确认。所以 Client 发送 SYN 并受到 ACK 后,才能确认连接建立,同样 Server 也需要发送 SYN 并受到 ACK 才能确认建立连接,这样最少需要三次请求,也就是 三次握手

TCP 是全双工模式,也就是双方可以同时发送和接收消息。Client 发送 FIN 并收到 ACK 只是确认了 Client 没有更多数据需要传输,此时 Client 不能关闭连接,因为 Server 可能还会有数据传输过来。而当 Server 发送 FIN 并收到 ACK 后,双方都确认没有更多的消息需要传递,于是关闭连接。这样最少需要 四次挥手

四次挥手之所以比三次握手多一次是因为:

  1. TCP 需要建立连接后才能传输数据,于是乎在建立连接的过程中肯定没有数据报文,可以把 SYNACK 合并为一个报文节省流量
  2. 而断开连接时,Server 回复 ACK 响应 Client 的 FIN 后,Server 依然可以继续发送报文,此时 Client 进入等待状态继续接收 Server 报文直到 Server 发送完毕并发送 FINFINACK 并不能合并为一个报文