一图胜千言,先上图:
三次握手的过程
- 首先由客户端发起连接请求,客户端将自己的序列号 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 确认包说我知道了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。