MAC寻址与ARP
MAC协议
MAC协议规定了帧在链路上的传输规则,MAC层负责传输介质的流控制和多路复用,其中MAC 地址主要用于识别数据链路中互联的节点。
MAC地址通常表示为12个十六进制数,每两个十六进制数之间用冒号隔开,如08:00:20:0A:8C:6D。MAC地址中的前6位十六进制数代表网络硬件制造商的编号,由IEEE分配,后6位十六进制数代表该制造商的某个网络产品的系列号。
MAC地址的结构
MAC地址长48位。严格地说,拥有MAC地址的并不是主机或路由器,而是它们的网络适配器(接口):一台有多个接口的路由器就有多个MAC地址。MAC地址在适配器出厂时写入,通常不会改变;而且它是“平面”的,不含任何位置信息。无论笔记本电脑接入哪个网络,它的MAC地址都一样,而IP地址会随所在子网而变化。这就像一个人的身份证号码与邮寄地址:前者跟着人走,后者取决于住在哪里。
MAC地址前24位的厂商编号称为OUI(Organizationally Unique Identifier)。IEEE保证不同厂商的OUI不同,厂商保证自己生产的适配器序列号不重复,于是每个适配器的MAC地址全球唯一。第一个字节最低的两位还有特殊含义:
| 位 | 为0时 | 为1时 |
|---|---|---|
| I/G(第一个字节的最低位) | 单个地址(单播) | 组地址(组播) |
| U/L(第一个字节的次低位) | 全球唯一,由IEEE分配的OUI决定 | 本地管理,例如手机为保护隐私使用的随机地址 |
48位全为1的地址FF:FF:FF:FF:FF:FF是广播地址,局域网上的每个适配器都会接收目的地址为广播地址的帧。适配器收到一个帧时,会检查目的MAC地址:与自己的地址相同、是广播地址或是自己加入的组播地址,就把数据交给上层;否则直接丢弃,不会打扰主机的CPU。
解读MAC地址,看看谁会接收这个帧
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
地址解析协议(ARP)
主机发送IP数据报时知道目的IP地址,但适配器要把数据报封装成帧,还必须填写目的MAC地址。地址解析协议(ARP, Address Resolution Protocol)负责在同一个子网内把IP地址翻译成MAC地址。
每台主机和路由器都维护一张ARP表,记录IP地址到MAC地址的映射以及该表项的生存时间(TTL),表项通常在20分钟左右后过期。当主机要发送的目的IP地址不在ARP表中时:
- 发送方构造一个ARP查询分组,其中包含自己的IP地址和MAC地址,以及要查询的目标IP地址。
- 这个分组被封装在目的地址为FF:FF:FF:FF:FF:FF、类型为0x0806的广播帧中发送,子网上的每个适配器都会把它交给自己的ARP模块。
- 只有IP地址与目标相同的结点用一个单播帧发回ARP响应,告诉查询方自己的MAC地址;它也可以顺便记下查询方的映射。
- 查询方把收到的映射存入ARP表,然后发送原来的数据报。
ARP是即插即用的:表是自动建立的,不需要管理员配置。ARP分组封装在链路层帧中,却又包含IP地址,所以它可以看作一个跨越链路层和网络层边界的协议。
发送到子网之外
ARP只在同一个子网内工作。如果目的IP地址不在本子网中,发送方要先把数据报交给默认网关(第一跳路由器):它用ARP解析的是网关接口的MAC地址,帧的目的MAC地址是网关的MAC地址,而数据报中的目的IP地址仍然是最终的目的主机。路由器收到帧后取出数据报,查转发表决定输出接口,再在下一个子网中用ARP解析下一跳的MAC地址,封装成新的帧发送出去。
用ARP解析MAC地址
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
追踪从A经路由器到B的每一个帧
主机A通过路由器R向另一个子网上的主机B发送一个IP数据报。开始时所有ARP表都是空的。
- 按顺序列出两个子网上发送的每一个帧,写出它的源、目的MAC地址;如果帧里装的是数据报,再写出其中的IP地址。
- 数据报经过R时,哪些地址改变了,哪些保持不变?
- 总共发送了几次ARP广播?A会知道B的MAC地址吗?
用Python模拟带过期时间的ARP缓存
主机192.168.1.10/24的网关为192.168.1.1。编写Python程序,用字典ip → (mac, expires)作为缓存,TTL为20分钟。对事件列表[(0, 192.168.1.20), (5, 93.184.216.34), (60, 192.168.1.20), (90, 8.8.8.8), (1300, 192.168.1.20)]中的每个事件(时间以秒计、目的IP),确定下一跳并查找缓存,打印是命中缓存还是需要ARP查询。假设邻居的响应为192.168.1.1 → 00:00:0C:12:34:56、192.168.1.20 → 00:1B:21:3A:4F:10。