乐趣区

关于tcp-ip:TCP的三次握手和四次挥手

一图胜千言,先上图:

三次握手的过程

  • 首先由客户端发动连贯申请,客户端将本人的序列号 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 来建设连贯的时候,就呈现了四次握手来建设连贯。

四次挥手

TCP 进行断开连接的指标是:回收资源 终止数据传输。因为 TCP 是全双工的,须要 Peer 两端别离各自拆除本人通向 Peer 对端的方向的通信信道。这样须要四次挥手来别离拆除通信信道:

1)Client 发送一个 FIN 包来通知 Server 我曾经没数据须要发给 Server 了;2)Server 收到后回复一个 ACK 确认包说我晓得了;3)而后 server 在本人也没数据发送给 client 后,Server 也发送一个 FIN 包给 Client 通知 Client 我也曾经没数据发给 client 了;4)Client 收到后,就会回复一个 ACK 确认包说我晓得了。

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

退出移动版