在 iOS 开发中,选择 TCP 还是 UDP 往往决定了你 App 的“性格”:是追求绝对可靠,还是追求极致实时。
1. TCP vs UDP:核心区别
我们可以把 TCP 比作打挂号信(必须确认收点),而把 UDP 比作直播喊话(只管发,听没听到看缘分)。
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
|---|---|---|
| 连接状态 | 面向连接(需三次握手) | 无连接(直接发送) |
| 可靠性 | 极高(确认应答、重传、排序) | 不可靠(可能丢包、乱序) |
| 传输效率 | 较慢(头部 20 字节,有拥塞控制) | 极快(头部 8 字节,尽力而为) |
| 通信形式 | 点对点(一对一) | 一对一、一对多、多对多(广播/组播) |
| 数据流 | 字节流(无边界,需处理粘包) | 数据报(有边界,不合并包) |
2. 为什么 TCP 更慢但更稳?
TCP 拥有复杂的拥塞控制(Congestion Control)机制。当网络拥堵时,TCP 会主动降速以保证成功率。此外,如果中间丢了一个包,TCP 会停下来等待该包重传,这被称为队头阻塞(Head-of-Line Blocking) 。
UDP 则像是一个“甩手掌柜”,它不保证数据一定到达,也不保证顺序。但正是这种“不管不顾”,让它在网络抖动时依然能保持较低的延迟。
3. 在 iOS 中何时选择 UDP?
虽然 iOS 开发中 90% 的场景(API 请求、图片下载、网页浏览)都使用基于 TCP 的 HTTP/HTTPS,但在以下特定场景中,UDP 是唯一选择:
A. 音视频通话 (VoIP) & 直播
- 场景:FaceTime、微信视频、Zoom。
- 理由:实时性高于完整性。如果视频通话中丢了一帧数据,画面闪一下即可,但如果为了等这一帧而导致后续画面卡顿 2 秒,通话就无法进行了。
B. 实时竞技游戏
- 场景:王者荣耀、和平精英。
- 理由:玩家的位置同步需要极低的延迟。UDP 配合应用层自定义的可靠协议(如 KCP),可以在丢包时快速恢复,而不是像 TCP 那样死等。
C. 设备发现与局域网广播
- 场景:查找局域网内的打印机、智能家居配网。
- 理由:UDP 支持广播(Broadcast)和组播(Multicast) 。TCP 必须知道确切 IP 才能连接,而 UDP 可以向全网段喊话:“谁是打印机?”。
D. 现代网络协议(QUIC/HTTP3)
- 背景:Google 推出的 QUIC 协议底层运行在 UDP 之上,但在应用层实现了可靠性。
- 理由:它规避了 TCP 的队头阻塞问题。在 iOS 的
URLSession中,如果服务器支持,系统会自动尝试使用这种基于 UDP 的高效连接。
4. iOS 开发工具建议
如果你需要在 iOS 中直接操作 TCP/UDP:
-
Network.framework:Apple 官方推荐的现代框架(替代了陈旧的 BSD Sockets),对 Swift 支持极佳。
Swift
// 创建一个 UDP 连接 let connection = NWConnection(host: "192.168.1.1", port: 8080, using: .udp) -
CocoaAsyncSocket:老牌且强大的第三方库,如果你的项目需要兼容非常旧的系统或特定的 Socket 逻辑。