浅谈传输层协定(三):牺牲可靠性换取速度的 UDP

前面两天从 TCP 在做什麽开始聊起,今天来看看另外一个也很重要的协定 UDP。

UDP 为 User Datagram Protocol 的缩写,中文翻译成使用者资料报协定。和 TCP 同属传输层,做的事情其实也是类似的,但 UDP 不保证「可靠性」,那麽你可能会有疑问了,既生瑜何生亮,有了 TCP 为何还要 UDP 呢?

我们先从两者的差异聊起。

UDP vs. TCP

UDP 和 TCP 两者都有的,就是 Port 连接埠的概念,我们在上一篇TCP 有多可靠中所提到过「两个设备间的连线可能不只一个,就会需要编号来分开不同的连线」,就是 UDP 和 TCP 共用的概念。

UDP Connection
*UDP Connection

但除此之外,UDP 就像是阉割版的 TCP,其它功能几乎都没有。

你说 UDP 也有 TCP Checksum 一样的 Checksum 呀?同样也可以检查是否有可能的资料损坏吧?

这样说没错,但是大部分使用 UDP 这个协定来传输资料的,对於资料的正确性通常不会那麽在乎,有的应用会利用 Checksum 的特性意思意思检查一下损坏,但也有不少应用乾脆就「忽略」这块,在 UDP 官方定义中,是可选择忽略的(但建立在 IPv6 上的 UDP 还是必选题)。

其余的壅塞、流量控制啦,UDP 就通通都不管了,它就是打算以最直接的方式把资料送过去,至於对方有没有收到就没它的事了,真是个任性的协定。

UDP 的主要应用

那麽,这样牺牲可靠性的 UDP 求的是什麽呢?当然就是即时性了。

大部分建立在 UDP 上的应用都分秒必争。例如串流影音,每秒 30 个影格的影片,掉了几格一般人根本看不太出来,若是想每格都呈现出来而改用 TCP 的话,造成的後果可能是影片的 lag,为了等没收到影格重新传过来,导致後面的影格无法顺畅的播出,绝对不会是观影者希望的事。更何况是一些直播影片了,隔壁都在欢呼了只有你的萤幕画面还在转阿转。

除了串流影音之外,前面文章常见网路问题:DNS 提到应用层的 DNS,也是基於 UDP 的一种协定,但比较特殊的是现在 DNS 的实做几乎都同时使用 UDP 和 TCP,刚开始预设用 UDP 快速从网域名称获取 IP 位置,但发现不够稳定时,就切成 TCP 传输资料。

小结

TCP 和 UDP 的作用,都是基於 IP 上的两个 IP 位置之间交换资料,由於 Port 连接埠的概念提出,不同的服务就可以用不同的 Port 来建立连线,如 DNS 用 Port 53、HTTP 用 Port 80 等等,两个 IP 位置间可以根据 Port 来建立多个连线。

而应用程序采用两个协定中的哪个,就要看应用的类型了,如果追求可靠性,不希望掉封包的话当然就选择 TCP;追求即时性的话就牺牲一点可靠性采取 UDP。但凡事也没有绝对,像是 DNS 一样,也可以在不同情境下选择使用 TCP 或 UDP。

传输层就浅谈到此罗,接着我们聊聊应用层的一些常用协定。

参考资料

  1. Wiki - UDP
  2. StackExchange - When do DNS queries use TCP instead of UDP?

<<:  Day.22 「让我们在更深入函式~」 —— JavaScript call & apply & arguments

>>:  Day24-"取址运算子、提令运算子"

自我背景介绍

大家好..小弟在下我是机械系背景的..... 因为对机械系没有太大的兴趣...所以就半路转换跑道了 ...

Day 20 Flask Session

上一篇讲完了 Cookie,那 Session 又是什麽? Session Session 就像是麦...

老大哥在看着你 - 事件与事件监听

在JS的世界里到处是物件,在浏览器的世界里到处是事件。 事件驱动 根据JavaScript大全,客户...

Day7 Html常用标签_2

那就废话不多说,让我们继续接下去介绍其他的标签吧! 有序清单ol <body> <...

Proxmox VE 设定客体机高可用性

在 Proxmox VE 建立好丛集後,已经可以使用迁移、复写等等的功能以提升客体机的不停机服务时...