链路层寻址和 ARP 协议
我们平时所说的局域网(Local Area Network, LAN),一般指二层可达的网络,也就是网络里面不需要三层设备(路由器)就可以保证可达性。
主机和路由器上的网络适配器(或称网络接口、网卡)具有链路层地址,但是链路层交换机并不具有与它们的接口相关联的链路层地址,这是因为链路层交换机的任务是在主机与路由器之间承载数据报;交换机透明地执行该项任务,也就是说,主机或路由器不必明确地将帧寻址到其间的交换机。
MAC 地址
链路层地址有不同的称呼:LAN 地址、物理地址、局域网地址、以太网地址或 MAC 地址,其中 MAC 地址是最为流行的术语,它用于在局域网内标识一个帧从哪个网卡发出,到达哪个物理相连的其他网卡。
MAC 地址的长度为 48 位(6个字节),通常表示为 12 个 16 进制数,如:00-16-EA-AE-3C-40
就是一个MAC地址,其中前 3 个字节,16 进制数 00-16-EA
代表网络硬件制造商的编号,它由 IEEE(电气与电子工程师协会)分配;而后 3 个字节,16 进制数 AE-3C-40
代表该制造商所制造的某个网络产品(如网卡)的系列号。MAC 广播地址(broadcast address)为 FF-FF-FF-FF-FF-FF
。
MAC 地址由网络设备制造商生产时烧录在网卡的 EPROM(一种闪存芯片,通常可以通过程序擦写)中,只要不更改自己的MAC地址,MAC地址在世界是唯一的。网卡和操作系统允许修改 MAC 地址,但要保证修改后的 MAC 地址在你的局域网内是唯一的。
当某网卡要向某些目的网卡发送一个帧时,发送网卡将目的网卡的 MAC 地址插入到该帧中,并将该帧发送到局域网中。一台交换机偶尔将一个入帧广播到它的所有接口,因此一块网卡可以接收一个并非向它寻址的帧。这样,当网卡接收到一个帧时,需检查该帧中的目的 MAC 地址是否与它自己的 MAC 地址匹配,如果匹配,该网卡提取出封装的数据报并沿协议栈向上传递,否则丢弃该帧。
MAC 地址具有扁平结构,而且不论网卡到哪里用都不会变化(除非用户主动修改 MAC 地址);而 IP 地址具有层次结构,当设备移动时,它的 IP 地址需要改变,即改变它所连接到的网络。因此,可以将 MAC 地址类比为身份证号,IP 地址类比为邮政编码。
主机和路由器的网卡除了网络层地址之外还有 MAC 地址,这有如下几个原因:
(1)首先,局域网是为任意网络层协议而设计的,而不只是用于 IP 和因特网,为了使网卡能够方便地支持其他网络层协议,链路层地址是必要的。
(2)其次,为了使网络体系结构中各层次成为极为独立的构建模块,不同的层次需要有它们自己的寻址方案。如应用层的域名、网络层的 IP 地址以及链路层的 MAC 地址。
地址解析协议(ARP)
因为存在网络层地址和 MAC 地址,所以需要在它们之间进行转换,这就是地址解析协议(Address Resolution Protocol, ARP)的任务,即解决如何在已知目的接口 IP 地址前提下确定其 MAC 地址。
每台主机或路由器在其内存中维护一个 ARP 表,这张表包含 IP 地址到 MAC 地址的映射关系,同时每条映射有一个寿命(TTL)值,它指示了从表中删除该映射的时间,即 <IP 地址;MAC 地址;TTL>。
ARP 协议将一个 IP 地址解析为一个 MAC 地址,在很多方面它和 DNS 类似,DNS 将主机名解析为 IP 地址。然而,这两种解析器之间的一个重要区别是:DNS 为在因特网中任何地方的主机解析主机名,而 ARP 只为在同一个局域网上的主机和路由器解析 IP 地址。
同一局域网内
假设主机 A 和 B 位于同一个局域网内,A 想要给 B 发送数据包,那么 A 不仅要向它的网卡提供 IP 数据报,而且要提供 B 的 MAC 地址,然后网卡将构造一个包含 B 的 MAC 地址的链路层数据帧,并把该帧发送进局域网。假如 B 的 MAC 地址不在 A 的 ARP 表中,那么 A 用 ARP 协议来解析这个 IP 地址:
- A 广播 ARP 查询分组,其中包含 B 的 IP 地址,目的 MAC 地址为
FF-FF-FF-FF-FF-FF
,局域网中所有节点都会接收该 ARP 查询。 - B 接收 ARP 查询分组,IP 地址匹配成功,利用单播帧向 A 发送应答。
- A 收到 B 发送的 ARP 响应分组后,在其 ARP 表中缓存 B 的 IP-MAC 地址对,直至超时。
ARP 是一个即插即用协议,即节点自主创建 ARP 表,不需要系统管理员来配置。
从一个 LAN 路由到另一个 LAN
现在来看更复杂的情况,即当一个局域网中的某主机要向局域网之外(也就是跨越路由器的另一个局域网)的主机发送网络层数据报。使用下图的场景来讨论这个问题,该图显示了一个由一台路由器互联两个局域网所组成的简单网络。
路由器的每个接口都有一个 ARP 模块和一个网卡,上图中的路由器有两个接口,所以它的每个接口都有一个 IP 地址和一个 MAC 地址。
我们关注寻址问题,包括 IP 地址和 MAC 地址的寻址,我们做如下假设:
- 假设 A 知道 B 的 IP 地址(A 直接输入 IP 地址,或者由 DNS 域名转换);
- 假设 A 知道第一跳路由器 R 左接口的 IP 地址(该接口为 A 的默认网关,通过 DHCP 配置);
- 假设 A 知道第一条路由器 R 左接口的 MAC 地址(位于同一个局域网内,通过ARP 协议获取)。
当主机 A 要给主机 B 发送 IP 数据报时,发送过程如下:
- A 构造 IP 数据报,其中源 IP 地址是 A 的 IP 地址,目的 IP 地址是 B 的 IP 地址。
- A 构造链路层数据帧,其中源 MAC 地址是 A 的MAC 地址,目的 MAC 地址是路由器 R 左接口的 MAC 地址,封装 A 到 B 的 IP 数据报。
路由器 R 左接口接收到 A 发送的链路层数据帧,并完成链路层的相关工作之后,从帧中提取 IP 数据报交由上层 IP 协议进行处理。路由器完成网络层的工作之后(没有 NAT,源和目的 IP 地址不变!),检索其转发表,将 IP 数据报转发到右接口:
- R 创建链路层数据帧,其中源 MAC 地址是 R 右接口的 MAC 地址,目的 MAC 地址是 B 的 MAC 地址,封装 A 到 B 的 IP 数据报。