15-4.【HTTP】TCP 与 UDP 的区别?在 iOS 中何时选择 UDP?

2 阅读3分钟

在 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:

  1. Network.framework:Apple 官方推荐的现代框架(替代了陈旧的 BSD Sockets),对 Swift 支持极佳。

    Swift

    // 创建一个 UDP 连接
    let connection = NWConnection(host: "192.168.1.1", port: 8080, using: .udp)
    
  2. CocoaAsyncSocket:老牌且强大的第三方库,如果你的项目需要兼容非常旧的系统或特定的 Socket 逻辑。