当前位置:  开发笔记 > 编程语言 > 正文

如果我在c#中发送0个有效载荷数据,udp数据包的大小是多少?

如何解决《如果我在c#中发送0个有效载荷数据,udp数据包的大小是多少?》经验,为你挑选了2个好方法。

我已经计算出使用udp的2个端点之间的碎片之前的最大数据是1472(其他端点可能不同).这表明mtu是1500字节,每个数据包的头开销是28bytes.可以安全地假设如果我发送0字节数据(有效载荷),传输的实际数据是28字节?我正在做一些bencchmark,所以对我来说知道频道中发生了什么至关重要.谢谢.



1> dtb..:

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数据报将导致传输特定数量的字节.


我有点困惑.你是说即使mtu为1500bytes,实际的数据包数据也可能超过1500字节(+26)?如果我不知道实际发送了多少数据,怎么能进行准确的测量?无论如何,我知道有多少数据被实际转移?

2> AK...:

如果未选择任何选项,则典型的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)则数据包被分段.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有