网络编程之TCP/IP协议族-链路层Ethernet II和802.2/802.3 SNAP协议

在TCP/IP协议族中,链路层主要有三个目的:

  1. 为IP模块发送和接受IP数据报

  2. 为ARP模块发送ARP请求和接收ARP应答

  3. 为RARP模块发送RARP请求和接收RARP应答

网络层的数据到达链路层,会被加上帧首部和帧尾部封装成以太网帧。不同的协议标准定义了不同大小和格式的帧首部,但通常都会包含6个字节的目的MAC地址和6个字节的源MAC地址。帧尾部FCS是采用CRC的帧校验序列。帧首部前面还有一个8字节的前导字,但通常不将其考虑在内。

下图(来自网络)展示了最常见的两种协议的帧格式,分别是802.2/802.3 SNAP和Ethernet II。
Image Title

Ethernet II: 帧首部包含6个字节的目的MAC地址、6个字节的源MAC地址和2个字节的类型域。

  • 类型域:定义了上层协议类型,如0x0800是IP协议,0x0806是ARP协议。

802.2/802.3 SNAP: 帧首部包含各6个字节的目的MAC地址和源MAC地址、2个字节的长度域、各1个字节的DSAP和SSAP,,1个字节的控制字段,3个字节的组织码和2个字节的类型域。

  • 长度域:表示数据长度。标准规定帧最小长度是64字节,所以数据长度最小是46字节,最大长度一般为1500字节。不足46字节必须进行填充,但填充长度不包含在长度域中。如果网卡同时支持该协议和Ethernet协议,长度域也被用来区分两种帧。因为数据字段的最大长度为1500字节,所以不超过0x05DC(1500)的值说明它是长度域(IEEE802.3),否则是类型域(Ethernet II)。

  • DSAP和SSAP:分别是目的和源服务访问点,被固定设为0xAA。

  • 控制字段:被固定设为0x03

  • 组织码:网络适配器厂商代码,通常与源MAC的前三个字节相同。

  • 类型域:与Ethernet II相同。

可以看到,数据帧长度范围是64-1518字节,Ethernet II帧首部长度是14字节,802.2/802.3 SNAP帧首部长度是22字节,帧尾部同是4字节。Ethernet II数据长度范围是46-1500字节,802.2/802.3 SNAP数据长度范围是38-1492字节。Ethernet II是以太网现在的事实标准。

此处有几个概念。

  • MTU:最大传输单元,即协议层所能通过的最大数据包大小。由上述,目前以太网采用Ethernet II,MTU是1500字节。如果上层传输的数据大于MTU,则需要分片。

  • PMTU:数据传输可能经过多个网络,每个网络的的链路层MTU可能不同,其中的最小值,被称作路径最大传输单元。如果传输的数据大于PMTU,则会在传输过程中被分片或者丢弃。

下面是使用tcpdump捕获到的TCP三次握手数据包,-e输出了链路层的头部信息,不包括4字节的帧尾部FCS。
Image Title

观察第一个数据包。10:14:43.153311是操作时间,8c:89:a5:65:0a:fa是源MAC地址,d2:b3:a8:28:32:b0是目的MAC地址,0x0800表明上层采用IPv4协议,length 66表示帧首部和数据域总长度为66字节,帧首部是14字节,所以数据域长度为52字节,即IP分组长度。

再看一个ARP的例子。
Image Title

8c:89:a5:88:1e:b8是源MAC地址,ff:ff:ff:ff:ff:ff是目的MAC地址说明是广播,0x0806表明上层采用ARP协议,length 60表示帧首部和数据域总长度为60字节,帧首部是14字节,所以数据域长度为46字节。APR数据包长度固定是28字节,后面18字节全为0是填充数据,以符合最小帧长度要求。

这个APR包是IP为192.168.3.36的主机A向所在子网广播请求IP为192.168.3.44的主机B的MAC地址。主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址与MAC地址对保存起来,供以后使用。主机A获得主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主机B的IP地址与MAC地址对保存在自己的ARP缓存内。

以太网使用MAC地址来标识主机,链路层提供两个相邻节点间的数据传输。网络层的数据包中包含目的IP地址,当需要传输时,链路层首先在ARP缓存中查找IP地址对应的MAC地址,如果找不到则触发ARP请求将IP地址转换成MAC地址。需要注意的是,如果目的IP与本机在同一个子网,得到的MAC地址即是目的主机地址,否则是网关地址。在数据帧传输过程中,MAC地址会不断改变,源MAC地址始终是上一个主机/路由器的地址,目的MAC地址是下一个主机/路由器的地址,直到到达目的主机或被丢弃。