以太网最大传输单元-MTU

Zss 发表于:

首先不同的网路中的传输单元的大小也不一样,PPPOE的最大接收单元为1492,以太网最大载荷为1500 octets,PPPOE头为6 octets,PPP协议ID为2 octets,所以PPP的MTU最大不能超过1492

在计算其他的最大传输单元,基本都是最大值来减去开销值

拿最常间的以太网来看:

1.1518B

以太网帧的规定最大单位为:1518B,以太网帧头和帧尾是必须需要占用一定字节的,这两部分分别为MAC地址和校验位,分别为14字节个4字节

      首先来看下以太网(IEEE 802.3)帧格式:

1、前导码:7字节0x55,一串1、0间隔,用于信号同步

2、帧起始定界符:1字节0xD5(10101011),表示一帧开始

3、DA(目的MAC):6字节

4、SA(源MAC):6字节

5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)

6、数据:46~1500字节

7、帧校验序列(FCS):4字节,使用CRC计算从目的MAC到数据域这部分内容而得到的校验和。

2.1500B

1500B也就是以太网的最大传输单元了,它是去除以太网帧所占用的字节,能够给到上层封装数据的最大单位,怎么来的呢?

以太网帧的最大单位为:1518,那么以太网帧头和帧尾分别占用了14个字节和4个字节,去除这必须占用的18个字节那么就是1500B

而这1500B就是可以给到网络层传输层应用层封装数据的最大值

 

3.46B

46B就是以太网的最小传输单元了,和最大传输单元一致,规定为46B,这其中还会有IP层和传输层的包头的必要开销

以太网规定,以太网帧数据域部分最小为46字节

 

4.64B

64B是以太网传输单位的最小值,实际上是规定那个了最小的传输数据为为46字节,那么加上18字节的以太网帧必要开销,也就是64B

其中这46字节中包含了IP层和传输层必要开销,所以实际封装的应用层data数据会要变得更加小,至于为什么是46B,这个似乎是和传输效率和容错有关

 

5.UDP 的包大小

可以这么来计算,1518(最大的以太网帧)- 18(以太网帧必要开销)- 20(IP层包头开销)- 8(UDP包头开销)= 1472B

那么最小值呢? 64(最小的以太网帧)- 18(以太网帧必要开销)- 20(IP层包头开销)- 8(UDP包头开销)= 18B

1472B也就是能给到UDP所使用的最大值了,所得到了UDP能使用的范围为   18B~1472B

当数据远大于这个值时,那么数据就会发生分片,譬如一个数据块最大的65535- 20 – 8 = 65507B 发送出来,这个值远大于1472,那么在传输的过程中,以太网会将其分片,分成多个1472来传输,

但是UDP却并不具有数据校验,错误重发等一系列的可靠性操作,所以这过程中很容易就会发生错误,那么尽量避免这种错误的一种方式是UDP变成时尽量使用18~1472B来实现

这就是在使用到UDP编程时为什么需要每块数据的发送尽量在18~1472B中

 

6.TCP的包大小

如UDP的计算方式一致,

1518(最大的以太网帧)- 18(以太网帧必要开销)- 20(IP层包头开销)- 20(TCP包头开销)= 1460B

那么最小值呢? 64(最小的以太网帧)- 18(以太网帧必要开销)- 20(IP层包头开销)- 20(TCP包头开销)= 6B

1460B也就是能给到TCP所使用的最大值了,所得到了UDP能使用的范围为   6B~1460B

在前阵子的使用TCP和UDP在局域网中发送数据的情况来看,UDP当时用大于1472B的数据块发送时特别容易发生错误

但是使用TCP时,将其每个数据块增加到65535时,也不会发错误,也就顺带验证了TCP比UDP是更加可靠的