为什么新开发的可靠传输协议都是基于UDP协议?

简介:

我有一次发了一个贴,介绍镭速传输协议是基于UDP的可靠传输协议,很多人在跟帖里面质疑我说,“UDP是不可靠的,你在这里胡说八道”。

今天,在这里介绍一下为什么很多新的传输协议都是基于UDP协议的,它的技术原因在哪里?下面这个图,是大学里面计算机网络必教的内容,OSI的7层模型和TCP/IP协议栈的5层模型。其中传输层的主要代表协议为TCP协议和UDP协议。

OSI-TCPIP.png

新开发的一些传输协议,比如google的QUIC、aspera的FASP、开源的UDT,为什么都是基于UDP的呢?甚至于IETF在2000年新制定的SCTP协议标准,放到互联网来运行时,都特意增加一个UDP的封包协议,见IETF RFC UDP Encapsulation of SCTP Packets for End-Host to End-Host Communication

有人说,因为UDP发包快,这些协议为了跑快一点,所以用UDP协议。有人说,UDP可以广播,所以用UDP协议。

众说纷纭,到底为什么这些协议到了我们现实使用的Internet上时,都是使用UDP协议。揭晓答案,因为现实Internet环境中,有大量的NAT网络设备,为了适应兼容这些已经在网络中到处运行NAT网络设备,新的协议必须使用UDP协议来作为承载层。

首先介绍NAT,NAT是Network Address Translation的缩写,翻译成中文是“网络地址转换”或者“网络地址翻译”

维基中文:https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2

维基英文:https://en.wikipedia.org/wiki/Network_address_translation

1990年代中期,NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。网络地址转换在很多国家有广泛的使用。所以NAT就成了家庭和小型办公室网络连接上的路由器的一个标准特征,因为对他们来说,申请独立的IP地址的代价要高于所带来的效益。
在一个典型的配置中,一个本地网络使用一个专有网络的指定子网(比如192.168.x.x或10.x.x.x)和连在这个网络上的一个路由器。这个路由器占有这个网络地址空间的一个专有地址(比如192.168.0.1),同时它还通过一个或多个因特网服务提供商提供的公有的IP地址(叫做“过载”NAT)连接到因特网上。当信息由本地网络向因特网传递时,源地址从专有地址转换为公用地址。由路由器跟踪每个连接上的基本数据,主要是目的地址和端口。当有回复返回路由器时,它通过输出阶段记录的连接跟踪数据来决定该转发给内部网的哪个主机;如果有多个公用地址可用,当数据包返回时,TCP或UDP客户机的端口号可以用来分解数据包。对于因特网上的通信,路由器本身充源和目的。
流行在网络上的一种看法认为,IPv6的广泛采用将使得NAT不再需要,因为NAT只是一个处理IPv4的地址空间不足的方法。

大家都见过和用过NAT盒子,每个人家里的上网拨号路由器就是一个典型的NAT网络设备,这个设备除了用来上网以外,完成了你的内网电脑的IP地址(比如192.168.0.x)转换为一个IPv4公网地址。

那这个NAT设备与传输协议有什么关系呢?我们来看一下IP报文的头部,

ip报文头.png

其中的8位协议字段,是用来表示IP报文承载的上层传输协议类型,当IP报文里面的内容是TCP报文时,这个值为6,当IP报文里面的内容是UDP报文时,这个值为17,当IP报文里面的内容是SCTP报文时,这个值为132。这个8bit的字段,用满的话理论上可以支持255种协议。

前面说了,NAT网络设备是用来完成网络地址转换工作的,因此NAT设备必须要能够认识并理解对应的协议,不幸的是,大部分普通NAT设备只认识TCP和UDP这两种传输协议,就连IETF RFC标准规定好的SCTP传输协议,普通的NAT设备都不认识。不认识就意味着,当你使用SCTP协议从一个内网向公网发送报文时,你的SCTP报文会被你的NAT网络设备丢弃,连接无法建立,通信无法进行。

但是聪明的计算机从业者很快发现,UDP和IP层并无本质区别,都是提供包发送服务,既然在IP层上面去定义自己的新协议有NAT网络设备的兼容问题,那我在UDP报文之上去做就好了,所有的NAT网络设备都必然支持UDP协议的地址转换。

因此,所有的新的可靠传输协议,都是基于UDP报文进一步封装后进行开发的。

附件提供google QUIC的协议设计论文,原版出自https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/46403.pdf,考虑到很多同学访问外比较慢,这里附上一份。

#quic.pdf#

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
5月前
|
网络协议 开发者
探讨UDP协议中connect函数的作用及影响
总结来看,虽然UDP是无连接的,`connect()` 函数的使用在UDP编程中是一种可选的技术,它可以带来编程上的便利和某些性能上的改进,同时它改变的是程序逻辑上的行为,而非UDP协议本身的无连接特性。在实际应用中,根据通信模式和需求的不同,开发者可以根据情况选择是否调用 `connect()` 函数。
252 8
|
7月前
|
监控 网络协议 视频直播
UDP协议(特点与应用场景)
UDP(用户数据报协议)是传输层的一种无连接协议,具有简单高效、低延迟的特点。其主要特点包括:无连接(无需握手)、不可靠传输(不保证数据完整性)、面向数据报(独立传输)。尽管UDP不如TCP可靠,但在实时通信(如语音通话、视频会议)、在线游戏、多媒体流媒体(如直播、点播)及网络监控等领域广泛应用,满足了对速度和实时性要求较高的需求。
1219 19
|
8月前
|
网络协议
为何UDP协议不可靠?DNS为何选择UDP?
总的来说,UDP和TCP各有优势,选择哪种协议取决于应用的具体需求。UDP可能不如TCP可靠,但其简单、快速的特性使其在某些场景下成为更好的选择。而DNS就是这样的一个例子,它利用了UDP的优势,以实现快速、高效的名字解析服务。
446 14
|
8月前
|
网络协议 Java 开发工具
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
489 1
|
11月前
|
缓存 网络协议
Jmeter如何对UDP协议进行测试?
`jmeter-plugins`是JMeter的插件管理器,用于管理和组织所有插件。访问[官网](https://jmeter-plugins.org/install/Install/)下载并放置于`lib/ext`目录下,重启JMeter后可在“选项”中看到插件管理器。
404 1
Jmeter如何对UDP协议进行测试?
|
3月前
|
网络协议 安全 网络安全
什么是TCP/UDP/HTTP?它们如何影响你的内网穿透体验?
数据的传输离不开各种协议,它们就像现实世界中的交通规则,规定了数据如何打包、寻址、传输和接收。对于使用内网穿透的用户来说,理解TCP、UDP和HTTP这些基础协议的特点,能帮助你更好地理解其性能表现,并选择最适合的配置方案。
|
5月前
|
网络协议 安全 网络安全
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
482 2
|
12月前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
网络协议 算法 网络性能优化
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
782 2