为什么新开发的可靠传输协议都是基于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#

相关文章
|
26天前
|
网络协议 网络安全 网络性能优化
使用到UDP协议的情况下该如何防护
使用到UDP协议的情况下该如何防护
|
1月前
|
网络协议
【计算机网络】为什么DNS协议采用的是UDP作为传输层协议,而不是TCP?
【1月更文挑战第10天】【计算机网络】为什么DNS协议采用的是UDP作为传输层协议,而不是TCP?
|
1月前
|
网络协议 Linux 数据处理
网络编程【网络编程基本概念、 网络通信协议、IP地址 、 TCP协议和UDP协议】(一)-全面详解(学习总结---从入门到深化)
网络编程【网络编程基本概念、 网络通信协议、IP地址 、 TCP协议和UDP协议】(一)-全面详解(学习总结---从入门到深化)
52 3
|
6天前
|
域名解析 网络协议 安全
【JavaEE初阶】 UDP协议的详细解析
【JavaEE初阶】 UDP协议的详细解析
|
29天前
|
网络协议 网络性能优化
【计算机网络】UDP 协议特点解析
【1月更文挑战第27天】【计算机网络】UDP 协议特点解析
|
29天前
|
网络协议 安全 网络性能优化
【网络工程师】<软考中级>传输层协议TCP/UDP&常用应用层协议
【1月更文挑战第27天】【网络工程师】<软考中级>传输层协议TCP/UDP&常用应用层协议
|
30天前
|
XML 存储 JSON
网络原理之UDP协议
网络原理之UDP协议
|
1月前
|
域名解析 监控 网络协议
深入了解UDP协议:特点、应用场景及市面上常见软件案例
深入了解UDP协议:特点、应用场景及市面上常见软件案例
44 0
|
1月前
|
网络协议 API 网络安全
用户态协议栈设计实现udp,arp与icmp协议
用户态协议栈设计实现udp,arp与icmp协议
51 1
|
1月前
|
域名解析 缓存 网络协议
网络编程(TCP与UDP协议)
网络编程(TCP与UDP协议)


http://www.vxiaotou.com