1️⃣ TCP 三次握手(建立连接)
三次握手是 TCP 在客户端与服务器建立可靠连接时的流程:
| 步骤 | 发起方 | 内容 | 说明 |
|---|---|---|---|
| SYN | 客户端 → 服务器 | 发送 SYN 报文,随机序列号 seq = x | 表示客户端希望建立连接 |
| SYN-ACK | 服务器 → 客户端 | 回复 SYN + ACK,seq = y, ack = x+1 | 服务器确认客户端请求,并发送自己的序列号 |
| ACK | 客户端 → 服务器 | ACK,ack = y+1 | 客户端确认服务器序列号,连接建立完成 |
✅ 建立连接后,客户端和服务器都知道对方的初始序列号,从而保证可靠数据传输。
2️⃣ TCP 四次挥手(断开连接)
四次挥手用于正常关闭连接,因为 TCP 是 全双工,两边都要单独关闭发送方向。
| 步骤 | 发起方 | 内容 | 状态说明 |
|---|---|---|---|
| FIN | 客户端 → 服务器 | 发送 FIN,表示客户端没有数据要发 | 进入 FIN_WAIT_1 |
| ACK | 服务器 → 客户端 | ACK = seq+1 | 客户端进入 FIN_WAIT_2,服务器进入 CLOSE_WAIT |
| FIN | 服务器 → 客户端 | 服务器也发送 FIN | 服务器进入 LAST_ACK |
| ACK | 客户端 → 服务器 | ACK = seq+1 | 客户端进入 TIME_WAIT,等待最大报文寿命后关闭;服务器关闭 |
⚠️ 四次挥手比三次握手多一次,是因为关闭连接是单向的,需要双方确认。
3️⃣ TCP 为什么可靠?
TCP 之所以可靠,主要依赖以下机制:
-
序列号(Sequence Number)
- 数据包按序号排序,保证顺序到达。
-
确认应答(ACK)
- 收到数据包后返回 ACK,没有收到则重传。
-
重传机制
- 基于超时和重复 ACK,丢包自动重传。
-
流量控制(Flow Control)
- 使用滑动窗口(Window Size)控制发送速率,避免接收端缓冲区溢出。
-
拥塞控制(Congestion Control)
- 慢启动、拥塞避免、快重传、快恢复等算法防止网络拥堵。
-
校验和(Checksum)
- 检测数据在传输过程中是否被篡改或损坏。
4️⃣ iOS 开发实践角度
- URLSession / NSStream / Network.framework 都基于 TCP 或 QUIC(HTTP/3 使用 UDP)。
- iOS 开发者通常不用自己实现三次握手、重传或拥塞控制,但理解它们对 网络延迟、重试策略、性能优化 非常重要。
- 对于实时通信场景(如 WebRTC 或游戏),可能选择 UDP + 应用层可靠性 来绕过 TCP 的队头阻塞。