UDP/TCP包的大小限制知多少

一、mtu 简述 - 分包后数据包最大长度 1、定义 maximum transmission unit(最大可传输单元) 的缩写,它的单位是字节。在 *数据链路层* 定义 一个数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的 mtu 值是不同的。这个网络中最小的 mtu 值,被称为路径 mtu。假设:我们的接受/发送端都是以太网,它们的 mtu 都是 1500,我们发送的时候,数据包会以 1500 来封装,然而,不幸的是,传输中有一段x.25网,它的 mtu 是 576,这会发生什么呢?结论是显而易见的,这个数据包会被再次分片,更重要的是,这种情况下,如果 ip 包被设置了“不允许分片标志”,那会发生些什么呢?对,数据包将被丢弃,然事收到一份icmp不可达差错,告诉你,需要分片!很显然,mtu 值设置得过大或过小,都会在一定程度上影响我们上网的速度。 在应用程序中我们用到的 data 的长度最大是多少,直接取决于底层的限制,即:mtu 以太网(ethernet)的 数据帧 在链路层 ip包 在网络层 tcp或udp包 在传输层 tcp或udp中的数据(data)在应用层它们的 关系是 数据帧{ip包{tcp或udp包{data}}} 2、网络中 mtu 值的由来: 1>、最大值: 对于 ip 数据包来讲,在 ip 包头中,以 两个字节(16 位)来描述 ip 包的长度,也就是说,一个 ip 包,最长可能是  65535字节(64k)。那么加上以太网帧头和尾,一个以太网帧的大小就是:65535 + 14 + 4 = 65553,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组但,使用最大值真的可以吗?我们往下看 2>、最佳值的推导: a>、按最大值来推算:ip 数据包按最大值 65535字节 来算,假设我们现在的带宽是:100mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间: ( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s) 在100m网络下传输一帧就需要5ms,也就是说这5ms其他进程发送不了任何数据。如果是早先的电话拨号,网速只有2m的情况下: ( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s) 100ms,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。小知识: mbps,其全称为 million bits per second,意为每秒传输百万位(比特)数量的数据而这里的 bit(比特,1比特等于1个位)是表示数字信号数据的最小单位。1 字节 = 8 比特,所以有 65553 * 8 b>、既然大了不行,那设置小一点可以么?假设 mtu 值设置为100,那么单个帧传输的时间,在 2mbps 带宽下需要: ( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms) 时间上已经能接受了,问题在于,不管 mtu 设置为多少,以太网头帧尾大小是固定的,都是14 + 4,所以在 mtu 为 100 的时候,一个以太网帧的传输效率为: ( 100 - 14 - 4 ) / 100 = 82% 写成公式就是:( t - 14 - 4 ) / t,当t趋于无穷大的时候,效率接近100%,也就是mtu的值越大,传输效率最高,但是基于上一点传输时间的问题,来个折中的选择吧,既然头加尾是18,那就凑个整来个1500,总大小就是1518,传输效率: 1500 / 1518 =  98.8% 100mbps传输时间: ( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms) 2mbps传输时间: ( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms) 总体上时间都还能接受。故,得出 mtu 为 1500字节 这个经验值。 3>、最佳值: 在 ethernet 中,mtu 为 1500字节; 在 fddi 中,mtu 为 4352字节;在 ip over atm 中,mtu 为 9180字节。其实一个标准的 以太网 数据帧大小是:1518,头信息有 14 字节,尾部校验和 fcs 占了 4 字节 4>、最小值: 最小值被限制在 64 = *46*(ip包大小) + 14 (以太网头) + 4 (尾部校验和 fcs) 为什么是 64 呢?这个其实和以太网帧在半双工下的碰撞有关,感兴趣的同学可以自行去搜索。 5>、碎片与特大数据包: 在以太网中,数据包的大小范围是在 64—1518 字节之间,如果除去头部开销,则实际的数据大小为 46—1500 字节之间。一般情况下,数据包的大小都是在这个范围内,如果数据包 小于64 字节,称为 碎片;而如果 大于1518 字节,称为 特大数据包。这两种类型的数据包都是非正常的以太网数据包,它们将影响网络的正常运行。无论是碎片或特大数据包,都会增加网络的负载,导致网络故障的发生。所以,我们在对网络进行分析的时候,对数据包大小的判断也是不可缺少的一个环节。 6>、发送小于最小值的包,会出现什么情况呢? 正常接收: 在用 udp 局域网通信时,经常发生 “hello world” 来进行测试,但是 “hello world” 并不满足最小有效数据 (46) 的要求,为什么小于 46 个字节,对方仍然可用收到呢?因为在 链路层 的 mac 子层中会进行数据补齐,不足 46 个字节的用 0 补齐。 收不到数据: 但当服务器在公网,客户端在内网,发生小于 46 个字节的数据,就会出现接收端 收不到数据的情况。 7>、应用层 tcp/udp 发送的源数据大小限制 小知识:tcp 包头中,是没有对 数据包总大小 的定义 - 数理论上没有大小限制。udp 包头中,用 两个字节(28=16bits) 来定义 数据包的总大小 -- 2^16 = 65535字节 **即:***64k**1、****tcp**** 是以 数据流 形式传输数据,所以使用 send 函数理论上没有大小限制。一般数据包太长的话会进行多次拆包传输,数据包短的话会放到下一次数据传输时发送。2、udp 协议发送时,用 sendto 函数最大能发送数据的长度为:65535- ip头(20) - udp头(8)=65507字节。用 sendt o函数发送数据时,如果发送数据长度大于该值,则函数会返回错误3、udp 协议分成若干个包发送,会发送整个数据丢失问题如果数据小于 65507字节 ,则:按照 mtu 的值进行分包,分成若干个包,然后发送出去;而 接收方 ip 层就需要进行数据报的重组。当 ip 层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个 ip 数据报。 3、osi 七层结构: osi模型功能主要协议单位        
应用层 文件传输,电子邮件,文件服务,虚拟终端 telnet、ftp,http(s),snmp,tftp,smtp,dns 数据流
表示层 数据格式化,代码转换,数据加密 css、gif、html、json、xml 数据流
会话层 解除或建立与别的接点的联系 ftp、ssh、tls、http(s)、sql 数据流
传输层 提供端对端的接口 tcp,udp 数据段
网络层 为数据包选择路由 ip,icmp,rip,ospf,bgp,igmp 数据包
数据链路层 传输有地址的帧以及错误检测功能 mtu、slip,cslip,ppp,arp,rarp,802.2、hdlc 帧
物理层 以二进制数据形式在物理媒体上传输数据 iso2110,ieee802,ieee802.2,v.35,eia/tia-232 比特流
img 网络中的数据传输过程:**在 **传输层**,切割成 *数据段*;**在 **网络层**,打成 ip 包 *数据包*;**在 **数据链路层**,切割成 *数据帧*。**在 **物理层**,转变成 *比特流*。 二、计算 udp 或 tcp 包的最佳大小: img从上图可知:本地 mtu 值 = 1500,那么: udp 包的大小: 1500 - ip头(20) - udp头(8) = 1472(bytes)tcp 包的大小: 1500 - ip头(20) - tcp头(20) = 1460 (bytes) 三、mtu 对 udp、tcp 的影响 1、mtu 对 udp 的影响: 一旦 udp 携带的数据 超过1472(1500-20(ip首部)-8(udp首部)),那么 udp 数据就会在网络层被分成多个 ip 数据报既:发送方 ip 层就需要将数据包分成若干片,而接收方 ip 层就需要进行数据报的重组。更严重的是,如果使用 udp 协议,当 ip 层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个 ip 数据报。 udp不保证可靠传输;但是 tcp发生组包错误时,该包会被重传,保证可靠传输。 2、mtu 对 tcp 的影响: tcp 的一个数据报也不可能无限大,还是受制于 mtu,tcp 单个数据报的最大消息长度,称为 msstcp 在建立连接的过程中,双方会进行 mss 协商最理想的情况下,mss 的值正好是在 ip 不会被分片处理的最大长度(这个长度受限于数据链路层的 mtu)双方在发送 syn 的时候会在 tcp 的头部写入字节能支持的 mss 值然后双方得知对方的 mss 值之后,选择较小的作为最终 mssmms 的值就在 tcp 首部的 40 字节变长选项中(kind=2) mtu 通过限制 mss(单个数据报的最大消息长度) 的取值,来限制单个 tcp 包的长度 3、mtu 和 mss的关系 mtu:最大传输单元,由不同的数据链路层对应物理层产生的(硬件规定),以太网的mtu=1500mss:最大分节大小,为 tcp 数据包每次传输的最大数据分段大小 mss 的取值受限于 mtu 四、如何测出当前网络最佳mtu值 1、首先,我们必须明白什么才是最佳的 mtu 值。 1)当本地 mtu 值 > 网络 mtu 值,网络会进行拆包,这样一来数据包数量增多,二来也增加了拆包组包的时间2)当本地 mtu 值 < 网络 mtu 值,虽然可以直接传输,但是却没有完全利用网络的性能,没有发挥出最大传输能力 因此,设置最合适的本地 mtu 值,就是要让本地 mtu 值 = 网络 mtu 值。 2、小知识: 如果 mtu 过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。 3、怎样才能知道自己的当前网络环境的 mtu 值是多少呢? 下面便来介绍测试方法。步骤一: 打开命令提示符窗口输入以下命令(建议直接复制,以免误将小写字母 l 写为数字 1),回车。ping -l 1480 -f www.baidu.com这条命令的意思是向 www.baidu.com(百度主页)发送一个探测请求,请求将一个不允许分割的 1480 字节的数据包发送出去。 步骤二: 若是出现传输失败,提示需要拆分数据包的情况,则说明当前网络的 mtu 值要比指定的 1480 小,因此我们就适当调小数据包的大小,再发送一条类似的命令若是出现传输成功,则说明当前网络的 mtu 值比 输入的 要大。于是我们需要稍微调大数值,以便求得最为精确的网络 mtu 值 步骤三: 如此这般,通过不断修正数据包的大小,我们可以最终得到当前网络的 mtu 值。 img 4、ping 命令使用的是 icmp 协议 ping 命令使用的,既不是 tcp 报文,也不是 udp 报文它用的是 icmp 协议,与 ip 协议同级,属于 网络层,位于 tcp、udp(传输层)的下一层。【应用层、传输层、网络层、数据链路层、物理层】 5、计算结果分析 最后测试得出:最大数据传输为 1472 字节的数据包,则:mtu = 1472 + 20字节 ip 首部 + 8字节 icmp 首部 = 1500 字节  


全新一代骁龙8移动平台打造前所未有的移动游戏体验
自动集尘扫地机,让你在生活中忙里偷闲
用于机器人中的磁性位置传感技术
德索Mini fakra连接器持续走精细化路线
受原材料价格上涨因素,动力电池企业踏上降成本的道路
UDP/TCP包的大小限制知多少
AI加持下 猎豹移动软硬件协同增长
新型DLPC347x控制器:适用大众市场的3D扫描仪和3D打印机,推动DLP技术从工业向民用扩展
如何将长三角机器人产业打造成世界级产业集群
透平机PLC数据采集远程监控系统解决方案
三菱FX5UPLC怎样远程监控和故障报警?
为什么说现在该考虑安装和使用智能锁了
人工智能若想走得更远 必须解决这10件事
雷曼光电企业宣传片脱颖而出,获得“深圳企业文化微视频优秀作品奖”
微软拟将Windows 10X新特性引入桌面版Windows 10操作系统
vhdl数码管中的倒计时程序介绍
15W控制板系统开关电源芯片U6203D
如何选择合适的模拟输入功放
补齐产业短板,杭州灵伴科技AR技术助力化工行业智能升级
这款先拍照后对焦的vivoX9手机,深得女人心 销量很火爆