环境:我正在编写一个 UDP 客户端-服务器应用程序。客户端和服务器之间的路径 MTU 为 1500 字节(它们之间只有无线链路,因此该值相当稳定)。我的系统默认设置不分段位,在客户端和服务器上,SO_SENDBUF 均为 16384,SO_RECVBUF = 87380。
问题:客户端使用 sendto 一次性向服务器发送 8192 个字节。我使用 Wireshark 查看这些 8192 个字节是如何分多个数据包发送的,发现每个数据包最多只能容纳 1023 个字节的 UDP 数据。但给定路径 MTU = 1500,难道我不应该在每个数据包中发送 1500-20(IP 报头)-8(UDP 报头)= 1472 个字节的数据吗?当我对 TCP 执行相同操作时,结果正是我所期望的。每个 TCP 数据包最多可容纳 1448 个字节,即 1500-20(IP 报头)-32(带时间戳选项的 TCP 报头)我的问题是:为什么 UDP 不在每个数据包中放入 1472 个字节,而是 1023 个字节?这只是次要的实施细节吗?还是我忽略了一些系统限制?
备注:即使我在同一台机器上进行实验(环回接口上使用 127.0.0.1),也可以观察到相同的结果。
答案1
您只是扣除了 L4(UDP) 和 L3(IP) 层的开销。我猜以太网帧 (L2) 中的前导码、MAC 寻址、类型字段和校验和的开销会占剩余部分?
http://www.doc.ic.ac.uk/~nd/surprise_97/journal/vol4/mhl/ether01.gif