文章首发于公-众-号,汽车网络诊断通信

我们知道MTU是网卡的参数,是数据链路层对网络层的IP包大小的限制。当网络层的IP包(包括IP头,VLAN tag)的大小超过了MTU时,需要先在网络层进行分片,切割成小于MTU的IP包,再发往链路层

MSS

试想下,一台主机下的多个APP需要通过TCP协议,发送大量的数据进行通信。形成这样一种局面:多个TCP报文,到达网络层时,封装成多个IP包,这些IP包由于数据太大,大于MTU,需要进行分片,才能发往链路层。这么多的数据包都需要在网络层分片切割,是不是降低了效率?

既然从TCP来的数据由于太大,而全部挤在网络层进行分片,为什么不想一个办法,让TCP来的每一份数据,正好符合在网络层不需要分片呢,这样岂不是你好我好大家好

MSS

Maximum Segment Size,最大报文长度,TCP payload的最大值,TCP协议定义的一个选项,MSS是TCP用来限制应用层最大的发送字节数

MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度

TCP在建立连接时,收发双方根据MTU计算出各自的MSS,通过三次握手把自己的MSS告知对方,互相确认彼此的MSS大小,取较小的MSS值作为双方在TCP层分段的最大payload

如何根据MTU计算MSS?

以太网的缺省MTU = 1500 = IPHeader(20) +TCPHeader(20) + Data,TCP的有效数据Data的最大值就是1500-20-20 = 1460,这就是MSS的值

客户端在SYN报文中携带自己的MSS,服务器在回复的ACK+SYN中携带自己的MSS

这样就实现了TCP通信时,通过在三次握手阶段确定最小MSS,根据MSS,传输层把不超过MSS的数据封装,下压给网络层,网络层避免了IP包分片,而接收方也不会出现数据帧超过MTU而无法接收的情况

PMTUD

收发双方在TCP协议通信时,根据取较小MSS的原则,避免了发送方在网络层分片,接收方在网卡由于超过MTU而无法接收的情况

但是,以太网通信不是只有两台主机,它们通信的途中还有路由器和交换机,路由器和交换机都有自己的MTU,如果数据帧超过了它们的MTU会怎么样呢?

对于路由器来说,接收到的数据帧如果超过了自己的MTU,在从出口发出去时,需要进行分片,网络层分片IP包,需要根据什么决定?

答案是:IP头的DF分片位

  • 如果DF = 0,表示可以分片
  • 如果DF = 1,表示不能分片

DF = 0

两台主机在TCP握手阶段,确定了MSS = 1480 - 20 - 20 = 1440,那么发送的IP包就是1440 + 20 + 20 = 1480,这样的IP包在发出去的时候不会分片,而接收端也可以接收到

当IP包到达路由器时,需要从另一个接口发出,而接口MTU为1450,必须分片才能发送,这时候路由器就会检查IP包的DF位,以确定这个IP包是否支持分片

发现DF位是0,表示可以分片,就把这个IP包分成两份,1450和30,由于第一份1450是有IP头的,可以直接下发到链路层发出,而第二份30是没有IP头的,需要加上IP头20个字节,形成一份新的IP包,大小是50个字节,同样下发到链路层,发出

DF = 1

与上面DF = 0的情况不同的是,路由器发现IP包需要分片,然而查看了IP包的DF位,发现值为1,显示不能分片,此时路由器只能丢弃此IP包,同时给源主机回复一个ICMP目的不可达的消息,Type = 3,code = 4

code = 4的含义是:

同时,在ICMP消息里还会携带路由器的MTU的大小,告知源主机这个路由器的MTU是多少,这样源主机就可以继续调整自己的MSS值,如果有多个路由器,多个路由器都会这样操作,最终确定一个这条路径上的最小MTU,这就是PMTUD

另外,ICMP目的不可达消息,还会把丢弃的IP包的各层报头也放在里面

PMUTD

Path MTU Discovery,不用再过多解释了

另外请注意

路由器的MTU只针对出接口

PMTUD只有TCP支持,UDP并不支持


一文搞懂什么是MSS相关推荐

  1. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  2. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  3. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  4. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  5. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  6. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  7. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  8. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下

    B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...

  9. 一文搞懂CAN FD总线协议帧格式

    目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...

最新文章

  1. Winform窗体初始化Combox控件并模糊查找内容
  2. 创业互联网公司如何搭建自己的技术框架
  3. python 之 collections
  4. guid主分区表损坏怎么办_轻钢龙骨隔墙怎么办?轻钢龙骨隔墙的做法
  5. 项目前的知识点准备(1)
  6. Android开发的之基本控件和详解四种布局方式
  7. jQuery基础 - 选择器
  8. micro usb接口定义图
  9. linux下go语言代理
  10. 5-网站日志分析案例项目回顾与点击流数据分析项目介绍
  11. mysql 关闭防火墙 命令_linux常用命令和关闭防火墙
  12. 客户端和服务器的通信协议,客户端和服务器的通信协议
  13. SQL高级教程(三十)- - SQL NULL 函数
  14. 盘点那些与动植物有关的姓氏,鼠、蛇、蒲、枣、桂...都是姓氏
  15. 榕树贷款利用AI人工智能技术发送非常迅速(榕树贷款)
  16. Merriam-Webster‘s Vocabular Builder ( PAC )
  17. 致远项目管理SPM系统进度控制之进度对比分析
  18. 亲子编程玩Micro:bit-动力小车“麦昆”
  19. 互联网晚报 | 小米公布“汽车设计文件泄密”事件处理结果;蔚来回应最高超10万元降价促销;苹果发布2023财年第一财季财报...
  20. oracle redo wait较高,【案例】Oracle等待事件latch:row cache objects原因和解决办法

热门文章

  1. 屏幕输出类似LED显示屏效果的字母拼图
  2. 另一个程序正在使用此文件,进程无法访问
  3. [VS2019 C#] 写一个PC上位机
  4. draw2d根据两点位置画圆弧
  5. 【向生活低头】拷贝文件到文件夹中
  6. 不要试图和下属做朋友
  7. 一觉醒来,我掉入了计算机之中···
  8. 【Proteus仿真】51单片机+LCD1602驱动显示模板程序
  9. pandas数据处理120题
  10. Ubuntu10.04登陆界面键盘无法用