###1. 以太网
以太网是局域网技术中的一种, 几种局域网技术如下:
- 以太网(Ethernet)
- 令牌环网
- FDDI 网
- ATM 网
- 无线局域网(WLAN)
由于以太网使用普遍、发展迅速,以至于人们将”以太网”当作了”局域网”的代名词,并且以太网是当今 TCP/IP 网络协议采用的局域网技术(注意wifi将以太网帧作为其payload来传递)
###2. 以太网帧的历史
- 1980年 : DEC, Intel Xeron 制定了 Ethernet I 的标准
- 使用Xerox PARC提出的3Mbps CSMA/CD以太网标准的封装格式
- 1982年 : DEC, Intel Xeron 又制定了 Ethernet II 的标准 (cisco将其命名为ARPA)
- 相比Ethernet I, 主要更改了电气特性和物理接口, 帧格式并没有变化
- 1982年 : IEEE 计划制定Ethernet的国际标准 IEEE 802.3
- 1983年 : Novell根据IEEE 802.3 草案, 在其Netware/86网络套件上使用了专用的Ethernet帧格式 (cisco将其命名为Novell-Ether)
- 2年后,IEEE正式发布802.3标准时情况发生了变化—IEEE在802.3帧头中又加入了802.2 LLC(Logical Link Control)头,这使得Novell的RAW 802.3格式跟正式的IEEE 802.3标准互不兼容
- 1985年 : IEEE 正式推出了 IEEE 802.3规范 (cisco将其命名为SAP)
- 这一标准被称为 802.3/802.2 LLC, 它将Ethernet V2帧头的协议类型字段替换为帧长度字段(取值为0000-05dc;十进制的1500);并加入802.2 LLC头用以标志上层协议,LLC头中包含DSAP,SSAP以及Crontrol字段
- IEEE 为解决 Ethernet II 与 802.3 帧格式的兼容问题推出折衷的 (cisco将其命名为SNAP)
- 这一标准也被称为 802.3/802.2 SNAP, 这是IEEE为保证在802.2 LLC上支持更多的上层协议同时更好的支持IP协议而发布的标准,与802.3/802.2 LLC一样802.3/802.2 SNAP也带有LLC头,但是扩展了LLC属性,新添加了一个2Bytes的协议类型域(同时将SAP的值置为0xAA),从而使其可以标识更多的上层协议类型;另外添加了一个3Bytes的OUI字段用于代表不同的组织,RFC 1042定义了IP报文在802.2网络中的封装方法和ARP协议在802.2 SANP中的实现
Ethernet II 是事实上的标准
###3. Ethernet II 帧格式
Ethernet II的帧格式如下
6byte 6byte 2byte 46~1500byte 4byte
| | | | |
目的地址 源地址 类型 数据 FCS
- 目的地址和源地址均为48bit的MAC地址
- 类型字段指明了承载的上层协议的类型, 常见的值有
- 0x800 IP
- 0x806 ARP
- 0x8137 Novell IPX
- 0x809b Apple Talk
- 0x86dd IPv6
- 在Ethernet II 中,该字段值不得小于0x05dc(即10进制的1500),否则代表不是Ethernet II帧
- linux源码 “kernel/include/uapi/linux/if_ether.h” 中可以看到更多的定义
- 数据字段为承载的上层协议的数据, 长度为46~1500byte, 即使数据不够46byte, 也要填充到46byte
- 32bit CRC校验, 校验从 “目的地址” 到 “数据” 的内容
Ethernet II帧中并不保存长度, 因此, 需要由网卡驱动来指出长度(硬件能够获取到接收的帧的长度)
RFC 894定义了IP报文在Ethernet II上的封装格式
###4. Novell Etnernet 帧格式
Novell Ethernet 帧格式如下
6byte 6byte 2byte 2byte 44~1498byte 4byte
| | | | | |
目的地址 源地址 数据长度 0xffff 数据 FCS
Novell ethernet 的帧头与 Ethernet II 有所不同:
- Ethernet II 的类型域变为 长度 域
- 在长度域后面添加了两个固定的字节 0xffff 用于标识帧为 Novell Ethernet
- 由于占用了2byte 存储 0xffff 标识符, 因此 数据字段的长度为 44~1498 byte
###5. IEEE802.2 (LLC)
IEEE802.2 标准是 IEEE802.3 等标准的基础, 因此, 在细述 IEEE802.3以太网帧结构之前, 需要先解释一下IEEE802.2
在ISO的OSI参考模型中, 数据链路层又划分成两个子层:
- 逻辑链路控制LLC(Logic Line Control)子层
- 介质访问控制MAC(Media Access Control)子层
IEEE802委员会为局域网制订了一系列标准,统称为802标准. 其中IEEE802.2标准定义了逻辑链路控制LLC子层的功能与服务,并且是 IEEE802.3,IEEE802.4和 IEEE802.5等标准的基标准
LLC 为上层提供了处理任何类型 MAC 层的方法
LLC 定义了2种数据通信操作类型:
- LLC1 即类型1, 无连接, 该方式不保证发送的信息一定可以收到。
- LLC2 即类型2, 面向连接, 该方式提供了四种服务:
- 连接的建立
- 确认和数据到达响应
- 差错恢复(通过请求重发接收到的错误数据实现)
- 滑动窗口, 滑动窗口用来提高数据传输速率。
LLC1是应用于以太网中,而LLC2应用在IBM SNA网络环境中
LLC header 格式为
1byte 1byte 1byte
| | |
DSAP SSAP Ctrl
- DSAP : 目标服务存取点(Destination Service Access Point)
- SSAP : 源服务存取点(Source Service Access Point)
- Ctrl : 无连接或面向连接的LLC, 基本不使用, 一般被设为0x03,指明采用无连接服务的802.2无编号数据格式
服务存取点(SAP)用于标识以太网帧所携带的上层数据类型
在 “kernel/include/uapi/linux” 中可以看到SAP类型
#define LLC_SAP_NULL 0x00 /* NULL SAP. */
#define LLC_SAP_LLC 0x02 /* LLC Sublayer Management. */
#define LLC_SAP_SNA 0x04 /* SNA Path Control. */
#define LLC_SAP_PNM 0x0E /* Proway Network Management. */
#define LLC_SAP_IP 0x06 /* TCP/IP. */
#define LLC_SAP_BSPAN 0x42 /* Bridge Spanning Tree Proto */
#define LLC_SAP_MMS 0x4E /* Manufacturing Message Srv. */
#define LLC_SAP_8208 0x7E /* ISO 8208 */
#define LLC_SAP_3COM 0x80 /* 3COM. */
#define LLC_SAP_PRO 0x8E /* Proway Active Station List */
#define LLC_SAP_SNAP 0xAA /* SNAP. */
#define LLC_SAP_BANYAN 0xBC /* Banyan. */
#define LLC_SAP_IPX 0xE0 /* IPX/SPX. */
#define LLC_SAP_NETBEUI 0xF0 /* NetBEUI. */
#define LLC_SAP_LANMGR 0xF4 /* LanManager. */
#define LLC_SAP_IMPL 0xF8 /* IMPL */
#define LLC_SAP_DISC 0xFC /* Discovery */
#define LLC_SAP_OSI 0xFE /* OSI Network Layers. */
#define LLC_SAP_LAR 0xDC /* LAN Address Resolution */
#define LLC_SAP_RM 0xD4 /* Resource Management */
#define LLC_SAP_GLOBAL 0xFF /* Global SAP.
###6. IEEE802.3/802.2 LLC 帧格式
IEEE802.3/802.2 LLC 帧的格式为
6byte 6byte 2byte 3byte 43~1497byte 4byte
| | | | | |
目的地址 源地址 数据长度 LLC 数据 FCS
IEEE802.3/802.2 LLC 帧和Ethernet II的帧的差别为:
- Ethernet II 中的类型字段变成了长度字段
- 引入802.2协议(LLC), 在802.3帧头后面添加了一个LLC header
###7. IEEE802.3/802.2 SNAP 帧格式
IEEE802.3/802.2 SNAP 在 IEEE802.3/802.2 SAP 的基础上, 扩充了 LLC header
6byte 6byte 2byte 8byte 38~1492byte 4byte
| | | | | |
目的地址 源地址 数据长度 LLC 数据 FCS
而LLC header的扩展为
1byte 1byte 1byte 3byte 2byte
| | | | |
DSAP SSAP Ctrl Org Code type
- DSAP : 参见第6节中的SAP, 类型定义, SNAP为0xAA, 因此该字段固定为0xAA
- SSAP : 参见第6节中的SAP, 类型定义, SNAP为0xAA, 因此该字段固定为0xAA
- Ctrl : 固定为0x03
- Org Code : 通常与源mac地址的前三个bytes相同, 为厂商代码
- type 域与Ethernet II 中的 “类型” 字段相同
###8. 不同帧格式的区分方式
- 检查帧中“源MAC”字段后面的2byte(在Ethernet II中为协议类型, 在其它帧中为 数据长度), 若大于 0x05dc(即10进制的1500), 则为 Ethernet 帧
- 继续比较后面的2个byte, 如果为0xFFFF则为Novell Ether 类型的帧
- 如果为 0xAAAA 则为 IEEE802.3/802.2 SNAP 帧, 否则, 为 IEEE 802.3/802.2 LLC 帧
这些以太网帧可以共存于一个网络中,但互不兼容,当用不同封装类型的工作站要交换信息时,必须通过 支持的路由器来通信
###9, Ethernet 与 IEEE的以太网帧的关系
在 DLL 和 PHY层, Ethernet 与 IEEE 以太网的关系可以使用下图表示
+-----+ +----------------------------------------------------+
| | | IEEE 802.2 LLC | DLL 之 LLC Sublayer
| E | +----------------------------------------------------+
| t |
| h | +------------+ +-----------+ +---------------------+
| e | | 802.3 MAC | | 802.5 MAC | | 802.11 MAC | DLL 之 MAC Sublayer
| r | +------------+ +-----------+ +---------------------+
| n |
| e |
| t | +------------+ +-----------+ +---------------------+
| | | 802.3 PHY | | 802.5 PHY | | 802.11 a/b/g/ac PHY | PHY
+-----+ +------------+ +-----------+ +---------------------+
TCP/IP 使用Ethernet 帧作为局域网的基础, 而无线局域网 wifi, 则是使用LLC封装, 因此, 其会将Ethernet帧转换为802.3帧, 然后再转换为802.11帧
###10. 以太网帧前导码
前导码其实是在物理层发送以太网帧之前, 添加到以太网帧前面的的, 并不是正式帧的一部分, 添加前导码的目的是物理层可以在接收到实际的帧之前, 开始检测载波, 并且与接收到的帧时序达到同步稳定
前导码的结构为
7byte 1byte
| |
前导码 帧起始鉴定符
- 前导码 : 7byte, 内容为 循环的 010101….. bit
- 帧起始鉴定符 : 1byte, 内容为 10101011 最后的两个bit “11” 表示后续的字段是 “目的地址”
###11. IP数据包在 Ethernet II 以太网上的封装
IP数据包在 Ethernet II 以太网上的封装由RFC894规定
Ethernet II 帧格式为
6byte 6byte 2byte 46~1500byte 4byte
| | | | |
目的地址 源地址 类型 数据 FCS
IP数据包
2byte 46~1500byte 4byte
| | |
类型 IP数据包 FCS
0x8000
ARP 数据包
2byte 28byte 18byte 4byte
| | | |
类型 ARP数据包 padding FCS
0x8006
RARP 数据包
2byte 28byte 18byte 4byte
| | | |
类型 RARP数据包 padding FCS
0x8035
###12. IP数据包在 IEEE 以太网上的封装
IP数据包在 IEEE 以太网上的封装由RFC1042规定
IEEE 802.3/802.2 SNAP 帧格式为
6byte 6byte 2byte 8byte 38~1492byte 4byte
| | | | | |
目的地址 源地址 数据长度 LLC 数据 FCS
IP 数据包
2byte 38~1492byte 4byte
| | |
LLC之类型 IP数据包 FCS
0x8000
ARP 数据包
2byte 28byte 10byte 4byte
| | | |
LLC之类型 ARP数据包 padding FCS
0x8006
RARP 数据包
2byte 28byte 10byte 4byte
| | | |
LLC之类型 RARP数据包 padding FCS
0x8035
RFC894和RFC1042的主要差别在于, IEEE以太网相对于Ethernet II以太网, 其数据字段中有一部分分配给LLC头, 因此, IEEE以太网封装IP数据包时, 实际的数据长度上限要小一些, 并且对于ARP和RARP数据包所需的padding字节数也要小一些
**RFC1024中规定, LLC。header 中的 Org code 值固定为 0x00-00-00 **