

在之前的网络层中,数据间的通信除了需要知道源地址和目的地址IP外,在经过每一个节点时都需要寻找下一个节点或目的设备。
由于这些节点和目的设备都位于各自的局域网中,数据每到达一个局域网,就必须获得下一跳节点的MAC地址。这样一来,就出现了一个现实问题:已知目标IP地址,却要在本地网络中查找对应的MAC地址。
为了解决已知目标IP地址,却要在本地网络中查找对应的MAC地址的情况,ARP协议诞生了。但在了解ARP协议之前,我们需要先了解数据是怎么在局域网中传输的。
这些都是在数据链路层执行的。
以太网数据帧
因为一些历史原因,目前数据链路层主流的传输载体是以太网数据帧(无线技术的跟这个很相似)为主。
| 字段 | 长度(字节) | 作用 |
|---|---|---|
| 目的地址 | 6 | 接收方的 MAC 地址,标识帧要发给谁 |
| 源地址 | 6 | 发送方的 MAC 地址,标识帧是谁发的 |
| 类型 | 2 | 标识数据部分是什么协议(比如 IP/ARP) |
| 数据 | 46~1500 | 真正要传输的上层数据,有最小 / 最大限制 |
| CRC | 4 | 帧校验序列,用来检测传输中有没有出错 |
以太网数据帧采取固定长度的形式,对于不满足最小长度的数据会进行填充处理。
数据碰撞,交换机

之前我们学习到,当同一区域主机数量过多导致网络阻塞时,各主机会暂停数据报的上传下载(卡顿现象)。
为了优化这一问题,减少数据碰撞,以太网中设计出交换机这一设备。

交换机连接着多个端口,每个端口各自连接一台主机(或一个网段),从而将原本一个大的冲突域分割成多个小的独立的冲突域。
以上图为例:当主机A需要发送信息给同一侧的主机D时,交换机会根据记载的MAC地址表判断出目的端口与源端口相同(即都在左侧),于是它不会将这个数据转发到右侧端口,从而避免了A的发送对右侧主机C、E造成不必要的干扰和碰撞;反之,当主机A确定要发送消息给右侧的主机E或C时,交换机会查表得知目的端口在右侧,于是只将数据从对应的右侧端口转发出去,确保A的信息能准确到达右侧,同时仍然不影响其他端口上的通信。
本质上,交换机将单一的区块划分成多个独立的端口区块,只在真正需要跨区块通信时才进行转发,从而避免了非必要的数据扩散和碰撞。这种隔离和保护是相互的------左侧的通信不会干扰右侧,右侧的通信也不会干扰左侧。
就算碰撞也只会发生在各自的子块内。
ARP协议
ARP协议的工作原理类似于新来的老师在班级上一个个点名记录学生的信息,老师只知道学生的名字而不知道学生的具体信息,于是老师就可以通过喊话呼喊对应的同学,被叫道名字的同学向老师说明个人信息。
当数据传输到局域网时,路由器(不一定非是路由器啊)会拿着目的IP地址向其下的各主机发送一段ARP报文,每个主机都能收到。但只有IP地址对应上的主机才会将其保留并做出回应。
ARP协议格式

| 部分 | 字段名称 | 长度(字节) | 关键说明 | 常见取值(以太网 + IPv4 场景) |
|---|---|---|---|---|
| 以太网帧首部 | 以太网目的地址 | 6 | 接收方的 MAC 地址,ARP 请求时为广播地址,应答时为请求方的单播地址 | 请求:FF:FF:FF:FF:FF:FF(广播)应答:请求方的 MAC 地址 |
| 以太网源地址 | 6 | 发送方的 MAC 地址 | 本机的物理 MAC 地址 | |
| 帧类型 | 2 | 标识数据部分的上层协议 | ARP:0x0806 |
|
| ARP 报文本体(28 字节) | 硬件类型 | 2 | 标识底层网络硬件类型 | 以太网固定为1 |
| 协议类型 | 2 | 标识要解析的上层协议类型 | IPv4 固定为0x0800 |
|
| 硬件地址长度 | 1 | 硬件地址(MAC)的字节长度 | 以太网固定为6 |
|
| 协议地址长度 | 1 | 协议地址(IP)的字节长度 | IPv4 固定为4 |
|
| op(操作码) | 2 | 标识报文的类型 | 1=ARP 请求2=ARP 应答3=RARP 请求4=RARP 应答 |
|
| 发送端以太网地址 | 6 | 发送方自己的 MAC 地址 | 发送方的物理 MAC 地址 | |
| 发送端 IP 地址 | 4 | 发送方自己的 IP 地址 | 发送方的 IPv4 地址 | |
| 目的以太网地址 | 6 | 目标设备的 MAC 地址 | 请求时:00:00:00:00:00:00(未知)应答时:目标方的 MAC 地址 |
|
| 目的 IP 地址 | 4 | 要查询的目标 IP 地址 | 请求时:目标主机的 IPv4 地址应答时:发送方的 IPv4 地址 | |
| 帧尾部 | CRC 校验 | 4 | 整个以太网帧的循环冗余校验 | 由发送方计算,接收方校验 |
ARP缓存表(IP-Mac映射表)
数据链路层使用ARP协议传输数据时会缓存构建出一张IP-Mac映射表:
| 字段 | 说明 | 示例 |
|---|---|---|
| IP地址 | 目标设备的网络层地址 | 192.168.1.1 |
| MAC地址 | 对应IP的物理地址(数据链路层用) | 00:1A:2B:3C:4D:5E |
| 接口 | 从本机哪个网口出去能到达这个IP | eth0 或 WLAN |
| 类型 | 动态(Dynamic)/ 静态(Static) | Dynamic |
| 生存时间 | 还有多久过期(单位:秒) | 多少秒后失效,默认是一分钟左右 |
ARP缓存表能够提高查找效率、降低广播次数。但由于主机的IP地址和MAC地址可能发生变动(如机器重启后IP重新分配,或更换设备导致MAC地址改变),每一张映射表都设有一个生存时间(TTL)。生存时间一到,表项就会失效,设备会重新广播ARP请求并接收应答,在此期间缓存表会完成更新。
中间人攻击
步骤一:
步骤二:
步骤三:
由于ARP缓存会优先采用最新收到的地址映射,当中间人大量、持续地向通信双方发送伪造的ARP应答(告诉A"网关的MAC是M",告诉网关"A的MAC是M"),双方就会把自己的ARP缓存更新为攻击者的MAC地址。这样一来,所有本该在A和网关之间直接传输的数据流,都会被发送到攻击者M那里,M便可以插入到双方的通话中,实现窃听、篡改或阻断。