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

点击蓝字

42d075d61a7697b8bb5e4041d0435d8f.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

一、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

比特流

6b2f896a93d7f4e45c8e2b0e06897a12.jpeg

img

网络中的数据传输过程:

**在 **传输层**,切割成 *数据段*

**在 **网络层**,打成 IP 包 *数据包*

**在 **数据链路层**,切割成 *数据帧*

**在 **物理层**,转变成 *比特流*

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

ff3b242a3a4174574a4e4bc4a5a94728.png

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 单个数据报的最大消息长度,称为 MSS

TCP 在建立连接的过程中,双方会进行 MSS 协商

最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度受限于数据链路层的 MTU)

双方在发送 SYN 的时候会在 TCP 的头部写入字节能支持的 MSS 值

然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS

MMS 的值就在 TCP 首部的 40 字节变长选项中(kind=2)

MTU 通过限制 MSS(单个数据报的最大消息长度) 的取值,来限制单个 TCP 包的长度

3、MTU 和 MSS的关系

MTU:最大传输单元,由不同的数据链路层对应物理层产生的(硬件规定),以太网的MTU=1500

MSS:最大分节大小,为 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 值。

ae21c9e23bbd8e1cc6348de728630034.png

img

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

ping 命令使用的,既不是 tcp 报文,也不是 udp 报文

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

5、计算结果分析

最后测试得出:最大数据传输为 1472 字节的数据包,则:

MTU = 1472 + 20字节 IP 首部 + 8字节 ICMP 首部 = 1500 字节

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autocad2014 菜单栏 闪退_AutoCAD2014闪退的原因与处理办法 1打开就闪退怎样办

软件安装&#xff1a;装机软件必备包关于电脑装机必须的软件&#xff0c;比如windows office系列办公软件、网页浏览器、杀毒软件、安全防护软件、刻录软件、压缩软件、下载工具、多媒体播放软件、多媒体编辑软件、输入法、图片查看和处理软件、聊天沟通工具、系统工具与驱动补…

java ee的小程序_扩展Java EE应用程序的基础

java ee的小程序老实说&#xff0c;“可扩展性”是一个详尽的主题&#xff0c;并且通常没有被很好地理解。 通常&#xff0c;它被认为与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 群集 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题&#…

28 张图,一次性说清楚 TCP,速度

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删做IT相关的工作&#xff0c;肯定都离不开网络&#xff0c;网络中最重要的协议是TCP。无论是实际工作还是笔试面试&#xff0c;你看哪里能少得了T…

晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解

今天带你们聊一聊潮牌复刻和正品&#xff0c;简单介绍一下我自己&#xff0c;在复刻圈子五年&#xff0c;我的原则从始至终就是质量放在第一位&#xff0c;之所以能走这么久也是这个原因。回归正题&#xff0c;接着往下看。无论是正品还是复刻&#xff0c;其实还要根据自己的能…

php cdi_本机CDI限定词:@Any和@Default

php cdi让我们看一下CDI中的开箱即用的限定词 CDI规范声明了三个限定符– Any&#xff0c; Default&#xff0c; New Any &#xff1a;将其视为无所不在的限定词。 它在那里&#xff0c;即使不是;-) Default &#xff1a;顾名思义&#xff0c;当没有其他限定符时&#xff0…

C语言字符串函数strcat | strcpy | strlen | strcmp的用法及原型

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删strcat(str1,str2) 意为将字符串str2连接到字符串str1之后strcat用法如下#include <stdio.h> #include <string.h>int main () {cha…

crntos7启动php命令_CentOS7设置php-fpm开机自启动

php-fpm安装成功后并不会开机启动&#xff0c;如果是运行正常的程序在系统重启后出现502报错(502 Bad Gateway)&#xff0c;通常就是php-fpm没启动起来。0 先确定几个文件的位置&#xff0c;记录下来备用a php-fpmwhich php-fpm/usr/sbin/php-fpmb conf#几个可能的位置#/etc/ph…

java jpa 异步编程_异步处理时的JPA

java jpa 异步编程几年前&#xff0c;在Java世界中&#xff0c;几乎显而易见的是&#xff0c;每个“企业”类项目都需要JPA与数据库进行通信。 JPA是Joel Spolsky描述的“ 泄漏抽象 ”的完美示例。 刚开始时很棒而又容易&#xff0c;但是最后很难调整和限制。 对于许多参与数据…

C语言字符数组与字符串的使用详解

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删正文1、字符数组的定义与初始化字符数组的初始化&#xff0c;最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]{ I, ,a,m, ,‘h,a,p…

SRC挖洞网集合

阿里SRC https://security.alibaba.com/ 蚂蚁集团SRC https://security.alipay.com/ 阿里本地生活SRC https://asrc.alibaba.com/#/ 京东安全应急响应中心 https://security.jd.com/#/ 腾讯SRC https://security.tencent.com/ 美团安全应急响应中心 https://security.meit…

不能将紧实的字段 绑定到_代码整洁之道【笔记】

一、整洁代码A.混乱的代价1.有些团队在项目初期进展迅速&#xff0c;但有那么一两年的时间却慢去蜗行。对代码的每次修改都影响到其他两三处代码2.花时间保持代码整洁不但有关效率&#xff0c;还有关生存3.程序员遵从不了解混乱风险经理的意愿&#xff0c;也是不专业的做法4.Bj…

存根类 测试代码 java_测试双打:模拟,假人和存根

存根类 测试代码 java大多数班级都有合作者。 在进行单元测试时&#xff0c;您通常希望避免使用那些协作者的实际实现方式来避免测试的脆弱性和绑定/耦合&#xff0c;而应使用测试双打&#xff1a;模拟&#xff0c;存根和双打。 本文引用了有关该主题的两篇现有文章&#xff1…

5 个牛逼的算法设计,你知道几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、分治法概念&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之…

python2.7.10安装教程_Linux系统(CentOS)下python2.7.10安装

本文记录了Linux系统(CentOS)安装Python&#xff0c;供大家参考&#xff0c;具体内容如下Python(Linux) 下载地址操作系统&#xff1a;Centos6.41、下载下载的版本&#xff1a;Python-2.7.10.tgz2、安装一般情况下&#xff0c;Linux都会预装 Python了&#xff0c;但版本较低。(…

javafx窗体程序_JavaFX实际应用程序:AISO HRC-Matic

javafx窗体程序“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序&#xff0c;由称为HRC-Matic的关系数据库支持。 它由AISO在日内瓦开发。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客&#xff08; …

x201换风扇_笔记本怎么换风扇 ThinkPad X201i换风扇图文教程

ThinkPad X201i换电扇图文教程&#xff1a;拆机之前&#xff0c;我们需求先对X201i的散热电扇在停止了开端的理解&#xff0c;得知价钱从10元左右的单电扇&#xff0c;到上百的散热全体都有&#xff0c;而且还分东芝产和松下产等不同产地的&#xff0c;小编选择了松下产的整套散…

几十个Shell分析日志文件脚本!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删收集&#xff0c;整理一些服务器日志分析命令&#xff0c;可以用来分析自己网站服务器日志&#xff0c; 看看网站的访问量。看看有没有黑阔搞破坏…

flex布局水平垂直 垂直_垂直和水平装饰

flex布局水平垂直 垂直装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 The Apartme…

一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删栈是什么&#xff1f;栈有什么作用&#xff1f;首先&#xff0c;栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出 (LIFO, L…

thinkphp6企业项目实战_[MarsZ]ThinkPHP项目实战总结

本文原word格式百度云盘下载地址&#xff1a;综述 2需求 2作者 2系统一览 2Unity3d客户端 2PHP后台 4准备 6XAMPP 6官网 6下载地址 6教程 6ThinkPHP 6官网 7项目所用版本 7下载地址 7快速入门 7完全手册 7步骤 7准备ThinkPHP 7修改MySQL设置信息 8检测是否成功 9扩展&#xff1…