一旦DF位置一,将不允许中间设备对该报文进行分片,那么在遇到IP报文长度超过中间设备转发接口的MTU值时,该IP报文将会被中间设备丢弃。在丢弃之后,中间设备会向发送方发送ICMP差错报文。
为了简单直观的展示这个交互的过程,我做了下面这个图示:

我找了一个实际环境下捕获的ICMP需要分片但DF位置一的差错报文,下图为其解码格式:

我们可以看到其差错类型为3,代码为4,并且告知了下一跳的MTU值为1478。在ICMP差错报文里封装导致此差错的原始IP报文的报头(包含IP报头和四层报头)。

一旦出现这种因DF位置一而引起丢包,如果客户端无法正常处理的话,将会导致业务应用出现异常,外在表现为页面无法打开、页面打开不全、某些大文件无法传输等等,这将严重影响业务的正常运行。
那么客户端如何处理这种状况呢?
TCP主要通过两种方式来应对:
1, 协商MSS,在交互之前避免分片的产生
2, 路径MTU发现(PMTUD)

TCP MSS

TCP在三次握手建立连接过程中,会在SYN报文中使用MSS(Maximum Segment Size)选项功能,协商交互双方能够接收的最大段长MSS值。
       MSS是传输层TCP协议范畴内的概念,顾名思义,其标识TCP能够承载的最大的应用数据段长度,因此,MSS=MTU-20字节TCP报头-20字节IP报头,那么在以太网环境下,MSS值一般就是1500-20-20=1460字节。
客户端与服务器端分别根据自己发包接口的MTU值计算出相应MSS值,并通过SYN报文告知对方,我们还是通过一个实际环境中捕获的数据报文来看一下MSS协商的过程:

这是整个报文交互过程的截图,我们再来看一下客户端的报文详细解码:

上图为客户端的SYN报文,在其TCP选项字段,我们可以看到其通告的MSS值为1460;我们在看看服务器端的SYN/ACK报文解码:

上图为服务器端给客户端回应的SYN/ACK报文,查看其TCP选项字段,我们可以发现其通告的MSS值为1440。

交互双方会以双方通告的MSS值中取最小值作为发送报文的最大段长。在此TCP连接后续的交互过程中,我们可以清楚的看到服务器端向客户端发送的报文中,TCP的最大段长度都是1440字节,如下图解码所示:

通过在TCP连接之初,协商MSS值巧妙的解决了避免端系统分片的问题,但是在复杂的实际网络环境下,影响到IP报文分片的并不仅仅是发送方和接收方,还有路由器、防火墙等中间系统,假设在下图的网络环境下:

中间路径上的MTU问题,端系统并不知道,因此需要一个告知的机制,这个机制就是路径MTU发现(PMTUD: Path MTU Discovery )!

PMTUD

说起PMTUD,我们必须在此回到上面讲到的ICMP需要分片但DF位置一差错报文,还记得那个ICMP差错报文中有一个字段是告知下一跳的MTU值的吗?PMTUD正是利用ICMP需要分片但DF位置一差错报文的这一特性来实现的。
       发送方在接收到该差错报文后,会根据该报文给出的下一跳的MTU值计算适合传输的最大段长度,从而在后续的发送报文过程中,避免在中间路径被分片的情况产生。
       这在端系统主要是通过在路由表里临时添加目的主机路由并将ICMP差错报文告知的下一跳MTU值跟该主机路由关联起来来实现。
       PMTUD的确是个非常不错的机制,但是在复杂的实际网络环境中,有时候会失效,因为为了安全起见,有些网络管理员会在路由器、防火墙等中间设备上设置过滤ICMP报文的安全策略,这将导致ICMP差错报文被这些中间设备丢弃,无法达到发送方,从而引起PMTUD的失效,网上有个宫一鸣前辈共享的案例——《错误的网络访问控制策略导致PMTUD 实现故障一例》,该案例正是说明这种情况绝好的例子,大家可以自行百度此文档学习参考。

值得一提的是PMTUD仅TCP支持,UDP并不支持PMTUD。

由于PMTUD可能存在ICMP差错报文被过滤的情况,很多中间设备的接口支持adjust tcp mss设置功能,思科路由器一般是在接口模式下使用命令“ip tcp adjust-mss 1400 ”来做设置,其他的品牌产品的相关设置大家可在实际工作环境下自查相关品牌和产品的使用手册。

这个功能主要是通过由中间设备修改经过其转发的TCP SYN报文中的MSS值,让中间设备参与进TCP 三次握手时SYN报文的MSS协商来避免分片。

需要注意的是,该功能不像MTU值,只针对出接口,此功能一旦开启,其将针对该接口的收发双向有效。 
我做一个简化环境下的工作过程图示以便于大家理解其工作过程:

TCP/IP协议:最大报文段长度(MSS)是如何确定的(2)相关推荐

  1. TCP/IP协议:最大报文段长度(MSS)是如何确定的

    TCP提供的是一种面向连接的,可靠的字节流服务,TCP提供可靠性的一种重要的方式就是MSS.通过MSS,应用数据被分割成TCP认为最适合发送的数据块,由TCP传递给IP的信息单位称为报文段或段(seg ...

  2. TCP/IP协议:最大报文段长度(MSS)是如何确定的(3)

    一.实际使用中的问题 用户在使用路由器访问Internet时,经常会反馈不能访问网页(或部分网页)以及使用Outlook收发邮件(这些应用是基于TCP或UDP的),但进行Ping包时没有问题,这时候检 ...

  3. 有jar包直接加密tcp请求报文_干货 | 终于有人能把TCP/IP 协议讲明白了!

    原标题:干货 | 终于有人能把TCP/IP 协议讲明白了! 如果你还对各类协议归属.作用也都傻傻分不清,那么你有必要详尽了解下 TCP/IP协议了. 一图看完本文 一. 计算机网络体系结构分层 计算机 ...

  4. tcp报文格式_腾讯面试中的TCP/IP协议简述+经典面试题

    面试题有福利 TCP/IP协议简述+ TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器, ...

  5. TCP/IP协议、请求报文和响应报文

    一.TCP/IP协议 1.计算机与网络设备相互通信 计算机与网络设备要相互通信, 双方就必须基于相同的方法. 比如:如何探测到通信目标. 由哪一边先发起通信. 使用哪种语言进行通 信. 怎样结束通信等 ...

  6. 深入理解TCP/IP协议-TCP建立与终止连接

    转载自  深入理解TCP/IP协议-TCP建立与终止连接 一.引言   TCP 是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.连接创建与终止的状态变化图如下: ...

  7. TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

    TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收. 利用滑动 ...

  8. TCP/IP协议头部结构

    一 TCP/IP协议族体系结构 数据链路层:数据链路层主要使用ARP(地址解析协议) RARP(逆地址解析协议)网络层使用IP进行寻址.而数据链路层使用物理地址.网络层必须将目标及其的IP转换为物理地 ...

  9. 04 TCP/IP协议详解

    目录 章节目标 4.1 概述 1.为什么会有TCP/IP协议 2.介绍 4.2 TCP/IP协议族 4.2.1 TCP/IP协议栈 1.协议的分层 2. 主机与主机之间通信的三要素 3.应用层 4.传 ...

  10. tcp/ip协议知识详解

    一.TCP/IP参考模型 ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI ...

最新文章

  1. 编码 Unicode utf-8
  2. 安卓手机挂载Linux,android 挂载NFS教程
  3. 飞秋下载2010正式版最新
  4. 风格化图像_CVPR2019:基于神经网络纹理转换的图像超分辨率
  5. 《开学第一课》观后感—吕中琪
  6. stm8s电机库vtimer_SetTimer()函数的使用
  7. 我国会计界计算机软件界大规模研究,初级会计电算化第一章练习.doc
  8. python做考勤表_500行Python代码打造刷脸考勤系统,其实也就那么简单
  9. switch删除用户显示正在维护服务器,Switch即将迎来6.0更新 账号与用户无法再正常解绑...
  10. 批量修改图片的尺寸,MATLAB操作,上手简单,保证能用
  11. 【微信小程序】小程序是什么?怎样快速上手开发一个小程序?
  12. 12月6日云栖精选夜读:语音购票、刷脸进站:上海联手阿里打造全球首个AI地铁之城...
  13. nacos实现服务注册与两种消费方式
  14. CorelDRAW VBA - 第一个Hello World程序
  15. 15 个边玩游戏边学编程的网站
  16. 【译】A Fully Spiking Hybrid Neural Network for Energy-Efficient Object Detection
  17. c语言中fl,用C语言操作SPMC75内部FLSASH.doc
  18. flink消费kafka从指定时间消费offset的日志
  19. linux php验证码,openwrt路由器搭建PHP并用PHP识别验证码
  20. echarts实现西安地铁图

热门文章

  1. fftw_plan_many_dft 使用
  2. 一二层攻击及防御(物理层、数据链路层)
  3. ASCII文件和bin二进制文件的区别是什么
  4. (转载)Python常见字符编码间的转换
  5. r9 4900h和r9 4900hs的差别
  6. 虚拟机vmware网络电缆被拔出问题解决
  7. C++11 智能指针
  8. 编译Android源码(2) ---- envsetup.sh文件分析
  9. 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目
  10. DELL inspiron n5010外接耳机有声,外放喇叭没声解决方法