zoukankan      html  css  js  c++  java
  • MTU MSS PDU SDU

    首先要说两个概念:

    PDU:协议数据单元,计算机网络各层对等实体间交换的单位叫做PDU,不同层的PDU名称不同

    名称
    应用层 数据
    传输层 段 segment
    网络层 数据包 package
    链路层 帧 frame
    物理层 比特 bit

    SDU:服务数据单元,它是指PDU的实际载荷(payload)

    PDU和SDU有什么关系呢?

    在每一层都有PDU和SDU,在本层中SDU加上额外协议信息构成本层的PDU,行话是同一层内的SDU是本层PDU的静荷载(payload),不同层之间,上层的PDU是下层的SDU。在上次向下层传输数据的时候,上层使用下层提供的数据接口给下层传递数据,而不同层之间的PDU转换是由下层完成的(这个转换是说对上一层传递过来的PDU进行包装变成本层的PDU也就是变成符合本层协议对数据的格式要求)。如果上层PDU超过下层SDU,那么本层就要把数据 切割成若干适合的片段再给下层(对本层的SDU切割,然后每个切割后的SDU加上本层的协议信息构成一个本层的PDU传递给下层,本层的PDU大小必须不能大于下一层的SDU)。

    本层的PDU是由下层的SDU大小决定的,所以一直往下走就到了数据链路层,那么上次传递过来的单个PDU不能超过链路层的SDU,而链路层的PDU叫做帧,在以太网中它的MTU是1500,所以上层传递过来的单个PDU不能超过1500字节,IP首部站20个字节,TCP首部占20个字节,那由此得出TCP层的SDU为1460字节(也叫做MSS,最大消息长度),PDU为1480字节;IP层SDU为1480而PDU为1500.

    TCP的MSS不是固定的它受对端影响,在TCP传输中MSS是通信双方协商而来的。下面看一下不同链路的MTU大小

    数据链路 MTU bytes 总长度 bytes
    IPv4 65535  
    IPv6 65575  
    以太网 1500 1518
    FDDI 4352 4500
    IEEE 802.3 1492 1581
    PPPoE 1492  

    传输层本身是没有长度限制的,但是在TCP首部的MSS选项中是一个16位字段最大值为65535字节,IP层也是是65535字节,所以它俩很合适,只是受到链路层影响才会导致传输层消息要分段以及IP报文要分片。因为以太网默认MTU1500,如果真有一个65535的IP报文的话那么它显然无法封装到单个帧里,所以就需要进行切割。这种切割可以在发送端完成也可以在传送过程中完成(路由器),但是重组肯定是在接收端。所以TCP/IP为了提高效率尽量避免IP分片和重组,所以TCP就根据MSS和MTU限定每个传输层的PDU大小,这样每一个PDU就是一个完整的PDU在传送过程中不会再被切割,接收端的传输层收到这些段之后进行数据重组,实际上MSS的目的也就是为了告诉对端我的重组缓冲区大小是多少。所以这也就是为什么在传输层有一个MSS的东西存在了,一句话就是向对端TCP告知对端在每个分段中能发送的最大TCP数据量,这个MSS是在双方建立TCP连接时协商出来的。MSS经常设置成MTU减去IP和TCP首部的固定长度,在以太网中是1460字节。

    总结来看,MTU是死的由具体链路决定,而MSS是不固定的通过协商而来。但两个通信双方协商出来的MSS不会大于路径MTU(通信双发路径中最小的MTU,因为通信双方走的路可能不同,也就是A到B的路径与B到A的路径不一定相同)。

  • 相关阅读:
    使用koa+mongodb构建的仿知乎接口(二)
    使用koa+mongodb构建的仿知乎接口(一)
    flask学习笔记
    后端遇到一些问题
    前端项目一些细节总结
    python基础学习
    vue本地运行项目使用iframe的跨域问题
    hover状态下改变图片颜色的方式 悬停图片切换;css变量;悬停svg图片改变颜色;VUE
    深拷贝
    git初使用
  • 原文地址:https://www.cnblogs.com/rexcheny/p/9572811.html
Copyright © 2011-2022 走看看