0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_B3xDfZry 来源:C语言学习联盟 作者:C语言学习联盟 2022-11-23 10:21 次阅读

一、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)*10005(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 比特流
16924318-6a4d-11ed-8abf-dac502259ad0.jpgimg
网络中的数据传输过程:**在 **传输层**,切割成 *数据段***在 **网络层**,打成 IP 包 *数据包***在 **数据链路层**,切割成 *数据帧***在 **物理层**,转变成 *比特流*

二、计算 udp 或 tcp 包的最佳大小:

16a53798-6a4d-11ed-8abf-dac502259ad0.pngimg从上图可知:本地 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 值。
16b28e98-6a4d-11ed-8abf-dac502259ad0.pngimg

4、ping 命令使用的是 ICMP 协议

ping命令使用的,既不是 tcp 报文,也不是 udp 报文它用的是ICMP协议,与 IP 协议同级,属于网络层,位于 tcp、udp(传输层)的下一层。【应用层、传输层、网络层、数据链路层、物理层】

5、计算结果分析

最后测试得出:最大数据传输为 1472 字节的数据包,则:MTU= 1472 + 20字节 IP 首部 + 8字节 ICMP 首部 =1500 字节

	

	
		

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7310

    浏览量

    87880
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1289

    浏览量

    78543
  • UDP
    UDP
    +关注

    关注

    0

    文章

    312

    浏览量

    33706

原文标题:UDP/TCP 包的大小限制知多少

文章出处:【微信号:C语言学习联盟,微信公众号:C语言学习联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TCPUDP的区别分析

      传输层协议主要有TCPUDPUDP提供无连接的通信,不能保证数据包被发送到目标地址,典型的即时传输少量数据的应用程序通常使用UDPTCP
    发表于 09-18 10:29 2次下载

    使用wireshark抓分析TCPUDP的资料详细说明

    本文档的主要内容详细介绍的是使用wireshark抓分析TCPUDP的资料详细说明。
    发表于 05-09 17:36 27次下载
    使用wireshark抓<b class='flag-5'>包</b>分析<b class='flag-5'>TCP</b>及<b class='flag-5'>UDP</b>的资料详细说明

    tcpudp协议的异同

    UDP 校验和则是包含 UDP 首部和数据在内的校验结果。 TCP协议 TCP协议基于网络层的 IP 协议提供的是有连接、可靠服务,是基于字节流的。
    的头像 发表于 11-12 14:45 3768次阅读
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>协议的异同

    TCPUDP的原理以及区别

    最近重新认知了一下TCPUDP的原理以及区别,做一个简单的总结。
    发表于 08-08 14:34 1399次阅读

    TCPUDP协议的区别

    最近重新认知了一下TCPUDP的原理以及区别,做一个简单的总结。
    发表于 11-03 10:25 687次阅读

    UDP/TCP大小限制是多少?

    结论是显而易见的,这个数据会被再次分片,更重要的是,这种情况下,如果 IP 包被设置了“不允许分片标志”,那会发生些什么呢?
    的头像 发表于 11-11 09:21 4872次阅读

    UDPTCP的区别

    在上一则文章中,对 TCP 的**三次握手建立连接**和**四次挥手释放连接**进行了详细地阐述,本节教程针对于 TCP 的其他内容进行讲解,首先是同处于传输层协议的`UDP`协议,这两者有什么区别
    的头像 发表于 01-20 17:05 1362次阅读
    <b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b>的区别

    TCPUDP的原理以及区别

    TCP是基于连接的,而UDP是基于非连接的。 **tcp传输数据稳定可靠** ,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等
    的头像 发表于 05-18 17:14 727次阅读
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的原理以及区别

    UDP能否像TCP一样实现可靠传输?

    UDP(UserDatagramProtocol)是一种无连接的协议,基于数据报的传输方式。在网络通信中,它通常用于快速传输数据,但却无法保证数据的可靠传输。与UDP刚好相反,
    的头像 发表于 06-08 14:50 755次阅读
    <b class='flag-5'>UDP</b>能否像<b class='flag-5'>TCP</b>一样实现可靠传输?

    udp是什么协议 TCPUDP的区别

    TCP协议提供可靠的数据传输,UDP协议提供尽量高效的数据传输。TCP协议通过使用序列号、确认应答等机制,保证数据传输的可靠性,而UDP协议不提供可靠性保证,它只是简单地把应用程序传给
    的头像 发表于 06-26 17:47 1.1w次阅读

    TCPUDP的区别

    1.TCPUDP的区别 TCP是面向连接的,UDP是面向无连接的; TCP只能一对一通信,UDP
    的头像 发表于 11-09 09:35 1836次阅读
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的区别

    TCPUDP的基本区别

    TCPUDP基本区别 基于连接与无连接 TCP要求系统资源较多,UDP较少; UDP程序结构较简单 流模式(
    的头像 发表于 11-13 15:27 4052次阅读
    <b class='flag-5'>TCP</b>与<b class='flag-5'>UDP</b>的基本区别

    UDP分片和丢TCP效果对比

    UDP(用户数据报协议)和TCP(传输控制协议)在很多方面都有显著的区别。总体来说,TCP更适合需要可靠传输的应用,例如网页浏览、电子邮件等,而UDP则更适合对速度有高要求,但对数据完
    的头像 发表于 11-23 13:55 390次阅读

    UDPTCP的主要区别 UDP能否像TCP一样实现可靠传输?

    UDPTCP的主要区别 UDP能否像TCP一样实现可靠传输?TCP如何实现可靠性传输? UDP
    的头像 发表于 01-22 16:10 456次阅读

    udp是什么意思 简述TCPUDP的区别和联系

    UDP (User Datagram Protocol) 是一种在计算机网络中使用的传输层协议。它与TCP (Transmission Control Protocol) 一样,都是在因特网协议套件
    的头像 发表于 02-02 16:33 631次阅读