且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-03-22 09:01:19

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

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

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

新开发的一些传输协议,比如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报文的头部,

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

其中的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#