UDP包的大小问题

UDP包的大小问题

 

我们传输数据的包的时候,需要包的大小。为什么呢?因为如果你的大包的大小超过了网络路径中的最大传输单元,也就是MTU

MTU=Maximum Transmit Unit

那么这个包在传输的时候就会出现碎片化处理(fragmentation),也就是在网络传输的时候,网络包被分成多个包传输,这样大大增加了数据包到达客户端后,因为丢失其中的某个包,而不能组成完整的包的几率。

关于网络分包的危害和所带来的问题,请想看IETF的文档:

https://tools.ietf.org/html/draft-mathis-frag-harmful-00

 

很多网络设备,如路由器的默认的MTU是1500,但是并不是所有的网络设备都是这个值,而网络路径中经过很多个设备,比如从中国到美国,整个这个网络路劲的MTU是由最小的值来决定的。那么到底取什么值才能保证呢?

根据国际IETF组织的建议,

如果网络是IPv4则是

576

IPv6则是

1280

这是整个IP包的大小,因此UDP包的大小还得减去IP头的大小-

IPv4=20字节

IPv6=40字节

而到UDP数据部分的大小,还得减去UDP头的大小-8字节

 

UDP Header
Offsets Octet 0 1 2 3
Octet Bit  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 Source port Destination port
4 32 Length Checksum

关于IETF中建议部分是在TURN协议2.7看到:

https://tools.ietf.org/html/rfc5766

 

还有一种方法是采用测量的方法,就是实际传输数据之前测试到底包达到多少的时候会出现分包现象。

这种方法IETF也有提出对应的解决方案:

https://tools.ietf.org/html/rfc1191

对应的RFC号是1191,其中提到基本思想是:

利用IP包头的DF标志位,设置标志位为1,表示不要分包,如果从源到目的地的整个路径中有任何一个router,网络设备,其MTU小于这个包的大小,那么将返回一个ICMP包,告诉源 – “目标不可达”。

下面RFC1191中的原话:

The basic idea is that a source host initially assumes that the PMTU
   of a path is the (known) MTU of its first hop, and sends all
   datagrams on that path with the DF bit set.  If any of the datagrams
   are too large to be forwarded without fragmentation by some router
   along the path, that router will discard them and return ICMP
   Destination Unreachable messages with a code meaning "fragmentation
   needed and DF set" [7].  Upon receipt of such a message (henceforth
   called a "Datagram Too Big" message), the source host reduces its
   assumed PMTU for the path.

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *