一、VRRP 报文的基本性质
首先澄清一个常见误解:
❌ VRRP 报文不是“广播”(Broadcast),而是 组播(Multicast)
- 协议类型:网络层协议(IP 协议号
112) - 封装方式:直接封装在 IP 包中(不是 TCP/UDP)
- 目的地址:组播地址
224.0.0.18 - TTL:
255(防止跨路由传播,限制在本地子网) - 源 IP:发送接口的真实 IP(不是 VIP)
- 目的 IP:
224.0.0.18(IANA 分配给 VRRP 的组播地址) - IP 协议号:
112(IANA 注册)
✅ 二、VRRP 报文格式(IP 层 + VRRP 头)
1. IP 层封装
| 字段 | 值 |
|---|---|
| 源 IP 地址 | 发送节点的 真实接口 IP(如 192.168.1.10) |
| 目的 IP 地址 | 224.0.0.18(VRRP 组播地址) |
| 协议(Protocol) | 112(VRRP) |
| TTL | 255(典型值,防跨网段) |
| DF(Don't Fragment) | 通常为 0 |
2. VRRP 报文头(RFC 3768)
深色版本
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority | Auth Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Adver Int | |
+-+-+-+-+-+-+-+-+ +
| Checksum |
| |
| Authentication Data (optional) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段解释:
| 字段 | 说明 |
|---|---|
| Version | 通常是 2(IPv4)或 3(IPv6) |
| Type | 固定为 1(Advertisement 报文) |
| Virtual Rtr ID (VRID) | 虚拟路由器 ID(1-255),用于区分同一网络中的多个 VRRP 组 |
| Priority | 优先级(1-254),255 保留给拥有 VIP 的节点(IP Address Owner) |
| Auth Type | 认证类型(0=无,1=简单密码,2=IP Authentication Header) |
| Adver Int | 广告间隔(单位:秒,默认 1s,Keepalived 可设为 0.1) |
| Checksum | 校验和 |
| Authentication Data | 密码(明文,不安全) |
🔐 注意:VRRP 认证不安全,建议在可信网络使用。
✅ 三、主节点发送 VRRP 报文的接口
主节点通过哪个接口发送 VRRP 报文?是配置了 VIP 的接口吗?
✅ 正确答案:
是的,主节点通过
vrrp_instance中配置的interface指定的接口发送 VRRP 报文,这个接口通常也是 VIP 所在的接口。
示例配置:
conf
深色版本
vrrp_instance VI_1 {
interface eth0 # ← VRRP 报文从此接口发出
virtual_ipaddress {
192.168.1.100 # ← VIP 也绑定在此接口(或子接口)
}
}
- VRRP 报文从
eth0发出 - 源 IP 是
eth0的真实 IP(如192.168.1.10) - VIP 是逻辑 IP,绑定在
eth0或eth0:0上
📌 所以:发送 VRRP 报文的接口 = 配置 VIP 的接口
✅ 四、备节点收到 VRRP 报文后的处理过程
备节点收到 VRRP 报文后,会进行一系列判断,决定是否触发主备切换。
🔄 处理流程如下:
text
深色版本
收到 VRRP 报文
↓
检查目的地址是否为 224.0.0.18 且协议号为 112
↓
验证 VRID 是否匹配本地配置(virtual_router_id)
↓
检查优先级(Priority)
├─ 如果收到的优先级 < 本地优先级 → 忽略
├─ 如果收到的优先级 > 本地优先级 → 重置超时计时器
└─ 如果收到的优先级 == 本地优先级 → 比较 IP 地址(数值大的优先)
↓
重置 **Master_Down_Timer**(默认 = 3 × Adver_Int)
↓
如果在 Master_Down_Timer 超时前未收到下一个 VRRP 报文
↓
判定主节点失效
↓
本地节点发起选举:
- 检查自己健康状态(track_script 是否通过)
- 如果健康,提升为 MASTER
- 执行:
1. ip addr add VIP
2. 发送 Gratuitous ARP
3. 执行 notify_master 脚本
⚠️ 关键点:
-
Master_Down_Timer = 3 × Adver_Int
- 默认
advert_int 1→ 超时 3s - 优化为
advert_int 0.1→ 超时 300ms
- 默认
-
备节点不会立即抢占,除非主节点失效
-
如果配置了
preempt(默认开启),备节点在恢复后可抢回主角色
✅ 五、完整通信示例
假设:
- 主节点:
192.168.1.10/24oneth0,VIP:192.168.1.100 - 备节点:
192.168.1.11/24oneth0 - VRID:
51
主节点发送的 VRRP 报文:
| 字段 | 值 |
|---|---|
| 源 IP | 192.168.1.10(真实 IP) |
| 目的 IP | 224.0.0.18(组播) |
| 协议 | 112(VRRP) |
| VRID | 51 |
| Priority | 100 |
| Adver Int | 100ms |
备节点行为:
- 监听所有协议号为
112的 IP 包 - 收到后匹配 VRID
51 - 更新
Master_Down_Timer = 300ms - 每 100ms 收到一次,计时器重置
- 若 300ms 内未收到 → 触发切换
✅ 六、面试常见问题 & 回答
Q1:VRRP 是广播还是组播?
答:是 组播,目的地址
224.0.0.18,协议号112。
Q2:VRRP 报文源 IP 是 VIP 吗?
答:❌ 不是。源 IP 是发送接口的 真实物理 IP,如
192.168.1.10。
Q3:备节点如何知道主节点是否存活?
答:通过连续接收 VRRP 报文。若
3 × advert_int时间内未收到,则判定主节点失效。
Q4:VRRP 报文走的是 UDP 吗?
答:❌ 不是。VRRP 直接封装在 IP 层,协议号
112,不是 UDP/TCP。
Q5:能否跨 VLAN/VXLAN 发送 VRRP?
答:理论上可以,但需三层路由支持组播转发。生产中通常限制在 同一二层域,避免复杂性。
✅ 总结
| 问题 | 答案 |
|---|---|
| VRRP 报文类型 | IP 层组播报文(协议号 112) |
| 源 IP | 发送节点的真实接口 IP(非 VIP) |
| 目的 IP | 224.0.0.18(VRRP 组播地址) |
| 发送接口 | interface 配置的网卡(通常也是 VIP 所在接口) |
| 备节点处理 | 验证 VRID → 比较优先级 → 重置超时计时器 → 超时则切换 |
💡 一句话总结:
“VRRP 使用 IP 协议号 112,以组播方式发送到224.0.0.18,源 IP 是节点真实 IP。主节点通过配置的接口(如 eth0)周期性发送通告,备节点监听并维护一个超时计时器,超时未收到则接管 VIP。”
掌握这些细节,说明你不仅会配置,更懂底层原理,面试官会眼前一亮。