🗒️UDP数据包大小的讨论
type
status
date
slug
summary
tags
category
icon
password
最近在研读《TCP/IP Illustrate》,对于其中一些细节的问题感到疑惑,随笔记录。
由来
作者在书中写到
UDP protocol (see Chapter 10) for data transport (e.g., DNS, DHCP, etc.) use a limited data size of 512 bytes to avoid the 576-byte IPv4 limit.
其中提到,常见的使用UDP协议的应用通常将数据包大小定为512字节,以此规避IPv4协议的576字节限制。
这使我有些疑惑,576字节的限制从何而来,如果仅仅是为了保证(UDP)数据包在下部协议(i.e. IP, Ethernet 802.3, Wi-Fi 802.11)中不被再次拆分,即保证数据的完整性:
- IPv4数据报当中的Total Length字段是16-bit,即IPv4最高支持65535的数据报长度。
- Ethernet协议当中,最长的数据帧大约为1500字节。
- Wi-Fi协议当中,约为7935字节(基于802.11n)。
这样看,576字节的出现有些莫名其妙。因此,我去查阅了RFC791,其中有关于576字节的描述。
All hosts must be prepared to accept datagrams of up to 576 octets (whether they arrive whole or in fragments). It is recommended that hosts only send datagrams larger than 576 octets if they have assurance that the destination is prepared to accept the larger datagrams.
总结如下:
- 任何实现IPv4协议的设备,需要时刻准备好处理最大为576字节的IPv4数据报。
- 针对大于576字节的IP数据报,应当在接收方已经处于预先准备状态(i.e. 接收方已经准备好处理发送方的IP数据报)时,再被发送。
因此,任何对于IPv4协议的实现,都应该保证576字节以下的IP数据报被实时处理。由此,我推断,576字节以下的IP数据报更具有某种通用性和稳定性。途经的所有网络设备都具有处理它的能力(依据RFC791)。
UDP与512字节
理解了576字节的由来,我们继续讨论UDP数据包和512字节的关系。
IPv4数据报中,含有4-bit的IHL(Internet Header Length)字段,用来表示报文header中有多少个32-bit长度字段。很容易计算出,IPv4数据报文中,最多含有60字节的header。
我们清楚,UDP的数据包header为8字节,因此能计算
容易算出UDP数据包的payload部分应为508字节,甚至小于512字节。
回顾开头,IPv4 Header部分最长为60字节,而其中的Options最长将占据40字节,而这种情况(i.e. options字段被填充满)是极为少见的,即通常情况下,IPv4 Header将远小于60字节,因为必要的字段只有20字节。
书中对于IPv4的options字段有相关阐释
Most of these options were introduced in [RFC0791] at the time IPv4 was being designed, when the Internet was considerably smaller and when threats from malicious users were less of a concern. As a consequence, many of the options are no longer practical or desirable because of the limited size of the IPv4 header or concerns regarding security.
大部分的options字段都是在IPv4的早期阶段所定义,没有考虑到安全性与规模带来的影响。并且IHL字段限制了IPv4 Header的长度,导致一些options也不再被使用。作者还提到,options会影响数据报在路由中的转发。
In some routers, datagrams with options or extensions are not forwarded as fast as ordinary datagrams.
即在一些路由的设计中,带有options字段的数据报可能转发的更慢,相比不带options字段的普通数据报。
由此,在极端情况下,我们计算出的所谓“稳定”的UDP数据包(负载)大小为508字节。但是考虑到options字段目前的使用情况(大部分字段都标记为historical,小部分标记为rare),即options字段真的很少被使用,我们得出结论:
即使采取512字节,UDP的数据包相对576字节限制,也已经有了有相当大的冗余空间
🤗 总结归纳
UDP协议与IPv4协议同属于Best-effort Delivery类型协议,512字节的UDP数据包(payload)大小设定,是为了尽可能满足Best-effort Delivery,在理论层面增强数据包的
- 可用性,途经的网络设备都应能正确处理这个数据包。
- 稳定性,理论上讲,这个大小的数据包一般不会被(在IP层)再次拆分(至少在到达目标网络之前,802.11/Wi-Fi协议会利用Fragment提升稳定性)。
📎 参考文章
- 《TCP/IP Illustrated》
- 《RFC791》
上一篇
std::forward 原理解析
下一篇
游戏求职之路
Loading...