Linux 检测通信路径上的PMTU(路径最大传输单元)

news2024/11/25 9:46:30

问题描述

终端设备向云端POST数据,数据量较小的没有问题,数据量大的必然出现丢包。网络很通畅,延迟较低。

分析

后来发现,终端到云端的通信路径上某个路由器节点的MTU小于终端的MTU,当终端发出的IP数据包长度大于该路由器节点的MTU时,IP数据包被丢弃。

处理方法

降低终端(Linux系统)的MTU。这里包含两个问题:

  1. 如何设置MTU?
  2. MTU设置为多少?

如何设置MTU?

什么是MTU?

MTU: MTU( Maximum Transmission Unit),最大传输单元,单位是字节。

大部分的网络设备的mtu默认值是1500。如果本机的mtu值大于网关的mtu值,大的数据包就会被拆开来传送,这样会产生数据包的碎片,增加丢包率,降低网络速度。把mtu设置比网关小或者相同,可以减少丢包。设置合适的mtu值,可以减少部分网站打不开,上网速度慢等问题。一般情况,可以把路由器、交换机和服务器的mtu值统一设置。

查看服务器的mtu值

cat /sys/class/net/网口名称/mtu

或者

# ifconfig
ens18: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1200

临时修改mtu值:(重启服务器后失效)

ifconfig  <网口名称> mtu 1200

永久生效

在NetworkManager的连接配置文件里配置mtu,在[ethernet]选项添加一行 mtu=1280:
在这里插入图片描述

MTU设置为多少?

MTU设置为多少比较合理?可以设置为PMTU的值。

PMTU是什么?

PMTU是Path MTU(Maximum Transmission Unit)的缩写,指的是在网络通信中,从源主机到目的主机所经过的所有网络设备中,能够通过的最大数据包大小。PMTU的原理是通过不断发送大小不同的数据包,直到发现一个最大的数据包能够成功传输,从而确定PMTU的大小。

PMTU的应用主要是在TCP/IP协议中,用于避免IP分片。当一个数据包的大小超过了某个网络设备的MTU时,该设备会将数据包分片,然后再将分片后的数据包发送出去。这样会增加网络传输的负担,降低网络传输的效率。因此,TCP/IP协议中的PMTU发现机制可以帮助避免IP分片,提高网络传输的效率。

怎么检测PMTU?

可以使用ping命令来检测。

PMTU最初是为IPv4路由器设计的。可以使用ICMP协议中的type和code字段发送MTU=XXX的消息,当这个ICMP消息到达IP包的源主机时,源主机将设置正确的MTU。

可以使用ping命令来检测PMTU,例如:

ping -c 4 -M do -s 1472 <IPv4 Address>

其中,-c 指定ping的次数。

-M <pmtud opt>     define mtu discovery, can be one of <do|dont|want>

Select Path MTU Discovery strategy. pmtudisc_option may be
either
do (prohibit fragmentation, even local one),
want (do PMTU discovery, fragment locally when packet size is large),
or
dont (do not set DF flag).

-M do 表示在传输过程中,IP数据包禁止分包,如果路由器收到长度比自身设置的MTU大的IP数据包,则不能拆分,只能丢弃,并在ICMP回复报文中设置MTU大小。

-s 1472 表示设置ICMP的PDU(有效载荷)为1472字节。ping 使用的是ICMP协议,ICMP的下层协议是IP协议,ICMP首部(header)共8字节,IP首部(header)共20字节,ICMP的IP数据包 = IP首部 + ICMP首部 + ICMP的PDU,所以 -s 1472 表示 整个IP数据包的长度等于20+8+1472 = 1500 字节。

如果源主机到目的主机的通信路径中有节点的MTU小于1500,则会返回ICMP消息“message too long”到达IP包的源主机:

# ping -c 4 -M do -s 1472 x.x.x.x
PING x.x.x.x (x.x.x.x) 1472(1500) bytes of data.
ping: local error: message too long, mtu=1492
ping: local error: message too long, mtu=1492
ping: local error: message too long, mtu=1492
ping: local error: message too long, mtu=1492

--- 123.103.127.118 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3051ms

推荐的MTU值是1492,去掉ICMP首部(header)的8字节和IP首部(header)的20字节,1492 - 28 = 1464,-s 的值修改为1464试试:

# ping -c 4 -M do -s 1464 x.x.x.x
PING x.x.x.x (x.x.x.x) 1464(1492) bytes of data.
1472 bytes from x.x.x.x: icmp_seq=1 ttl=49 time=20.2 ms
1472 bytes from x.x.x.x: icmp_seq=2 ttl=49 time=20.4 ms
1472 bytes from x.x.x.x: icmp_seq=3 ttl=49 time=20.6 ms
1472 bytes from x.x.x.x: icmp_seq=4 ttl=49 time=20.4 ms

--- 123.103.127.118 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 20.241/20.402/20.563/0.114 ms

将源主机的MTU值修改为1492后,问题解决。

如果仍返回“message too long”,可以逐步降低-s 的值,直至ping返回成功。

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

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

相关文章

力扣题库刷题笔记4--寻找两个正序数组的中位数

1、题目如下&#xff1a; 2、个人Python代码实现如下&#xff1a; 代码如下&#xff1a; class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: nums nums1 nums2 #合并数组 nums.sort() …

java【toString覆写】

笔试题 输出结果&#xff1a;D.func(),num0 解析&#xff1a; 继承的原则&#xff0c;先调用父类的无参构造&#xff0c;因此调用func()函数func() 此方法&#xff0c;new 的是 D 的对象&#xff0c;且被D所重写&#xff0c;触发动态绑定&#xff0c;直接调用D中的func()方法在…

Jupyter Notebook是什么及使用

一、什么是Jupyter Notebook Jupyter项目是一个非盈利的开源项目&#xff0c;源于2014年的python项目&#xff0c; Juptter Notebook&#xff0c;原名IPython Notbook&#xff0c;是IPython的加强网页版&#xff0c;一个开源web应用程序名字源自Julia、Python和R是一款程序员…

CRC校验(1):CRC原理、计算例子和最优多项式的选择

CRC(Cyclic Redundancy Check)&#xff0c;即循环冗余校验&#xff0c;它通过计算生成固定长度的校验码&#xff0c;用于验证数据在传输过程中是否发生了错误或损坏&#xff0c;从而确保数据的完整性。假设我们想把小写字母z发送出去。在Unicode中&#xff0c;z由数字0x7A表示&…

这有可能是国内最有趣的大学生知识交流社区了吧?

WRITE-BUG数字空间&#xff08;http://www.writebug.com&#xff09;内测 WRITE-BUG创建于2019年&#xff0c;创始团队主要来自于清华大学、中国人民大学等国内高校学生。运营至今&#xff0c;已累积100000注册用户&#xff0c;91%是18-24岁在校大学生&#xff0c;覆盖国内绝大…

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条 进度条 弧形进度条 圆形进度条 词云图&#xff0c; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13029 效果图如下: #### 使用方法 使用方法 <!-- 关键字 --> &l…

java设计模式之:代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额…

注意力机制和Transformer

注意力机制和Transformer 机器翻译是NLP领域中最重要的问题之一&#xff0c;也是Google翻译等工具的基础。传统的RNN方法使用两个循环网络实现序列到序列的转换&#xff0c;其中一个网络&#xff08;编码器&#xff09;将输入序列转换为隐藏状态&#xff0c;而另一个网络&…

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题 1、背景2、解决办法3、补充说明 1、背景 探测器很奇怪的叫法&#xff0c;其实就是相机。 大家在安防领域&#xff0c;智慧工厂&#xff0c;智慧学校、智慧工地等经常会看到海康、大华的网络摄像头&#xff0c; 这些摄像…

软考高级架构师笔记-7信息安全

目录 1. 前言 & 考情分析2. 信息安全1. 信安基础知识2. 信息安全系统的组成框架3. 信息安全技术4. 信息安全的抗攻击技术5. 信息安全的保证体系和评估方法3. 网络安全4. 网络安全协议1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记…

集成测试总结

集成测试 基本概念&#xff1a;将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试&#xff0c;一般来说是以模块和子系统为单位进行测试。 集成测试包含的层次&#xff1a; 模块内的集成&#xff0c;主要是测…

【编译、链接、装载六】汇编——目标文件

【编译和链接六】汇编——目标文件 一、目标文件_存储格式1、生成目标文件2、目标文件存储格式3、file查看文件格式 二、查看目标文件的内部结构——objdump三、代码段四、 数据段和只读数据段五、 ELF文件结构描述1、头文件2、段表2.1、重定位表2.2、字符串表2.3、查看重定位表…

信号完整性:反射 初步认识

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化&#xff0c;只要互连线的阻抗不连续的点&#xff0c;该处就会发生反射。 信号是以电磁波的形式在走线中传播的&#xff0c;如果从传统的电路理论角度去看&#xff0c;是无…

ZipList(压缩链表)

基本概述 ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。 基本结构&#xff1a; 各部分所占字节、基本介绍&#xff1a; entry&#xff0c;节点占用字节不固定&#xff0…

计算机图形学与opengl C++版 学习笔记 第9章 天空和背景

目录 9.1 天空盒9.2 天空穹顶9.3 实现天空盒9.3.1 从头开始构建天空盒9.3.2 使用OpenGL立方体贴图 9.4 环境贴图补充说明 对于室外3D场景&#xff0c;通常可以通过在地平线上创造一些逼真的效果&#xff0c;来增强其真实感。当我们极目远眺&#xff0c;目光越过附近的建筑和森林…

【认知提升思维篇】之 心智模式--人类的行为纪元

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;普本…

国产FPGA:替代ATLERAEP4CE10E22的AG10KL144

背景 AG10K用于PIN TO PIN替代ATLERA EP4CE10E22、EP3C10E144的FPGA&#xff0c;其资源介绍如下&#xff1a; 引脚对应如下&#xff1a; 一般Quartus II开发方式 新建工程 FPGA使用Quartus II开发&#xff0c;开发的整体流程如下&#xff1a; 新建工程时选用Cyclone II…

Liunx系统重修二【常用指令】

LIunx主要做服务器端的操作系统&#xff0c;不会做PC端操作系统的原因是因为&#xff1a; 第一图形化不好&#xff0c;第二软件生态不强&#xff01; 在Liunx系统中都是使用命令来操作&#xff01; Liunx系统中常用的指令并不多&#xff01;一天就可以学完&#xff01; 6&…

chatgpt赋能python:Python如何将图片文件上传至服务器

Python如何将图片文件上传至服务器 在现代网站设计中&#xff0c;图片的使用非常重要&#xff0c;因此将图片文件上传至服务器是一个很常见的操作。Python是一种广泛使用的编程语言&#xff0c;其拥有强大的图像处理能力&#xff0c;并提供了丰富的库来实现文件的上传和下载。…

【SCADA】KingSCADA实现小车移动控制

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 在做SCADA项目时&#xff0c;时常会涉及到控制小车运动的情况&#xff0c;今天通过样例演示在KingSCADA中实现小车移动控制。 一、界面设计及效果演示 1、主画面 以下为测试样例的简单界面。 2、效果展示 当点击…