MTU与MSS基础


MTU_最大传输单元
MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小(_是不包含其自己的二层头本身的);以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束(对IP层的),如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。

MSS_最大报文段长度
MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层(应用层)最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有 2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。

IP分片与TCP分段区别


首先应称为:

  1. IP分片
  2. TCP分段:而不是TCP分片,两个是不同的概念


区别: **

  1. IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS.
  2. IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组. //透明性
  3. 对于以太网,MSS为1460字节,而MTU往往会大于MSS.,故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,也只会在传输层进行数据分段(TCP分段),到了IP层就不用分片。
  4. 而我们常提到的IP分片是由于UDP传输协议造成的,因为UDP传输协议并未限定传输数据报的大小,同时四层UDP协议也没有分段机制(TCP有协商MSS,还有TCP分段机制),四层无法分段,就只能由三层IP层来分片了
  5. 总结:UDP不会分段,就由我IP来分。TCP会分段,当然也就不用我IP来分了!

image.jpeg

IP分片与重组


在IP首部中,标识、标志、片偏移这三部分就是与分片的字段。
image.jpeg
标识(Identification):
占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

标志(Flags ):**
标志(flags)占用3位(即16 - 18),这三位分别是:R,D,M三位,第一位是保留位,没有被使用,目前只有后两个比特有意义。

  • R:标志字段中的第一位是一个保留位,现在还没有使用,可能将来会用到这位
  • D:标志字段中间的一位是 DF (Don’t fragment),表示传输的数据不允许分片。一般DF = 1的话,表示数据一次性传输过去,不允许分片;DF = 0允许分片,其实,数据报的分片和重组都是由机器自动完成的,因此设置DF位的真正意义在于,程序员可以控制数据报的分片过程,这为程序调试提供了方便和灵活性。。
  • M:标志字段的最低位是 MF (More fragment)。代表数据是否分片,如果MF位值为1,表示后面还有数据,还没有传输完毕,相当于数据分片,分批次传输,如果MF = 0表示最后一个分片或者只有一个分片。

这三位同一时刻也是只能有一个位的值能设置为1

片偏移(Fragment offset):
占用13位:每次分片传输的数据之间的偏移距离,也就是某分片的数据在原数据中的相对位置,
一般偏移以8字节为单位(所以计算为bit时需要乘8)。比如:在网络层传输的ip数据报总长度最大不能超过65535字节,如果超过了,要么对ip数据报进行分片传输,否则将丢弃。
互联网协议使网络互相通信。设计要迎合不同物理性质的网络; 它是独立于链路层使用的基础传输技术。具有不同硬件的网络通常会发生变化,不仅在传输速度,而且在最大传输单元(MTU)。当一个网络要的数据报发送到具有较小MTU的一个网络,它可能片段的数据报。
当路由器收到一个数据包时,它会检查目的地址,并确定出接口使用,并且该接口的MTU。
如果分组的大小是比MTU大,并且在该分组的头中的不分段(DF)位被设置为0,则路由器可对其进行分片。
分片机制有一定的缺陷:分片越多,分片丢失的机率就越大,对于一个数据报,一旦一个分片丢失,那么整个数据报就要重传;每一个数据报都要复制报头(只复制ip包头),这在一定程度上增加了带宽消耗。

重组
组装时,需要重新设置首部的某些字段:

  1. 修改分片标志和片偏移量字段
  2. 首部其他字段复制原来数据报首部的相应字段。

在IP头里面有16bit的识别号唯一记录了一个IP包的ID,以确定这几个分片是否属于同一个包,具有同一个ID的IP分片将会从新组装。13bit的片偏移记录了一个IP分片相对于整个包的位置。3bit的标志位记录了该分片后面是否还有新的分片。这三个分片组成了IP分片的所有的信息。

例:**
有一数据报总长度4820,字节,首部20字节,数据4800字节。某一网络能传送的数据报的最大长度是1420字节,该如何分片?
image.jpeg
当需要进行分片时,在每个数据报片的首部存放着该数据报的标识、标志位和片偏移,在进行重组时,标识用来分辨该数据报片的原数据报是哪个,标志位中的MF用来分辨这是不是原数据报的最后一片,片偏移用来分辨这个数据报片相对原数据报的位置。通过这几个字段,可以稳定的完成数据报的分片与重组操作。

TCP分段与重组


MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次,一去一回,双方分别发送自己的MSS,协商最小值)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x2.5时)为576,那么如果不设置,则MSS的默认值就为536个字节。很多时候,MSS的值最好取512的倍数。TCP报文段的分段与重组是在运输层完成的。

TCP在建立连接时进行三次握手,前两个握手包中双方互相声明自己的MSS,客户端声明MSS=8960,服务器端声明了MSS=1460。三次握手之后,客户端的MTU值比服务器端大,如果发送一个9000字节的包过去可能被分片或丢弃。因此客户端会把自己的MSS也降到1460字节。

TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。

再来看UDP数据报,由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP(在网络层中)同样会出现IP分片情况(只有IP协议)