UDP 比 TCP 更快吗?

每当有人问 RTP 为什么 over UDP 而不是 TCP,理由总是 TCP 的几大缺陷,我后面再说这些缺陷,在此之前,RTP over UDP 就一定更合适吗?

事实上这不是 over 哪个协议的问题,这是你是否想让 UDP-based 实时应用看见下面传输层的一个设计问题,应用若看到了传输层,UDP 也就不再可以随便丢包不管了,应用程序必须自己处理传输控制,重新实现一个类 TCP 的新协议,或者直接用 TCP 替换 UDP,然后自己只跟 buffer 打交道。

RTP 仅是一个封装,提供时间戳给应用程序用来同步实时数据,它并不含任何如其名字所描述的实时传输控制逻辑,所有的网络度量,时延,抖动反馈,速率控制全要应用自己负责,传输层和网络层不会处理 RTP 的任何细节,甚至看不到 RTP,RTP 只是装在 UDP 这个箱子里的货物。既然能装在 UDP 里,装在 TCP 里就没什么不可以。

网络好,不丢包(or 丢包率极低),用哪个传输协议装 RTP 封装无所谓,只有在网络极端劣化,严重丢包场景,才可看到区别。先看 UDP 做传输控制要面临哪些问题,仍以视频流传输为例:

  • 如果做 UDP 可靠传输,与 TCP 无异,不但自己重新实现一遍丢包检测与重传,仍要面对 buffer 管理问题;
  • 如果无差别柔性丢包,要么 I-帧密集化,要么接受长卡顿,前者数据量增大,潜在加剧拥塞,后者降低体验;
  • 如果请求重传稀疏 I-帧,需要 buffer 容纳至少 RTO 缓冲时间,如何计算时间和管理 buffer 水位也是技术活;
  • 无论如何都要自己实现拥塞控制,而不是肆意污染网络(如果想制造生态的话);
  • ...

这些问题都能解决,这也是大厂小经理每季度甚至每月 KPI,也就有了五花八门的框架和算法,这其中有效的甚少,大量都是灌水。退一步讲,几个月输出一个框架一套算法不现实,也不合理。

几个月做出来的复杂的,技巧性的,未经论证的算法无论如何也比不上稳定运行 40 年的 TCP,仅自己实现的拥塞控制就上不了道,你看,即使 G 家的 BBR 都多少年了,尚未论证和验证完备的稳定性,收敛和公平性,依然未被正式标准化,甚至 bbr3 未合入 Linux 内核。

自研协议需要自行解决所有这些问题,未必有 TCP 做得更好,而这些问题只需要在 buffer + TCP 就全解决了。TCP 接管流媒体传输的最大收益就是简化系统设计,应用与传输解耦,至于 TCP 的问题:

  • 重传引入的不确定延时早已被 TLP/ER,RACK 极大缓解,RTO 二进制退避早已成了兜底策略;
  • TCP 谨慎的拥塞控制以及丢包检测,重传算法已经过 BBR 获得极大改观;
  • TCP 拥有极强的迭代能力...
  • 虽然 TCP 被设计为 C/S 模式,但仅针对建连,一对多的多播分发仍不支持 (╥╯^╰╥)

为什么不再次信任 TCP 呢?具体话题说完了,概括一下。经常有人说 UDP 比 TCP 延时低,比 TCP 更快,于是建议用 UDP,实则没有理解问题本质。

一个 IP 报文从 A 到 B,分别用 UDP 和 TCP 承载同时出发,谁先到?如果报文没丢,就几乎同时到达,如果报文丢了,UDP 延时无穷大,TCP 还有重传机会,延时为 (n - 1) * RTT + 0.5 * RTT。

让问题复杂一点,3 个 IP 报文从 A 到 B,分别用 UDP 和 TCP 承载同时出发,谁先完成?除了上段的描述,还要考虑应用程序是否允许乱序,如果允许乱序但不允许丢包,UDP 平均延时确实比 TCP 小,如果均不允许,UDP 需要把 TCP 照抄一遍,如果允许丢包但不允许乱序,应用程序应自行弥补丢包的负向作用。可什么情况下允许乱序却不允许丢包呢?依然是应用程序说了算。

总之,设计一个完备的 UDP 承载的应用程序,需要做更多工作,几乎不存在发后不管,丢包不重传,乱序不处理的 "尽力而为" 服务,真的 "尽力而为" 服务需要自行处理幂等操作问题,问题并未消失,压力给到了端而已。比如 DNS 服务器没收到请求,或回应丢了,客户端在超时后会重新发送 DNS 请求,时间和 TCP 一致,但要庆幸 DNS 查询是幂等操作。

从某种意义上,比如针对最流行的 HTTP 协议而言,QUIC 可被看作下一代 TCP,而它却被 UDP 承载,这个例子说明用 UDP 实现完整的传输控制并不简单,相比 TCP,QUIC 更复杂了,虽然它确实在某些方面比 TCP 更高效。

和本文前半部分结论一致,这就是说,把事情简单交给 TCP 不失为一种偷懒但有效的方法,而不是抱怨它的延时比 UDP 更高,反之执意使用 UDP,会发现什么问题都绕不过,还要自己做,而且做不好。TCP 作为通用传输协议,足够健壮,AIMD 确保可用性,公平性,向下兼容,几乎所有操作系统,所有浏览器都支持 TCP。

Why Does RTP Use UDP Instead of TCP?TCP 真的不合时宜了吗?读后。

浙江温州皮鞋湿,下雨进水不会胖。

相关推荐
时差freebright2 小时前
【Linux系统】进程间通信:认识命名管道
linux·服务器·网络
earthzhang202111 小时前
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
开发语言·网络·python·https·1024程序员节
程思扬11 小时前
Android笔记:android 动态设置backgroundTint
android·java·网络·笔记·android-studio
lljss202014 小时前
虚拟机里网络设置-桥接与NAT
服务器·网络·智能路由器
pt104314 小时前
BGP分解实验·15——路由阻尼(抑制/衰减)实验
网络·智能路由器
Danileaf_Guo15 小时前
用BGP的路由聚合功能聚合大陆路由,效果显著不?
运维·网络·智能路由器
程序猿000001号15 小时前
网络安全技术简介
网络·安全·web安全
咬光空气17 小时前
Qt 5.14.2 学习记录 —— 이십일 Qt网络和音频
网络·qt·学习
doubt。17 小时前
【BUUCTF】[GXYCTF2019]BabysqliV3.01
网络·安全·web安全·php·代码复审