数据链路层的报文封装总共有两种形式:
1、802.3系列
2、EthernetVII
EthernetVII系列
EthernetVII的报文结构已经是十分普及了,6624这个数字标志着EthernetVII的各个字段所占的字节的大小。6个目的MAC地址,6个源MAC地址,2个字节类型标志着上层的协议类型。类型字段的值如果小于1500,那么这个字段的含义就代表是长度,当然再EthernetVII中是不会出现这种情况的,这个字段的含义为长度的情况是再802.3系列帧中才会出现的。
802.3系列
802.3数据帧格式总共经过了三个阶段,但是现在能够看到的只有第二版和第三版也就是802.3SAP版本和802.3.SNAP版本,所以在这里我将介绍802.3SAP和SNAP两种的格式。
802.3SAP
首先是6字节的目的MAC地址,以及6字节的源MAC地址,同时原本在EthernetVII中的类型字段的含义被修改为了总长度,其实这个字段完全没有必要,因为网络层的头部中有对IP载荷的总长度和IP层的头部长度进行标识,而且二层的帧头部的长度都是固定的,所以我们完全可以根据这些信息求出在一个数据包中哪些部分是IP载荷。然后就是DSAP以及SSAP,这个是用来标识上层使用的协议类型的。但是每个SAP只有1字节长,而其中仅保留了6比特用于标识上层协议,所能标识的协议数有限。
这里是STP协议生成的802.3SAP报文,可以看见这边它对上层STP的内容载荷的标识是0042.但是如上面所说它仅仅使用1个字节中的6比特,所以能够标识的协议很少,所以比起EthernetVII的2个字节去标识协议类型,802.3SAP支持的上层协议比较少。然后就是1个字节的控制位,这个位固定为3.
802.3SAP可以这么理解,它将数据帧分为MAC层和LLC子层,MAC层的结构就是EthernetVII的包结构,区别第三个字段的含义是类型还是长度。然后它就在这个基础上加上了LLC子层,因为MAC层中是没有任何字段去标识上层协议的,所以毫无疑问它只能支持一种上层协议,所以就引入了LLC子层,这个子层其实也很鸡肋,仅仅虽然占用1字节,但是仅使用了6位进行上层协议的识别。所以识别的协议也很少。而且还有一个控制字段,占一个字节,这个字段我也不知道有什么用。
802.3SNAP
这个是SAP的弥补版,按照我的理解,看下面的帧格式:
他在SAP的尾巴后面有加了五个字节,而且原来的SSAP和DSAP都不用了,直接全部固定值0XAA。同样在SNAP中控制字段依然还是固定值3,依然没有使用到,然后就是OUI ID,这个是组织ID,还有就是类型字段占两个字节用来是被上层协议。组织ID用在一些特定的协议上面,比如某些产家发明了私有协议,然后就在底层上对这个字段进行填充去表面我的组织ID是多少。
比如下面是思科的私有的CDP协议:
它里面就有用802.3SNAP帧,同时里面封装着自己的组织ID。
一个完整的包是怎样的
一个完整的包应该包含7字节前导码以及1字节的帧开始定界符用于告诉对端有数据要来了,同时在发送完一个帧之后还需要等待96字节的时间,也就是发送96字节的帧间隙。
一个EthernetVII帧最小帧长是64字节,最大是1518字节。如果我们将EthernetVII的帧头部去除,我们就知道网络层的最小载荷长度是46字节,最大是1500字节。
如果是802.3SAP帧的话,因为加入了3个字节的SSAP,DSAP以及控制位,于是最小帧为61字节,最大1515字节
如果是802.3SNAP帧的话,在SAP的基础上加入了3个字节的组织ID和2个字节的类型字段,于是最小帧为56字节,最大是1510字节。
点对点链路
1、SLIP
因为是点对点链路,所以不需要考虑去寻找对端的位置,所以该协议的帧头部中没有终端设备的标识:
该协议使用0XC0表示一个帧的结尾,如果帧中有C0,我们需要使用转义字符对其进行转义,这个转移字符就是db,如果帧中的内容有db,那么就使用db和dd的组合代表。
这个协议仅仅只能表示单独的上层协议,而且没有Ethernet链路中的CRC冗余校验,所以无论是对上层协议的支持还是传输数据的正确性都是有比较大的差距。
PPP协议
PPP的核心思想与SLIP差不多,因为使用的链路类型是P2P,所以它同样不需要去对主机进行寻址,同样PPP需要使用一个特定的字符去表示帧的开始和结尾,在SLIP中使用0c去标识,而在PPP是使用7E去标识,然后就是2个字节的固定值,然后就是2个字节的协议字段,它标识了上层使用的协议是什么,同时尾部使用了CRC冗余校验,所以它的EthernetVII的区别就在于EthernetVII使用了MAC地址去标识广播链路上的主机。而取决与PPP链路点对点的特性,不需要去考虑主机的位置,所以在帧头部中没有这方面的表示。
PPP的转义字符
当帧内容有0x7E,则使用0x7D和0x5E去代替
当帧内容有0x7D,则使用0x7D和0x5D去代替
当帧内容有小于0x20的内容,都要进行转义。
在ppp中还使用了另一种转义的方式,每遇到5个1后就加入一个0,去对帧内容进行一个改变,因此可以改变帧内容中出现特殊字符的情况。
PPP的协商过程
PPP使用PPP的LCP类型报文去协商链路信息,然后会判断是否有认证信息,如果有就进行PAP或者CHAP的认证,如果没有就直接进入网络的协商的阶段,网络协商阶段会互相发送NCP报文进行网络相关的协商,然后全部协商完成之后就进入正常转发阶段,当用户去关闭PPP链路的时候,就会发送NCP或者LCP指明去关闭链路。