瑞瑞哥的博客

以太网帧结构基础知识

本文是自己学习网络知识的一个学习笔记,主要对象是自己以及想了解一定网络知识的程序员,其中会涉及到原理,但是大多数内容都是定性而不定量的,如果有错误还请在下方留言(然而评论系统是disqus需要翻墙),非常感谢!!!

基础知识

MTU

最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

如果你仔细看上面的定义的话,会看到定义中包含几个重点:

  • 不同层都有它自己不同的MTU,它是跟网络模型的层是对应的。很多时候我们看到所谓MTU 1500,大多数指的是网卡的MTU,也就是数据链路层的MTU,至于它为什么是1500,下面会讲到。
  • MTU只表示能通过的最大数据大小,至于其他的校验位、同步码、报头等内容是不包含在内的。

以太网

以太网帧格式

1
2
目的网卡地址           源网卡地址 下一条协议      数据             检验位
6 byte 6 byte 2 byte >46 < 1500 4 byte

以太网帧由5个字段组成

  • 前两个字段分别为6字节长的目的地址和源地址地段。

  • 第三个字段是 2 字节的类型字段,用来标志上一层使用的是什么协议。

    类型字段的值为0x0800时,表示上层使用的是IP数据报。 类型字段的值为0x0806时,表示上层为ARP数据报 类型字段的值为0x8137时,表示该帧是有Novell IPX发过来的。

  • 第四个字段是数据段:长度在 46 到 1500 字节之间

  • 第五个字段是 4 字节的帧检验序列 FCS.

注(FAQ)

  1. 有这么个说法:“以太网的帧不能太大也不能太小”,有这么回事吗?

    答:原来有这么回事,现在也算有吧。

    帧不能过小:

    ​ 原来以太网使用总线拓扑,你发的时候我就不能发,否则发生碰撞。电信号是很快的,过短的帧会导致帧传输时间非常小。以至于在一个局域网的物理环境中,想要给远一点的设备传数据帧的时候。帧在发完之后还有设备没有探测到这个帧,于是也开始使用信道,这是就会发生碰撞。并且,帧的发出者并不知道帧发生了碰撞。因为以太网没有提供可靠传输的机制,帧的发出者在发送完帧后认为帧传输完成,不会再发送这一帧。解决这个问题的办法,就是让发送一个帧的时间不要太短,这样即便最坏情况发生,也能合理处理里面的问题(具体的计算公式和原理略去)。

    帧不能过大:

    如果帧过大的话,那么一个人使劲发,另一个人使劲收,收的那个人缓冲区可能会不够,而且其他人就没法发了,只能等着;同时帧太大的话,出错概率也回增大,还要重传。不过现在已经有jumbo帧了。

  2. 上面问题中所说的太大,太小是多大?

    答:由于上一问的原因,都知道帧不能过大或者过小,所以就给出了MTU 为46-1500的范围(根据rfc894的说明,以太网封装IP数据包的最大长度是1500字节)。

  3. 既然都说了帧的最大MTU是1500,为啥我还能看到1514,1518,1526等各种花式的、奇怪的大小?

    答:上文的以太网帧格式,如果有忘记的可以先去看一下。

    具体来说,网卡发送报文的时候,会先发送7字节的前导同步码,1字节的帧开始定界符。

    然后发送帧,6字节目的网卡地址,6字节源网卡地址,2字节帧的类型,数据内容,

    最后网卡发送4字节的FCS( Frame Check Sequence,用于保存帧的CRC校验值),具体来说如下图:

    • 7 + 1 (前导同步码,帧开始定界符)
    • 6 (目的网卡地址)
    • 6 (源网卡地址)
    • 2 (帧的类型)
    • 46-1500 (数据内容)
    • 4 (FCS)

    要知道,前面7+1字节和最后4字节的校验,是跟物理层有关的,即网卡会去掉前面7+1字节,然后开始校验,如果校验结果和校验值一样,就把校验值去掉,就把帧(去掉前面8、后面4字节)交给设备驱动程序;如果校验失败,就丢弃帧。所以严格意义来说,前面8个字节和后面4个字节的大小是不算在帧大小里的。

    因此最大帧大小应该就是 6 + 6 + 2 + 1500 = 1514

    然而,有些地方会把最后4字节校验码也算是,那么这样就是1518,如果再把前面8个字节也算上那就是1526(然而我认为前8后4是网卡负责的,不应该有事没事算进去哈)。

    前面已经提到,巨型帧这玩意出现,你可以看到大于1518的帧了,感兴趣的自行搜索巨型帧。

  4. 802帧是什么呢?vlan又是什么?

    答:

    802帧:

    具体的细节详见这里吧:为什么又有以太网协议,又有802协议,那么网络到底用哪种协议,另外以太网帧和802帧都用在什么地方?

    总之就是以太网的帧目前是主流,但是两种都兼容

    VLAN:

    VLAN(Virtual Local Area Network,虚拟局域网),它的存在的主要目的是隔绝广播域。这里注意和子网划分区别开,如果不清楚的可以去搜一下。带VLAN的帧结构和标准帧结构对比图如下:

    VLAN帧_标准帧格式对比.png

    可以看出,在原来的“类型”部分之前加了:

    • TPID (Tag Protocol Identifier,也就是EtherType)
    • TCI (Tag Control Information) ,包括用户优先级(User Priority)、规范格式指示器(Canonical Format Indicator)和 VLAN ID。

    其中VLAN ID是12bit的,因此VLAN ID最多是4096个,这是一个需要知道的细节,当然后来有技术突破了这个限制,还有Vxlan这种东西。下图可以看出带VLAN的以太网帧虽然在报头部分,多了4字节,但是数据段大小不变,这也就代表实际的帧大小也会扩大4字节。

    带VLAN的以太网帧格式_WIKI.jpg

参考文献:

http://blog.chinaunix.net/uid-20620288-id-3521720.html

http://wushank.blog.51cto.com/3489095/1132145

https://github.com/wenxueliu/draft/blob/master/network/ethernet_arp_icmp.md#以太网

https://zh.wikipedia.org/wiki/%E4%BB%A5%E5%A4%AA%E7%BD%91%E5%B8%A7%E6%A0%BC%E5%BC%8F