UDP中一个包的大小最大能多大?

38次阅读

共计 1231 个字符,预计需要花费 4 分钟才能阅读完成。

前言
因为 UDP 数据传输的无连接特性,最简单的 UDP 数据传输就是一次数据交互一个 UDP 包搞定,这样就不用管分包问题(因为不像 TCP,UDP 传输时如果分包则是不能保证顺序的,这会带来很多问题)。
所以你一次交互的数据如果太多的话,用 UDP 实现就很可能并不优雅。
思考
在进行 UDP 编程的时候, 我们最容易想到的问题就是, 一次发送多少 bytes 好?当然,这个没有唯一答案,相对于不同的系统, 不同的要求, 其得到的答案是不一样的,我这里仅对像 ICQ 一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助。
网络原理
首先,我们知道,TCP/IP 通常被认为是一个四层协议系统:包括链路层、网络层、运输层、应用层。
UDP 属于运输层,下面我们由下至上一步一步来看。
结论 1:局域网环境下,建议将 UDP 数据控制在 1472 字节以下
以太网 (Ethernet) 数据帧的长度必须在 46-1500 字节之间, 这是由以太网的物理特性决定的,这个 1500 字节被称为链路层的 MTU(最大传输单元)。但这并不是指链路层的长度被限制在 1500 字节,其实这这个 MTU 指的是链路层的数据区,并不包括链路层的首部和尾部的 18 个字节。
所以,事实上这个 1500 字节就是网络层 IP 数据报的长度限制。因为 IP 数据报的首部为 20 字节,所以 IP 数据报的数据区长度最大为 1480 字节。而这个 1480 字节就是用来放 TCP 传来的 TCP 报文段或 UDP 传来的 UDP 数据报的。
又因为 UDP 数据报的首部 8 字节,所以 UDP 数据报的数据区最大长度为 1472 字节。这个 1472 字节就是我们可以使用的字节数
当我们发送的 UDP 数据大于 1472 的时候会怎样呢?
这也就是说 IP 数据报大于 1500 字节,大于 MTU,这个时候发送方 IP 层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于 MTU,而接收方 IP 层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于 UDP 的特性,当某一片数据传送中丢失时,接收方无法重组数据报,将导致丢弃整个 UDP 数据报。
因此,在普通的局域网环境下,我建议将 UDP 的数据控制在 1472 字节以下为好。
结论 2:Internet 编程时,建议将 UDP 数据控制在 548 字节以下
进行 Internet 编程时则不同,因为 Internet 上的路由器可能会将 MTU 设为不同的值。如果我们假定 MTU 为 1500 来发送数据,而途经的某个网络的 MTU 值小于 1500 字节,那么系统将会使用一系列的机制来调整 MTU 值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。
鉴于 Internet 上的标准 MTU 值为 576 字节,所以我建议在进行 Internet 的 UDP 编程时,最好将 UDP 的数据长度控件在 548 字节 (576-8-20) 以内。
这句话貌似有问题,unix 网络编程第一卷里说:ipv4 协议规定 ip 层的最小重组缓冲区大小为 576!所以,建议 udp 包不要超过这个大小,而不是因为 internet 的标准 MTU 是 576!

正文完
 0