数据链路层的“数据链路”是指在相邻设备之间创建的逻辑传输线路。在数据链路层中,为了便于判断是“为哪一个终端创建数据链路”。以及确认创建好的数据链路中“是否丢失了比特”,需要进行封包处理,以确保物理层的可靠性。在IEEE802.3标准的以太网中,对采用哪种格式(形式)进行封包,以及如何检测错误进行了定义。
目录
使用以太网封装的数据包被称为以太帧,以太网II标准的数据帧格式是由前导码和接收方/发送方MAC地址+类型+以太网载荷+帧校验序列这5个字段组成的。其中,前导码+接收方/发送方MAC地址+类型统称为以太网首部。此外,FCS也被称为以太网帧尾。
接下来对数据帧格式中的各个字段进行简要的讲解。
前导码是一种包含“我们接下来将要发送以太帧喔”的意思的,8字节(64比特)的特殊的特征码。需要从开头开始发送7个10101010,最后紧接着发送一个10101011。接收端的终端需要查看添加在以太帧的开头部分的这串特征码,来得出“接下来将会有以太帧到达”的判断。
MAC地址是一种对连接在以太网网络的终端进行识别的6字节(48比特)的编号ID。我们可以认为一个以太网网络中的地址。发送方的终端会将需要发送以太帧的终端的MAC地址设置为接收方MAC地址,将自己的MAC地址设置为发送方MAC地址,然后发送以太帧。与之相对的,接收方的终端则会查看接收方MAC地址,如果确定是自己的MAC地址,就会接受以太帧;如果是与自己无关的MAC地址,则会将以太帧丢弃。此外,接收方终端还会查看发送方MAC地址,以识别是来自哪一个终端的以太帧。
类型是一种表示网络层(层3+L3+第3层)中使用哪种协议的2字节(16比特)的类型ID。如果是IPv4,类型就是0x0800;如果是IPv6,类型则是0x86DD。它的值是根据使用的协议和版本而定的。
以太网载荷表示网络层的数据本身。例如:如果在网络层中使用IP,就是“以太网载荷=IP数据包”。在分组交换方式的通信中并不是直接发送数据的,而是需要先将数据切分成便于传输的小包裹,再将其发送出去。这个小包裹的尺寸也是固定的。如果是以太网,就需要控制再默认的46~1500字节范围内。如果不够46字节,可以通过添加名为“填充”的虚拟数据的方式强制性地增加到46字节。相反地,如果是超过1500字节的数据,则可以再传输层或网络层对数据进行切分,将数据控制在1500字节以内。
FCS是专门用于确认以太帧是否损坏的一个4字节(32比特)的字段。发送方的终端在发送以太帧时,需要对接收方MAC地址和发送方MAC地址+类型+以太网载荷进行相应的计算(计算校验和+CRC),并将计算结果作为FCS添加到数据帧的尾部。相应地,接收方的终端也需要对接受的以太帧进行相同的计算,如果计算得到的结果与FCS相同,就可以确定接受到的数据没有被损坏,是正确的以太帧。如果计算得到的结果与FCS不同,就可以确定在传输过程中以太帧遭受了损坏,那么就应当将数据废弃。FCS就是通过上述方式实现对以太网中所有的错误进行检测的。
在以太网中,最为重要的字段是接收方MAC地址和发送方MAC地址。MAC地址是一种用于对连接以太网网络的终端进行识别的ID。它由6字节(48比特)组成,需要像00-0c-29-43-5e-be或04:0c:ce:da:3a:6c这样,使用连字符或者冒号对每个字节(8比特)进行分隔,并使用十六进制进行表示。如果是物理设备,就需要在制造物理NIC网卡时将其写入ROM(只读存储器);如果是虚拟设备,则会默认由管理程序分配给虚拟NIC网卡。
MAC地址在高位3字节(24比特)和低位3字节(24比特)中具有不同的含义。高位3字节(24比特)是由IEEE分配给每个供应商的供应商代码,该代码被称为OUI(组织唯一标识符)。我们只要查看代码,就可以知道正在进行通信的终端的NIC网卡是由哪家供应商制造的。低位3字节(24比特)被称为UAA通用管理地址,它由供应商在出货时分配或者随机生成。
每种通信的MAC地址的区别
在以太网网络中的通信可以分为单播+广播+组播3种方式。这些通信需要根据接收方区分进行使用,而且与接收方MAC地址相关联的MAC地址也会略有不同。
单播是指1:1的通信。收发数据的每台终端的MAC地址就是发送方MAC地址和接收方MAC地址。像web和电子邮件等常用的互联网通信,基本上都可以归类为这种单播通信模式。
广播是指1:n的通信。这里的n表示连接着同一个以太网网络的+除自己以外的所有终端。如果某台终端发送了广播,那么在该以太网网络中的+除自己以外的所有终端都会接收该数据帧。这个数据所能广播到的范围被称为广播域。广播专门用于ARP这类需要在网络上向所有终端进行通知和询问的协议中。
组播是1:n的通信,这里的n表示特定组(组播组)中的终端。如果某台终端发送了组播,就只有该组中的终端可以接收该数据包。组播主要用于视频分发和证券交易的应用程序中。广播是强制性地让该网络中的所有终端接收数据包,而组播是只允许运行了应用程序的终端接收和数据包,因此它可以提高流量的使用效率。