文章目录
- 概述
- 二、二层广播地址工作原理详细示例
-
- [**第一步:主机A想ping主机B (192.168.1.200)**](#第一步:主机A想ping主机B (192.168.1.200))
-
- [1.1 主机A的思考过程](#1.1 主机A的思考过程)
- [1.2 ARP 请求包构造(主机A → 广播地址)](#1.2 ARP 请求包构造(主机A → 广播地址))
- [1.3 交换机如何处理这个帧](#1.3 交换机如何处理这个帧)
- **第二步:主机B和主机C的处理**
-
- [2.1 主机B的处理](#2.1 主机B的处理)
- [2.2 主机C的处理](#2.2 主机C的处理)
- **第三步:ARP缓存表的变化**
-
- [3.1 主机A的ARP缓存表](#3.1 主机A的ARP缓存表)
- [3.2 主机B的ARP缓存表](#3.2 主机B的ARP缓存表)
- [3.3 主机C的ARP缓存表](#3.3 主机C的ARP缓存表)
- [二 、 3层广播地址](#二 、 3层广播地址)
概述
首先广播地址分为二层广播地址和三层广播地址
二层广播地址是固定的,三层是需要设置的,即我们常说的广播地址是三层,例如 一个网卡的有如下设置:
网络:192.168.1.0/24
ip: 192.168.1.10
广播地址:192.168.1.255
二、二层广播地址工作原理详细示例
场景设定
plaintext
网络:192.168.1.0/24
广播地址:192.168.1.255 (所有主机网卡都设置这个广播地址)
主机A:IP=192.168.1.100,MAC=aa:aa:aa:aa:aa:aa
主机B:IP=192.168.1.200,MAC=bb:bb:bb:bb:bb:bb
主机C:IP=192.168.1.150,MAC=cc:cc:cc:cc:cc:cc
所有主机都连接到同一个交换机
第一步:主机A想ping主机B (192.168.1.200)
1.1 主机A的思考过程
plaintext
"我想和 192.168.1.200 通信,但我不知道它的 MAC 地址。
我需要先通过 ARP 请求获取它的 MAC 地址。"
1.2 ARP 请求包构造(主机A → 广播地址)
plaintext
以太网帧头部:
目标MAC:ff:ff:ff:ff:ff:ff (广播MAC地址)
源MAC:aa:aa:aa:aa:aa:aa (主机A)
类型:0x0806 (ARP协议)
ARP数据部分:
硬件类型:以太网 (0x0001)
协议类型:IPv4 (0x0800)
硬件地址长度:6
协议地址长度:4
操作码:1 (ARP请求)
发送方MAC:aa:aa:aa:aa:aa:aa
发送方IP:192.168.1.100
目标MAC:00:00:00:00:00:00 (未知,填充为全0)
目标IP:192.168.1.200
备注:
二层广播MAC(ff:ff:ff:ff:ff:ff):
硬件固定,不可配置所有广播包的二层目标都是这个- 确保物理层所有设备都能收到
1.3 交换机如何处理这个帧
plaintext
交换机收到从端口1来的帧:
1. 查看目标MAC:ff:ff:ff:ff:ff:ff (广播地址)
2. 决定:泛洪(flood)到所有其他端口(除了收到端口)
3. 主机B(端口2)和主机C(端口3)都会收到这个帧
第二步:主机B和主机C的处理
2.1 主机B的处理
plaintext
1. 网卡收到帧,检查目标MAC:
ff:ff:ff:ff:ff:ff → 这是广播地址!
→ 所有网卡都必须接收广播帧
2. 解析ARP请求:
"有人在问:谁有 192.168.1.200?"
→ 咦,这就是我的IP地址!
3. 主机B发送ARP回复(单播):
以太网帧头部:
目标MAC:aa:aa:aa:aa:aa:aa (主机A)
源MAC:bb:bb:bb:bb:bb:bb (主机B)
ARP数据部分:
操作码:2 (ARP回复)
发送方MAC:bb:bb:bb:bb:bb:bb
发送方IP:192.168.1.200
目标MAC:aa:aa:aa:aa:aa:aa
目标IP:192.168.1.100
2.2 主机C的处理
plaintext
1. 网卡收到帧,检查目标MAC:
ff:ff:ff:ff:ff:ff → 这是广播地址,必须接收
2. 解析ARP请求:
"有人在问:谁有 192.168.1.200?"
→ 这不是我的IP地址(我是192.168.1.150)
3. 主机C的操作:
a) 默默丢弃这个ARP请求
b) 但会学习:192.168.1.100 → aa:aa:aa:aa:aa:aa
c) 更新自己的ARP缓存表
第三步:ARP缓存表的变化
3.1 主机A的ARP缓存表
plaintext
通信前:
空表
收到ARP回复后:
192.168.1.200 → bb:bb:bb:bb:bb:bb
(状态:可达,缓存时间通常2分钟)
3.2 主机B的ARP缓存表
plaintext
回复后自动添加:
192.168.1.100 → aa:aa:aa:aa:aa:aa
3.3 主机C的ARP缓存表
plaintext
被动学习:
192.168.1.100 → aa:aa:aa:aa:aa:aa
二 、 3层广播地址
如果设置了非标准广播地址
假设主机A设置了:
bash
sudo ip addr add 192.168.1.100/24 brd 192.168.1.200 dev eth0
问题1:ARP请求发到哪里?
plaintext
主机A构造ARP请求时:
目标MAC还是:ff:ff:ff:ff:ff:ff (二层广播,不变)
但目标IP广播地址被错误地理解为:192.168.1.200
实际上,对于ARP来说:
二层广播地址(ff:ff:ff:ff:ff:ff)才是关键
但一些网络栈可能会混乱
问题2:主机B能收到吗?
plaintext
能收到!因为:
1. 二层MAC地址仍然是广播地址
2. 交换机仍然会泛洪
3. 主机B的网卡仍然会接收广播帧
也就是说此时对于A的发送是没有任何影响的,及时设置一个非标准的3层掩码,因为此时压根没用到这个掩码 !
但问题在于:
- 主机A可能不会接收别人广播到192.168.1.255的包
- 某些网络栈实现可能行为异常
- 路由选择或其他网络功能可能出错
错误广播地址的实际影响案例(必现场景)
前提条件
- 主机A配置:
sudo ip addr add 192.168.1.100/24 brd 192.168.1.200 dev eth0(错误广播地址192.168.1.200,标准应为192.168.1.255/24) - 同网段其他主机:B(192.168.1.50)、C(192.168.1.150)、D(192.168.1.200)
场景1:局域网广播扫描工具完全失效(最直观)
操作步骤
- 在主机A执行标准网段扫描命令:
ping -b 192.168.1.255 - 或执行 ARP 扫描命令:
arp-scan -l
现象
ping -b 192.168.1.255无任何主机回复(仅主机D可能回复)arp-scan -l只能扫描到主机D(192.168.1.200),B、C完全无法识别
根本原因
ping -b、arp-scan等工具会读取本机配置的广播地址作为目标IP- 主机A实际发送的是单播包(目标IP=192.168.1.200),而非标准广播包(目标IP=192.168.1.255)
- 只有IP为
192.168.1.200的主机D能接收,其他主机收不到扫描请求
场景2:无法接收局域网标准广播服务通知
操作步骤
- 主机B(正常配置广播地址
192.168.1.255)开启 Windows 共享文件夹 / 局域网联机游戏房间 - 主机B会定时发送标准广播包(目标IP=192.168.1.255)宣告服务存在
- 在主机A上搜索局域网共享 / 游戏房间
现象
- 主机A的「网络邻居」看不到主机B的共享文件夹
- 主机A的游戏客户端搜不到主机B创建的房间
- 其他正常配置的主机可以正常发现主机B的服务
根本原因
- 主机A的网络栈会校验收到的广播包:只有目标IP与本机配置的广播地址一致,才会交给上层应用
- 主机B发送的广播包目标IP=192.168.1.255,与主机A配置的
192.168.1.200不匹配 - 主机A的网络栈直接丢弃该广播包,应用层无法感知服务存在
核心共性结论
错误广播地址的影响仅作用于三层广播通信,分为两类:
- 发送侧:本机广播工具的目标IP被错误地址带偏,从「一对多」变成「一对一」
- 接收侧:丢弃所有目标IP为标准广播地址的包,无法感知局域网广播服务