zoukankan      html  css  js  c++  java
  • MTU 和 MSS 关系、 IP分片、TCP分段

    从四层模型:链路层,网络层,传输层,应用层说

      

    一 、以太网V2格式数据帧 : 链路层

    Destination   Source  Type  DataAndPad  FCS

          6              6          2      46~1500       4

    二、IP: 网络层

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |Version|  IHL  |Type of Service|          Total Length         |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |         Identification        |Flags|      Fragment Offset    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Time to Live |    Protocol   |         Header Checksum       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                       Source Address                          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                    Destination Address                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                    Options                    |    Padding    | <-- optional
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            DATA ...                           |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    注意:Source Address 和 Destination Address 在IP层, Source Port 和 Destination Port 在传输层。 

    当发送端的MTU大于到目的路径链路上的MTU时就会被分片。

     

    Flags取值

    Bit 0: 保留,必须是0
    Bit 1: (DF) 0 = 可能分片, 1 = 不分片
    Bit 2: (MF) 0 = 最后的分片, 1 = 还有分片

    要不分片的包,值应该是01000000 = 64

    tcpdump 'ip[6] = 64'

    三 、TCP或UDP : 传输层

    1)TCP

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |          Source Port          |       Destination Port        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                        Sequence Number                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                    Acknowledgment Number                      |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Data |       |C|E|U|A|P|R|S|F|                               |
     | Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             |
     |       |       |R|E|G|K|H|T|N|N|                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |           Checksum            |         Urgent Pointer        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                    Options                    |    Padding    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                             data                              |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

    数据偏移(Data Offset),4bits,单位为4字节,它指出TCP报文头长度

    2)UDP

      0      7 8     15 16    23 24    31
     +--------+--------+--------+--------+
     |     Source      |   Destination   |
     |      Port       |      Port       |
     +--------+--------+--------+--------+
     |                 |                 |
     |     Length      |    Checksum     |
     +--------+--------+--------+--------+
     |                                   |
     |              DATA ...             |
     +-----------------------------------+
    

     UDP有报文长度字段,TCP没有报文长度字段

    四、 TCP或UDP中的数据(Data) : 应用层

    http协议请求

    数据帧{IP包{TCP或UDP包{Data}}} 

    以太网的物理特性决定了数据帧的长度范围为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500

    在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480

    在传输层,对于TCP包的首部要占用20字节,所以这的MTU为1480-20=1460

    五、MTU 和 MSS 关系

    1、最大传输单元MTU(Maximum Transmission Unit,MTU)

    (1)以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492个字节。链路层的这个特性称作MTU。

    如果IP层有一个数据要传,且数据的长度比链路层的 MTU还大,那么IP层就要进行分片(fragmentation)。

    (2)把一份IP数据报进行分片以后,由到达目的端的IP层来进行重新组装,其目的是使分片和重新组装过程对运输层(TCP/UDP)是透明的。

    (3)尽管IP分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?

    因为IP层本身没有超时重传机制,由更高层(比如TCP)来负责超时和重传。

    Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
    enp3s0    1500  7580450      0      2 0       6890759      0      0      0 BMRU
    lo       65536     1584      0      0 0          1584      0      0      0 LRU

    2、MSS(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念

    (1)MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,

    这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460

    通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

    (2)TCP无所谓分段,因为每个TCP数据报在组成前其大小就已经被MSS限制了,所以TCP数据报的长度是不可能大于MSS的,由它形成的IP包的长度也就不会大于MTU,因此不用IP分片

    简而言之:

            1.IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS.

            2.IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组.   //透明性

            3.对于以太网,MSS为1460字节,而MUT往往会大于MSS.    

            故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。

      

    6、示例

    PC--1--TP_Link --2--宽带路由器--3--电信公司----微信服务器

    在节点3处由于有额外8个字节的PPPoE头部封装,从服务器下行的1500字节IP包将会变成1508字节,按理说电信公司会依据:

    IP包里的DF = 0 ,分片传输,这样不会有问题。

    IP包里的DF = 1,丢弃,并发送ICMP告诉服务器包太大了,但是有时ICMP无法到达服务器(禁止ICMP),微信服务器一直重传1500字节包含图片的IP包,然后被丢弃,就会造成流量黑洞

    解决方案:

    修改节点1处的MTU = 1492 或更小。两端都需要修改,保持对称。这样TCP协商MSS,可以协商成1452。

    这样上下行数据途径节点3处,整个包将变为: PPPoE + IP Header + TCP Header + TCP segment (MSS) = 8 + 20 + 20 + 1452 = 1500,正好等于MTU 1500,无需分片就不会有问题。

    参考

    tcpdump 使用

    思维导图:熟悉TCP/IP协议

  • 相关阅读:
    使用Mongodb存放文件系统的离线栅格数据,供Cesium访问
    Moogose的基本连接以及增删改查操作
    MongoDB
    Linq对列表进行分组,求和,排序
    ArcEngine对属性表的操作
    ArcEngine打开GDB,SHP的方法
    javaweb之JSP+Servlet
    node.js后端之sequelize
    javascript的闭包
    LeetCode 第133场周赛总结
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/8120741.html
Copyright © 2011-2022 走看看