传输协议UDP的新应用
UDP协议
在传输协议中,相对于TCP协议,UDP协议简单的不能再简单了,报文头中除了SPORT和DPORT表示协议类型之外,只剩下报文长度字段Length和CheckSum做数据校验了。长久以来网络课本在介绍UDP的时候,都会提到面向无连接,不可靠协议这类描述。所以在很多人看来,相对于 TCP 的强大,UDP 似乎没什么价值。
不过 UDP 正是因为简单,才具有了很强的可控性。它适用于不需要差错和纠错的应用程序,它的协议栈避免了处理此类问题的开销。对时间敏感的应用程序通常使用 UDP,因为丢弃数据包比等待数据包重传(可能不是实时操作系统可接受的选项)更可取。
UDP 被广泛应用在一些传统应用层协议上,比如 DNS,DHCP,SNMP,以及一些流媒体协议,在线游戏协议等。除此之外,在一些网络交互中,UDP 也有用武之地,下面基于我熟悉的领域做一些介绍。
VXLAN
一种MAC in UDP技术,主要应用在互联网数据中心领域,用来解决VLAN中VID个数最多只有4096的问题。
GENEVE
在GRE等路由封装技术基础上出现的一种通用封装技术,使用TLV格式存储变长报文头,方便协议扩展。
RCoE
将Infinidband技术应用到Ethernet之后,除了over到MAC层之外,还支持了over UDP实现。
QUIC
RFC 9000 QUIC: A UDP-Based Multiplexed and Secure Transport,HTTP/3 使用 QUIC 层作为其传输层协议,这也是其不同于 HTTP/2 和 HTTP 的最大之处。QUIC 已经从 Google 使用的私有协议,演进成 IETF 的标准协议,Chrome 从版本 90 开始支持 QUIC,从版本 93 作为默认协议,具体参考这里。
其他
可靠 UDP 传输这篇文章讨论了如何在 UDP 上实现可靠的传输服务,作者是游戏开发者玩家云风。在第一部分中作者指出:
TCP 已经够复杂了,几乎不太可能重新设计的更好。如果用 UDP 再实现一个可靠传输协议,而表现的比 TCP 效果更好,那么多半只是在部分情况下的优势;或是霸道的占用了过量的资源,而 TCP 在设计时则是很友好的,以整个网络的通畅为更高准则的。
https://blog.codingnow.com
如果基于 UDP 可以做的比 TCP 更好,那么一定是放弃了点 TCP 需要做到的东西。
其实 UDP 本身并没有什么复杂之处,它只不过在 IP 层之上区分了源端口号和目的端口号,所以可以在同一个主机上区分不同的服务。需要注意的是,对于同一端口号,TCP 和 UDP 的用途都是一样的,比如 UDP 80 端口还是可以做 HTTP 协议的。
另外,UDP 因为有传输层字段,可以适应很多网络设备的负载均衡实现,因为网络设备会基于五元组计算 hash 然后做负载均衡。同时,UDP 还可以适应 NAT 转换,很多终端网络用户其实都是通过 NAT 上网的。
对于一些协议来说,比如 TCP 来说,绝大多数操作系统都有网络协议栈实现,所以应用层可以定制的特性是有限制的,或者说你不太容易改动一些实现代码来满足你特定的需求。如果应用层协议是建立在 UDP 之上,你完全可以基于 标准 socket 接口实现自己的私有协议,这样可以做到灵活控制,同时不修改内核协议栈代码,其实 QUIC 协议就是这样。最近看了一点 nginx 的代码库,发现他们很多的 commit 都是在修改 QUIC 相关功能。
参考资料
- https://developer.mozilla.org/zh-CN/docs/Glossary/UDP
- https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967&id=ZH-CN_CONCEPT_0254009235