我已经计算出使用udp的2个端点之间的碎片之前的最大数据是1472(其他端点可能不同).这表明mtu是1500字节,每个数据包的头开销是28bytes.可以安全地假设如果我发送0字节数据(有效载荷),传输的实际数据是28字节?我正在做一些bencchmark,所以对我来说知道频道中发生了什么至关重要.谢谢.
MTU是可以在没有分段的情况下传输的IP数据包的最大大小.
IPv4要求路径MTU至少为576字节,IPv6至少为1280字节.
以太网的MTU为1500字节.
IP包由两部分组成:包头和有效载荷.
IPv4标头的大小至少为 20个字节,IPv6标头的大小至少为 40个字节.
IP分组的有效载荷通常是TCP分段或UDP数据报.
UDP数据报由UDP报头和传输的数据组成.
UDP报头的大小为8个字节.
这意味着具有空UDP数据报的IP数据包作为有效负载至少需要28(IPv4)或48(IPv6)字节,但可能需要更多字节.
另请注意,在以太网的情况下,IP数据包将另外包装在MAC数据包(14字节标题+ 4字节CRC)中,该数据包将嵌入以太网帧(8字节前导序列)中.这会将26个字节的数据添加到IP数据包中,但不会计入MTU.
因此,您不能假设UDP数据报将导致传输特定数量的字节.
如果未选择任何选项,则典型的IP标头为20个字节.UDP头是8个字节.通过以太网,帧大小为14字节(标题)+ 4字节(预告片).根据您捕获这些数据包的方式,您可能需要考虑或不考虑帧大小.
没有以太网(IP + UDP)= 20 + 8 = 28字节
以太网= 18 + 28 = 46字节
C#中的UdpClient类将从第5层开始返回数据包,因此您无需考虑上述情况.
更新:
在IP层强制执行1500字节MTU.这意味着在分段时,IP层下面的数据包大小无关紧要.
这转换为:
以太网帧字节(固定)= 18
IP报头(最小)= 20
UDP报头(固定)= 8
最大.允许的有效负载没有碎片= 1472
导线上的总字节数=(上面的总和)1518字节
(你可以用Wireshark这样的工具计算剩余的字节数)
如果(IP报头+ UDP报头+有效负载> 1500)则数据包被分段.