我读过许多关于UDP数据包大小的文章,但一直无法得出正确的结论。
许多服务将最大的UDP数据包限制在512字节(如dns)
假定internet上的最小MTU是576,IPv4报头的大小是20字节,UDP报头的大小是8字节。这就为用户数据留下了548个字节可用
我是否能够使用548大小的数据包而不产生数据包碎片?或者DNS的创造者知道一些事情,这就是为什么他们把它限制在512字节。
我能安全的把数据设置在548字节以上吗?
我读过许多关于UDP数据包大小的文章,但一直无法得出正确的结论。
许多服务将最大的UDP数据包限制在512字节(如dns)
假定internet上的最小MTU是576,IPv4报头的大小是20字节,UDP报头的大小是8字节。这就为用户数据留下了548个字节可用
我是否能够使用548大小的数据包而不产生数据包碎片?或者DNS的创造者知道一些事情,这就是为什么他们把它限制在512字节。
我能安全的把数据设置在548字节以上吗?
当前回答
UDP不是“安全的”,所以问题不是很大-然而-
如果你使用的是Mac,默认情况下你可以发送的最大大小是9216字节。 如果你在Linux (CentOS/RedHat)或Windows 7上,最大是65507字节。
如果你发送9217或更多(mac)或65508+ (linux/windows),套接字发送函数返回一个错误。
上面讨论碎片和MTU等问题的答案是跑题的——所有这些都发生在较低的级别,对你来说是“看不见的”,并且在很大程度上不会影响典型连接的“安全性”。
要回答实际的问题,不要使用UDP,使用原始套接字,这样你就可以更好地控制一切;因为你是在编写一款游戏,所以你需要深入研究标志以获得流量的优先级,所以你也可以同时摆脱UDP问题。
其他回答
512是您最好的选择。它在其他地方也被使用,是一个不错的偶数(1024的一半)。
UDP报文的最大大小的理论限制(Windows)是65507字节。这是记录在这里:
正确的UDP消息最大大小是65507,由以下公式确定: 0xffff -(sizeof(IP头)+ sizeof(UDP头))= 65535-(20+8)= 65507
也就是说,大多数协议限制的大小要小得多——通常是512或偶尔是8192。如果你在一个可靠的网络上,你通常可以安全地超过548,但如果你在整个互联网上广播,你的频率越大,你就越有可能遇到数据包传输问题和丢失。
udp有不同的最大值。最后,这是你的选择,你认为足够安全的限制。注意:UDP本身是不安全的,因此您的数据包可能在任何时候丢失。
注意:所有这些都有一个范围。具体有多大取决于你的IP选项。一般情况下,可以这样计算:[upper maximum]-[IP-Options长度,以字节为单位]。这里列出的所有范围都不包括UDP-Header(8字节)
最小最大传输限制(或类似的东西,我忘记了实际的名称,在任何地方都找不到它):512-552字节
这可能是最安全的尺寸。IPv4协议要求所有跳来传输这个大小的数据包,更大的数据包可能在任何时间被任何主机丢弃。
最大传输单元:1432-1472:
这种大小的数据包可以在单个以太网帧中发送,而不会被分割。任何一个片段的丢失都会导致整个数据包无用。因此,当超过这个限制时,由于单个片段的碎片和潜在损失,您的数据包变得无用的机会增加。
绝对限制:65467-65507:
没有数据包可以超过这个限制,因为在这个限制下,IPv4协议达到了它的全部潜力。不能发送更大的数据包。这是因为IPv4协议只保留2个字节(16位)作为总长度。将所有这些位都设置为1,就得到65535。减去IP(20-60字节)和UDP头(8字节),就得到了这个限制。这种大小的数据包将导致至少44个片段。请记住,这些片段中的任何一个丢失都会导致整个包无用。
UDP不是“安全的”,所以问题不是很大-然而-
如果你使用的是Mac,默认情况下你可以发送的最大大小是9216字节。 如果你在Linux (CentOS/RedHat)或Windows 7上,最大是65507字节。
如果你发送9217或更多(mac)或65508+ (linux/windows),套接字发送函数返回一个错误。
上面讨论碎片和MTU等问题的答案是跑题的——所有这些都发生在较低的级别,对你来说是“看不见的”,并且在很大程度上不会影响典型连接的“安全性”。
要回答实际的问题,不要使用UDP,使用原始套接字,这样你就可以更好地控制一切;因为你是在编写一款游戏,所以你需要深入研究标志以获得流量的优先级,所以你也可以同时摆脱UDP问题。
IPv4最小重组缓冲区大小为576,IPv6为1500。从这里减去标题大小。参见W. Richard Stevens的UNIX网络编程:)