TCP 和 UDP 到底差在哪

前阵子刚捋完 TCP 握手挥手,突然想起它旁边还站着个 UDP。一个可靠但啰嗦,一个简单但不管送达。这篇把 TCP 和 UDP 掰开对比:连接、可靠性、顺序、速度各差在哪,再说清楚什么场景该用哪个,别再一律无脑上 TCP。

前阵子写了篇 TCP 三次握手四次挥手(/post/136.html),捋完之后脑子里突然蹦出个问题:跟 TCP 同一层的还有个 UDP,这俩到底差在哪?

很多人只记得“TCP 可靠、UDP 不可靠”,然后就没了。可靠不可靠具体指啥?为啥不可靠还有人用?

这篇我们把 TCP 和 UDP 摆一块儿,一条条对比清楚。

先给俩快递公司画个像

直接讲协议容易干,我们拿寄快递打个比方。

TCP 像一家较真的快递公司:

  • 寄之前先给你打电话确认地址(建立连接)
  • 每送到一件都要你签收(确认回执)
  • 没签收的会一直重寄(丢包重传)
  • 保证按你寄的顺序一件件送到

UDP 像一个图省事的传单派发员:

  • 不打招呼,抓起来就往你门口塞
  • 塞完就走,不管你收没收到
  • 丢了?丢了就丢了,不补
  • 谁先到谁后到,随缘

这俩画像立住了,下面的区别就都是从这里长出来的。

区别一 要不要先建连接

TCP 是面向连接的。

传数据之前,必须先通过三次握手把连接建起来,传完还要四次挥手把连接关掉。就像打电话,得先拨通、确认对方在,才能开聊。

UDP 是无连接的。

它不握手、不挥手,抓起数据就发,根本不管对面在不在、准备好没有。像是往对方信箱里塞张纸条,塞完就走。

这一条是所有差异的根,TCP 的“可靠”都是靠这条连接换来的,UDP 的“快”也是省掉这条连接省出来的。

区别二 保不保证送到

这就是大家常说的“可靠”到底指啥。

TCP 保证数据一定送达。

每发一段数据,接收方都要回个确认。发送方没收到确认,就认为丢了,会重发,直到确认为止。所以正常情况下,TCP 传的东西不会缺胳膊少腿。

UDP 不保证送达。

发出去就完事了,丢没丢它不管,也不重发。网络一抖,包丢了就是丢了。

所以“可靠”这个词,说白了就是丢了会不会帮你补。TCP 补,UDP 不补。

区别三 顺序乱不乱

数据在网络里是拆成一个个小包走的,走的路可能不一样,到达顺序未必跟发出顺序一致。

TCP 会帮你排好序。

每个包都带编号,接收方按编号重新拼回原来的顺序再交给你。你收到的,永远是发送方发出时的那个顺序。

UDP 不管顺序。

先到的先给你,后到的后给你,顺序乱了它也不负责整理。

区别四 快慢差多少

聊到这儿就好理解为啥 UDP 还有人用了。

TCP 又是握手、又是确认、又是重传、又是排序,这一堆机制都是开销。可靠是可靠,但慢,也占资源。

UDP 把这些全省了,头部信息也少得多,所以它又快又轻。

打个比方:TCP 是全程有回执、有跟踪的挂号信,稳当但慢;UDP 是随手一扔的普通传单,快是快,丢了活该。

速度和可靠,这里有个天然的取舍,鱼和熊掌。

一张表对齐区别

零散讲完了,拉个表对齐着看一眼更清楚:

对比项        TCP                 UDP
--------      ----------------    ----------------
连接          面向连接(要握手)     无连接(直接发)
可靠性        保证送达,丢了重传    不保证,丢了不管
顺序          保证按序到达         不保证顺序
速度          较慢,开销大          快,开销小
头部          较大                 很小
场景          要求完整准确的传输    要求快、能容忍丢一点
​

那什么时候用哪个

光记区别没用,落到场景才算真会。

要求数据完整、准确、不能出错的,用 TCP。

  • 网页浏览、接口请求(HTTP 就是基于 TCP 的)
  • 文件传输、下载(少一个字节文件就废了)
  • 发消息、发邮件(丢一句话可不行)

这些场景,宁可慢一点,也不能错、不能丢。

要求快、又能容忍偶尔丢一点的,用 UDP。

  • 视频直播、语音通话(丢一两帧画面顶多花屏一下,但绝不能卡着等重传)
  • 在线游戏(要的是实时,晚到的旧数据等于没用,重传反而添乱)
  • DNS 查询(一问一答,快最重要,丢了再问一次就是)

看出规律了吗?

  • 数据比时间重要 → TCP:错了不行,慢点没关系
  • 时间比数据重要 → UDP:快最关键,丢一点能忍

直播里丢一帧画面你没感觉,但要是为了这一帧卡住等重传,那才是灾难。这时候 UDP 那个“丢了就丢了”反而是优点。

小结

绕回最开始那句“TCP 可靠、UDP 不可靠”,现在应该能说清背后是啥了。

  • 连接:TCP 要握手建连,UDP 抓起来就发
  • 可靠:TCP 丢了会重传,UDP 丢了不管
  • 顺序:TCP 保证按序,UDP 不管
  • 速度:TCP 慢但稳,UDP 快但糙

选择就一句话:数据比时间重要选 TCP,时间比数据重要选 UDP。

UDP 不是“差”,它是把可靠性换成了速度,专门服务那些等不起的场景。

搞清楚这个取舍,就不会再无脑一律上 TCP 了。那就按场景挑着用吧。

更多推荐

章节目录