数据链路层
我们之前学习到的 IP 协议解决的是数据跨网络传输的问题。 数据链路层解决的是:直接相连的主机,进行数据交付的问题! 直接相连的设备包括我们的电脑,路由器等等哈!
我们在网络基础那篇文章中讲过什么是以太网,这里可以来复习一下:
- “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网, 无线LAN等;
以太网的帧格式
-
源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是 48 位,是在网卡出厂时固化的;
-
帧协议类型字段有三种值,分别对应 IP、ARP、RARP;
-
帧末尾是 CRC 校验码。用于在数据通信中检测传输过程中可能出现的错误。它是一种错误检测码,通过对数据进行多项式计算来生成校验值,并将该校验值附加到数据中一起发送。接收方在接收数据时也进行相同的计算,并与接收到的 CRC 值进行比较,以检查数据是否在传输过程中发生了损坏。
太网帧格式的报文也叫做 Mac 帧哈!
- Mac 帧如何做到解包呢?很简单,就是定长报文,掐头去尾就得到有效载荷啦!头:14 字节,尾:4 字节。
- Mac 帧的有效载荷应该交给上层的那个协议呢?类型字段用来表示将有效载荷交给上层的那个协议!
- 类型字段为 0x0800 就是将有效子啊喝交给 IP 协议。
- 类型字段为 0x0806 就是将有效子啊喝交给 ARP 协议。
- 类型字段为 0x0835 就是将有效子啊喝交给 RARP 协议。
局域网的通信原理
这里还是以以太网为例哈,这个部分在网络基础的那篇文章中已经详细讲解过了,这里简单提一下!
如上图所示:假设一个局域网中的 H1 要发送一条数据给同一局域网中的 H7 主机!H1 主机进行 Mac 帧的封装,然后发送发哦局域网,然后整个局域网的主机都会收到这个 Mac 帧,收到 Mac 帧的主机会读取报文中的目的 Mac 地址,如果和自己的 Mac 地址不相同,报文就会被直接丢弃!如果和自己的 Mac 地址相同,就会继续进行解包和向上交付!
路由器也是 有网络层和数据链路成的,路由器收到报文的时候,先解包,再查路由表,然后再进行封转,转发!直到到达目标主机所在的局域网!
分析这个解包和封转的过程不难看出,Mac 帧只在局域网中有效。路由器进行转发的过程中,源 Mac 地址和 目标 Mac 地址是不端变化的!
ARP 协议
不知道你有没有这样一个疑问:在局域网中通信的两台主机,最开始的时候我们怎么知道目标主机的 Mac 地址呢?这就要引出 ARP 协议啦!
什么是 ARP 协议
ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址映射到MAC地址的协议。ARP 不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。就是说 ARP 协议本身是被划分到了数据链路层的,但是 ARP 协议是 Mac 帧的上层协议!
ARP协议的作用
- ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的, 如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址;
ARP 协议的数据报格式
- 硬件类型指链路层网络类型, 1 为以太网;
- 协议类型指要转换的地址类型, 0x0800 为IP地址,即将 IP 地址转换为 Mac 地址。
- 硬件地址长度对于以太网地址为 6 字节,填 6 就行。
- 协议地址长度对于 IP 地址为 4 字节,填 4 就行。
- op字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
不难发现,对于 IP 地址到 Mac 地址的转化大部分的字段都是固定的写法!
模拟一次 ARP 请求获得目标主机 Mac 地址的过程
如上图所示,在局域网 A 中,主机 R 想要给主机 C 发送一条数据,但是主机 R 并不知道主机 C 的 Mac 地址。因此需要进行 ARP 请求获取主机 C 的Mac 地址!
- 首先在主机 R 的 ARP 软件层进行 ARP 报文的封装:
硬件类型,协议类型,硬件地址长度,协议地址长度都是固定填法。
发送的是 ARP 请求 OP 字段填写 1。
目的以太网地址现在我们还不知道,直接填上全 F 就行!
- APR 请求报文封转完毕之后,就会交付给下层,构建 Mac 帧:
- 目的以太网地址不知道,填全 F 表示广播地址,任何收到这个 Mac 帧的主机都需要进行解包向上交付。
- 以太网源地址是填写 MacR 哈,上面的图有一点小错误。
- 帧类型是 0x0806 表示有效载荷是 ARP 报文。将来需要交给 ARP 的软件层。
-
Mac 帧构建完毕之后,就会通过网卡发送到局域网。因为目的 Mac 地址是广播地址,局域网中的任何主机都会收到这个 Mac 帧并进行解包,那么就会有两种情况:
-
除了主机 C 之外的其他主机收到了这个 Mac 帧,假设就是主机 B。
- 主机 B 收到这个 Mac 帧之后,进行固定长度地掐头去尾,发现帧的类型是 0x0806,也就是 ARP 协议,就会将有效载荷交付给 ARP 的软件层。
- ARP 的软件层收到这个报文之后,首先会取出 OP 字段,发现 OP 字段为 1 ,即该报文是 ARP 请求。然后再去取目的 IP 地址,发现目的 IP 地址和自己的 IP 地址不相同,那么就会直接将报文在 ARP 层丢弃。
-
C 主机收到了这个 Mac 帧。
-
主机 C 收到这个 Mac 帧之后,进行固定长度地掐头去尾,发现帧的类型是 0x0806,也就是 ARP 协议,就会将有效载荷交付给 ARP 的软件层。
-
ARP 的软件层收到这个报文之后,首先会取出 OP 字段,发现 OP 字段为 1 ,即该报文是 ARP 请求。然后再去取目的 IP 地址,发现目的 IP 地址和自己的 IP 地址相同,那么主机 C 就会进行 ARP 应答!
-
在主机 C 的 ARP 软件层进行 ARP 应答的封装:
- 同样地,硬件类型,协议类型,硬件地址长度,协议地址长度都是固定填法。
- op 字段填写 2 表示这是 ARP 应答!
- 站在主机 C 的视角,发送端以太网地址,发送端 IP 地址,目的以太网地址,目的 IP 地址都是清楚的!
-
ARP 应答封装完成之后,就会向下交付,封装 Mac 帧。
- 目的以太网地址,源以太网地址主机 C 都已经知道了。
- 帧的类型是 0x0806 表示有效载荷是 APR 报文。将来需要交给 ARP 的软件层。
-
Mac 帧封装完毕之后,就会将他发送到局域网,此时也有两种情况:
- 除了主机 R 以外的其他主机收到了这个 Mac 帧。这个主机发现目的以太网地址不是自己,会将报文直接丢弃,
- 主机 R 收到了这个 Mac 帧,发现目的以太网地址是自己,那么机会接收这个报文,从而获取到主机 B 的 Mac 地址,就这样,完成了一次 ARP 请求和响应的过程。
-
通过以上模拟的 ARP 通信过程,我们不难得出结论:
- ARP 收发的过程中,收到的任何 ARP 报文都是先看 OP 字段。
- OP 字段决定了 ARP 报文的种类,是 ARP 请求报文还是 ARP 响应报文呢?不同类型的 ARP 报文又决定了接下来是看目的 IP 地址还是发送端的 Mac 地址。
-
在局域网中的主机每次进行通信之前都要进行 ARP 是不是有点麻烦,好在操作系统会帮我们缓存主机的 Mac 地址和 IP 地址的映射关系!我们可以使用 arp -a
命令查看缓存的映射数据!下图是在 Windows 操作系统中查看到的结果: