网络编程之UDP中一个包的大小最大能多大
读书笔记:here
结论1:局域网环境下,建议将UDP数据控制在1472字节以下
一定要知道
因为链路层的传输单元(MTU)是1500字节,1500字节中并不包含链路层的首尾18个字节。1500字节是链路层的数据区。 udp数据包就是放在这个数据区中,
网络层是数据链路层的上层,所以,网络层IP数据报长度就是1500字节。 这1500字节包含了IP数据报首部
+IP数据报的数据区
。 1500-20=1480,这1480的长度专门存放TCP传来的数据报: TCP或者UDP数据报。
由上可知,UDP数据报的长度为1480字节(含有报头),而UDP首部占有8个字节,故UDP的数据区长度为1472字节(1480-8=1472).
注意,上面这些都是理论数据。
丢包或者重组
因为UDP不保证数据的可靠性。那么,当传给UDP数据区的长度大于1472时,此时,IP数据报的长度已经大于1500字节。这时,IP层就需要将这个数据包分片发送并在接收端重组。 但是,如果分片传输的过程中出现丢包,怎么处理? 比如,IP层需要将一个2000字节的数据包分为两个包A和B发出,接收端没有收到B仅收到A。那么,IP层将会丢弃整个数据包,当然也就不会有重组了。
结论2:Internet编程时,建议将UDP数据控制在548字节以下
网络中的设备繁多,可能设定的传输控制单元(MTU)的大小也不尽相同。这样,同一段数据经历不同的设备,设备需要做很多繁琐的工作。
根据Internet的协议,MTU设置576字节。 实际中,我们应该尽量控制UDP数据报中的数据区的长度为548(576-8(首部长度)=548)字节以下。
unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!