一、前言
网络经常会遇到一些词汇,比如包、报文、帧,其概念如下:
1)帧(frame):数据链路层的协议数据单元,它包括三部分:帧头、数据部分、帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等。
2)数据包(packet):在TCP/IP协议通信传输中的数据单元,也称为“包”。指自包含的,带有足够寻址信息,可独立地从源主机传输到目的主机,而不需要以来早期地源主机和目的主机之间交换信息以及传输网络地数据包。
3)报文(message):是网路中交换与传输的数据单元,也是网络传输的单元,报文包含了将要发送的完整的数据信息,其长短不一。报文在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的不受,那些就是报文头。
简单来说交换机交互的就是帧,路由器交互的是数据包,应用层则是报文。网络中实际传输的其实是帧,报文和包感觉更像是概念上的定义,本篇就是讲下帧的格式。
二、帧的类型
从Ethernet I发展到现在,大概有过5种以太帧格式(实际肯定不止,但我们主要不是讨论各种版本的帧),分别如下。
l Ethernet I:1980 DEC,Intel,Xerox制订了Ethernet I的标准
l Ethernet II:1982 DEC,Intel,Xerox又制订了Ethernet II的标准
(1982 IEEE开始研究Ethernet的国际标准802.3)
l 802.3 RAW:1983 迫不及待的Novell基于IEEE的802.3的原始版开发了专用的Ethernet帧格式 。也就是802.3 RAW。
l 802.3 LLC:1985 IEEE推出了802.3的正式版,主要是加入了LLC控制字段所以又叫802.3 LLC。
l 802.3 SNAP:后来为解决Ethernet II与802.3的兼容问题推出了折中的SNAP格式。
总的来说,Ethernet II原本只是几家公司合伙制定的标准,802.3是IEEE发布的正式国际标准,但由于历史原因Ethernet II成了事实上大家都遵循的标准。
802.3 RAW是Novel基于IEEE原始版本自己开发的,但由于大家都不认最后只有他们家自己用。LLC是IEEE正式推出的国际标准,SNAP则是为兼容Ethernet II推出的。LLC和SNAP由于较Ethernet II还是有一些优势的,所以在特定场景下还是会使用这两个帧格式。
三、帧详解
1、Ethernet I
Preamble and SFD(8 byte):最前面的8个byte(64 bit)是固定值,前7个byte是10101010这样的值,第8个byte是10101011,大概长下面这样:
10101010、10101010、10101010、10101010、10101010、10101010、10101010、10101011
其作用是标识出帧的起始位置。前面我们讨论OSI参考模型时,了解过二层协议中非常重要的一点就是比特流的传输,0代表低电平1代表高电平。由于传输速率非常快,为确保数据的准确,在前后两个帧之间我们肯定是需要用一个非常显眼的标识来区分的。帧数据使用8个byte(64个bit)来交替发出01信号就是非常非常显眼的信号,可以避免前后两个帧的数据混淆。
Dest Addr(6 byte):目标地址,这里指的是MAC地址,比如54-89-98-A1-1B-BC。
Source Addr(6 byte):源地址,也是MAC地址。
Type(2 byte):类型,标识上层协议。比如0x0800是IP协议、0x0806是ARP协议。
Data(46-1500 byte):传输的数据,比如IP协议的报文就是放在这里面的。
FCS(4 byte):校验位
Inter Frame Gap:指的是前后两个帧的时间间距,不是数据。
2、Ethernet II
Ethernet II帧格式与Ethernet I完全一致,唯一不同的是II在I的基础上对电器特性和物理接口进行了更新。而Ethernet II也是目前使用最为广泛的帧格式也在事实上成为以太网的帧标准。不过在一些特定地方还是有使用802.3帧的,所以我们还得继续往下介绍。
3、802.3 RAW
相比较Ethernet I和II,802.3 RAW使用Length字段代替了type,又从Data里挪了2个字节赋值成0xFFFF。这样做当然不是为了蛋疼,而是有历史原因,前面说过802.3 RAW是Novel公司在IEEE还未正式推出802.3时,在其临时版本上自己推出的一个版本。在802.3临时版中使用Length字段代替了type字段,Novel公司沿用了这个设定,但后续802.3正式发布时又从Data中挪了3个字节用作DSAP、SSAP、Control字段(各一个字节,下面会讲到)。为了与正式版的802.3做兼容和区分,RAW就把DSAP和SSAP这两个字段赋值成0xFFFF,同时Control字段还是划回到Data里去。下面我们再讲各字段的含义。
4、802.3 LLC
前面说IEEE有过一个临时版本的802.3协议,被Novel拿去使用了,其中将Ethernet II中的type字段修改为Length,后来正式发布时又从Data字段里挪了3个字节用作DSAP、SSAP、Control字段,合称LLC头,作用也是标识上层协议。所以正式版的802.3又叫802.3 LLC。
Length(2 byte):后续数据的字节长度,但不包括检验码
DSAP(1 byte):目的服务接入点
SSAP(1 byte):源服务接入点
Control(1 byte):控制字段
DSAP、SSAP、Control这三个字段的作用可以说是代替了Ethernet II的type又超过type字段的作用。具体咋回事我也没搞清楚可以参考:数据链路层 - 知乎
5、802.3 SNAP
前面提到过SNAP是为了将802.3 LLC与Ethernet II进行兼容,兼容方式是保留Length、DSAP、SSAP、Control这4个字段,同时再从Data里挪5个字节用作SNAP字段。
而SNAP字段又由2个部分组成,前3个字节是org code,其含义是组织代码,其实就是MAC地址里前3个字节,所以其实没啥用。后2个字节是type与Ethernet II的type字段一模一样。其实也是通过这个SNAP里的type字段与Ethernet II帧兼容。
此外,为了与LLC帧进行区别,DSAP、SSAP的值固定为0xAA,Control的值固定为0x03。
6、汇总
我们再理一下:
1)Ethernet I与II帧格式一致,使用type字段来记录上层协议。
2)802.3帧将原type字段的位置用Length字段代替,含义是帧的数据长度,同时从Data里挪了3个字节用于DSAP、SSAP、Control字段,其作用类似type字段也是用于记录上层协议但可以做到更加精细化。
3)802.3 RAW帧是802.3还在研究中推出的版本,只有Novel一家公司使用,它与802.3有点像的地方是没有type字段而有Length字段。为与正式版802.3做区分,将802.3原本DSAP和SSAP字段的值设置为0xFF(两个字段一起就是0xFFFF)。
4)802.3 LLC帧是802.3的正式版,将SDAP、SSAP、Control字段合称为LLC头,所以为与其他帧格式区分把正式的802.3又叫做802.3 LLC,如果直接说802.3一般指的就是这个版本。
5)802.3 SNAP帧是802.3为了与Ethernet II进行兼容,它保留了Length字段,从Data里又借了5个字节,其中2个字节就是type字段,同时DSAP、SSAP的值固定为0xAA,Control的值固定为0x03。
四、帧在网络中的使用
Ethernet II:
Ethernet II帧是最常用的,我们随便传输个什么数据,你抓包看都是Ethernet II的帧,比如下图这个。
但Ethernet II帧的特点是有一个type字段但没有Length字段,那网络设备怎么知道帧数据传输完了呢?原理是网络传输中使用了“4B/5B”编码,具体是啥我也没明白,反正有了这个编码规则网络设备是能识别帧结束的。
802.3:
802.3 LLC是802.3的正式版本,与Ethernet II的区别在于它多了个Length字段和LLC控制字段(SDAP、SSAP、Control),网上说,相对来讲802.3 LLC比较能“控制”所以在交换机之间传输报文时,比如BPDU就使用802.3,我不太明白,但抓包后发现确实是这样,比如STP协议的BPUD报文就是802.3的帧,像下图这个。
如何区分Ethernet II和802.3:
前面说802.3有Length字段而Ethernet II是type字段,所以这两个字段在帧中的位置一样但取值不一样。具体来说一个帧最大的长度是1500字节,所以Length字段的最大值是0x05DC(1500的十六进制),于是大家就约定好,type字段的取值必须大于0x0600(比如0x800是IP帧,0x0806是ARP帧),这样就成功将两个帧格式给错开了。
802.3 RAW:
前面提到过,RAW是Novel公司自己使用的,特点是使用Length字段替代了type但没有LLC控制字段,为了做区分,大家约定RAW帧在802.3 LLC基础上,将DSAP和SSAP位置的值置为0xFFFF。所以当Length字段值小于0x0600且接着两个字节都是全F时,那就是RAW帧了。由于只有Novel自己使用,所以我们也不关心它了。
802.3 SNAP:
SNAP也是在802.3 LLC基础上改的,区分方法是它的DSAP和SSAP字段是固定值0x0A。搜了半天也没发现有哪些协议是用SNAP封装的帧,所以也不关心了。
五、总结
本文对几种常用的帧格式进行了简述,最后发现我们只需要关系Ethernet II和802.3 LLC就好了。