一图胜千言,先上图:

image.png

三次握手的过程

  • 首先由客户端发起连接请求,客户端将自己的序列号 seq 设为 x 并发送 SYN 包给服务端,客户端进入 SYN_SENT 状态。
  • 服务端在接收到客户端发来的 SYN 包之后,由 LISTEN 状态转为 SYN_RCVD 状态,服务端将 ack 设为 x+1 (收到的序列号+1) 同时将自己的 seq 设为 y ,并将 SYN-ACK 确认包发送给客户端。
  • 客户端收到服务端的确认之后,将 ack 设为 y+1 (收到的序列号+1) 并发送 ACK 确认包给服务端,客户端进入 ESTABLISHED 状态。
  • 服务端收到客户端发来的确认包之后,也进入 ESTABLISHED 状态。

TCP 进行握手初始化一个连接的目标是:分配资源初始化序列号(通知 peer 对端我的初始序列号是多少)。整个握手过程可以简化为下面的交互:

1)client 端首先发送一个 SYN 包告诉 Server 端我的初始序列号是 X;2)Server 端收到 SYN 包后回复给 client 一个 ACK 确认包,告诉 client 说我收到了;3)接着 Server 端也需要告诉 client 端自己的初始序列号,于是 Server 也发送一个 SYN 包告诉 client 我的初始序列号是 Y;4)Client 收到后,回复 Server 一个 ACK 确认包说我知道了。

注意几个问题:
1. Server 的 ACK 确认包和接下来的 SYN 包可以合成一个 SYN ACK 包一起发送的,没必要分别单独发送,这样省了一次交互
2. 大部分情况下建立连接需要三次握手,也不一定都是三次。有可能出现四次握手来建立连接的。如下图,当 Peer 两端同时发起 SYN 来建立连接的时候,就出现了四次握手来建立连接。

image.png

四次挥手

TCP 进行断开连接的目标是:回收资源终止数据传输。由于 TCP 是全双工的,需要 Peer 两端分别各自拆除自己通向 Peer 对端的方向的通信信道。这样需要四次挥手来分别拆除通信信道:

1)Client 发送一个 FIN 包来告诉 Server 我已经没数据需要发给 Server 了;2)Server 收到后回复一个 ACK 确认包说我知道了;3)然后 server 在自己也没数据发送给 client 后,Server 也发送一个 FIN 包给 Client 告诉 Client 我也已经没数据发给 client 了;4)Client 收到后,就会回复一个 ACK 确认包说我知道了。

参考:
万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起


一杯绿茶
199 声望17 粉丝

人在一起就是过节,心在一起就是团圆


引用和评论

0 条评论