10TCP/IP详解(卷1:协议)

BOOTP和DHCP

动态主机配置

BOOTPDHCP动态IP分配

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第10章:BOOTP和DHCP(BOOTP and DHCP)

动态主机配置

一、导读

1.1 本章学习目标

第10章深入讲解BOOTP和DHCP——现代网络中IP地址自动分配的核心协议。当你的电脑或手机连接到Wi-Fi时,它会自动获得IP地址、子网掩码、默认网关、DNS服务器等配置信息,这一切都归功于DHCP。DHCP是BOOTP的超集,是当今网络中主机配置的标准方式。

本章的核心学习目标包括:

  • 理解BOOTP的工作原理:BOOTP如何取代RARP
  • 深入掌握DHCP的完整工作流程:DORA四步过程(Discover→Offer→Request→Acknowledge)
  • 理解DHCP的地址分配机制:静态分配、动态分配、自动分配的区别
  • 掌握DHCP租约的生命周期:获取、使用、续约、释放
  • 了解DHCP中继代理的作用:如何让DHCP请求跨路由器传播
  • 学会配置和管理DHCP服务器:dhcpd.conf的配置

1.2 为什么本章如此重要

DHCP是网络基础设施的核心组件。几乎每一个企业网络、家庭网络、公共Wi-Fi都依赖DHCP来自动分配IP地址。理解DHCP对于以下方面至关重要:

  • 网络管理:配置DHCP服务器、排查地址分配问题
  • 故障诊断:理解"无法获取IP地址"的原因
  • 网络设计:合理规划地址池、租约时间
  • 安全:防范DHCP欺骗攻击

DHCP也是理解网络启动过程的关键。PXE(Preboot Execution Environment)网络启动使用DHCP获取IP地址和引导服务器信息,是数据中心大规模部署服务器的基础技术。

1.3 核心问题引导

在阅读本章时,请带着以下问题思考:

DHCP的DORA过程为什么需要四个步骤?两个步骤(Discover→Ack)够吗?

为什么DHCP的Discover和Offer使用广播,而客户端此时还没有IP地址?

DHCP租约机制解决了什么问题?如果没有租约,地址池耗尽后怎么办?

DHCP中继代理是如何工作的?它修改了DHCP报文的哪些字段?

如果网络中有两个DHCP服务器,客户端会如何处理?

DHCP可以分配哪些配置信息?除了IP地址,还能提供什么?


二、核心概念详解

2.1 BOOTP(Bootstrap Protocol)

BOOTP(RFC 951, 1985年)是RARP的替代方案,使用UDP传输,支持跨路由器,可以提供更丰富的配置信息。

2.1.1 BOOTP报文格式

BOOTP报文固定300字节,使用UDP传输(客户端端口68,服务器端口67):

字段长度说明
op1操作码:1=请求,2=响应
htype1硬件类型(1=以太网)
hlen1硬件地址长度(6)
hops1跳数(中继代理使用)
xid4事务ID(随机生成,用于匹配请求和响应)
secs2启动经过的秒数
flags2标志位(最高位:1=广播响应)
ciaddr4客户端IP地址(客户端已知时使用)
yiaddr4你的IP地址(服务器分配)
siaddr4服务器IP地址
giaddr4中继代理IP地址
chaddr16客户端硬件地址
sname64服务器名
file128引导文件名
options可变可选参数(后来扩展为DHCP选项)

2.1.2 BOOTP vs RARP

特性RARPBOOTP
传输层链路层UDP
跨路由器不支持支持(中继代理)
提供的信息仅IPIP、网关、DNS、引导文件
地址分配静态映射静态映射

2.2 DHCP(Dynamic Host Configuration Protocol)

DHCP(RFC 2131, 1997年)是BOOTP的超集,增加了动态地址分配和租约机制。DHCP完全兼容BOOTP——DHCP报文就是带有特殊选项的BOOTP报文。

2.2.1 DHCP的DORA过程

客户端                              DHCP服务器
  │                                     │
  │  ① DHCP Discover(广播)            │
  │  src=0.0.0.0, dst=255.255.255.255  │
  │  选项:DHCP Message Type=Discover   │
  │  选项:Requested Parameters         │
  │ ──────────────────────────────────→ │
  │                                     │
  │  ② DHCP Offer(广播)               │
  │  src=服务器IP, dst=255.255.255.255  │
  │  yiaddr=提供的IP地址                │
  │  选项:DHCP Message Type=Offer      │
  │  选项:Subnet Mask, Router, DNS...  │
  │  选项:Lease Time                   │
  │ ←────────────────────────────────── │
  │                                     │
  │  ③ DHCP Request(广播)             │
  │  src=0.0.0.0, dst=255.255.255.255  │
  │  选项:DHCP Message Type=Request    │
  │  选项:Server Identifier=选中的服务器│
  │  选项:Requested IP=选中的IP        │
  │ ──────────────────────────────────→ │
  │                                     │
  │  ④ DHCP Acknowledge(广播)         │
  │  src=服务器IP, dst=255.255.255.255  │
  │  yiaddr=确认分配的IP地址            │
  │  选项:DHCP Message Type=Ack        │
  │  选项:所有配置参数                  │
  │ ←────────────────────────────────── │
  │                                     │
  │  客户端配置IP地址,开始使用          │

2.2.2 为什么需要四个步骤

  • Discover→Offer:客户端寻找服务器,服务器提供地址
  • Request→Ack:客户端确认选择,服务器确认分配

为什么不能只有两步(Discover→Ack)?因为可能有多个服务器响应Offer。客户端需要选择一个服务器(通常是最先收到的Offer),通过Request告知所有服务器自己的选择。未选中的服务器收到Request后,知道客户端没有选择自己,会释放预留的地址。

2.2.3 DHCP选项

DHCP通过选项(options)传递配置信息:

选项号名称说明
1Subnet Mask子网掩码
3Router默认网关
6DNS ServerDNS服务器
15Domain Name域名
28Broadcast Address广播地址
51Lease Time租约时间(秒)
53Message TypeDHCP消息类型
54Server Identifier服务器标识
55Parameter Request请求的参数列表

2.3 DHCP地址分配方式

方式说明适用场景
静态分配根据MAC地址分配固定IP服务器、打印机
动态分配从地址池分配,有租约普通客户端
自动分配永久分配第一个获得的IP混合场景

2.3.1 动态分配的地址池

# dhcpd.conf 配置示例
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;     # 地址池
  option routers 192.168.1.1;             # 默认网关
  option domain-name-servers 8.8.8.8;     # DNS
  default-lease-time 3600;                # 默认租约1小时
  max-lease-time 86400;                   # 最大租约24小时
}

2.4 DHCP租约管理

2.4.1 租约生命周期

获取IP ──→ T1时间 ──→ T2时间 ──→ 租约到期
  │          │          │          │
  │          │          │          └── 停止使用,重新Discover
  │          │          └── 广播Request续约(任何服务器可响应)
  │          └── 单播Request续约(原服务器响应)
  └── 使用IP地址
  • T1(通常为租约的50%):客户端尝试向原服务器续约
  • T2(通常为租约的87.5%):客户端广播续约请求(任何服务器可响应)
  • 租约到期:客户端必须停止使用IP地址

2.4.2 租约续约

bash
# 查看DHCP租约
cat /var/lib/dhcp/dhclient.leases
# lease {
#   interface "eth0";
#   fixed-address 192.168.1.100;
#   option subnet-mask 255.255.255.0;
#   option routers 192.168.1.1;
#   option domain-name-servers 8.8.8.8;
#   renew 2 2026/10/07 06:00:00;   # T1
#   rebind 2 2026/10/07 09:00:00;  # T2
#   expire 2 2026/10/07 18:00:00;  # 到期
# }

# 手动释放租约
sudo dhclient -r eth0

# 手动获取新租约
sudo dhclient eth0

2.5 DHCP中继代理

DHCP使用广播,路由器默认不转发广播帧。DHCP中继代理(relay agent)解决了这个问题:

客户端A ──→ 路由器(中继代理)──→ DHCP服务器
192.168.1.0/24    giaddr=192.168.1.1    10.0.0.1

中继代理收到客户端的DHCP广播后:

将广播改为单播,发送给指定的DHCP服务器

在BOOTP报文的 giaddr 字段填入自己的接口地址

DHCP服务器根据 giaddr 确定客户端所在的子网,选择正确的地址池


三、实战案例

3.1 案例一:使用tcpdump观察DHCP过程

bash
sudo tcpdump -i eth0 -nn -v 'udp port 67 or udp port 68'

输出示例(DORA过程):

# Discover
12:34:56.789 IP 0.0.0.0.68 > 255.255.255.255.67:
  BOOTP/DHCP, length 300: Request (0x01), hwaddr 00:11:22:33:44:55
  DHCP-Message Option 53, length 1: Discover
  Option 55, length 5: Request: SubnetMask, Router, DNS, Domain, LeaseTime

# Offer
12:34:56.790 IP 192.168.1.1.67 > 255.255.255.255.68:
  BOOTP/DHCP, length 300: Reply (0x02), yiaddr 192.168.1.100
  DHCP-Message Option 53, length 1: Offer
  Option 1, length 4: SubnetMask 255.255.255.0
  Option 3, length 4: Router 192.168.1.1
  Option 6, length 4: DNS 8.8.8.8
  Option 51, length 4: LeaseTime 3600

# Request
12:34:56.791 IP 0.0.0.0.68 > 255.255.255.255.67:
  BOOTP/DHCP, length 300: Request (0x01)
  DHCP-Message Option 53, length 1: Request
  Option 54, length 4: ServerID 192.168.1.1
  Option 50, length 4: RequestedIP 192.168.1.100

# Ack
12:34:56.792 IP 192.168.1.1.67 > 255.255.255.255.68:
  BOOTP/DHCP, length 300: Reply (0x02), yiaddr 192.168.1.100
  DHCP-Message Option 53, length 1: Ack

3.2 案例二:配置ISC DHCP服务器

bash
# 安装
sudo apt install isc-dhcp-server

# 配置 /etc/dhcp/dhcpd.conf
default-lease-time 3600;
max-lease-time 86400;
authoritative;

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  option domain-name "example.local";
}

# 静态分配
host server1 {
  hardware ethernet 00:11:22:33:44:55;
  fixed-address 192.168.1.10;
}

# 启动服务
sudo systemctl start isc-dhcp-server

3.3 案例三:DHCP故障排查

bash
# 步骤1:检查是否获取到IP
ip addr show eth0
# 如果没有IP或显示169.254.x.x(APIPA),说明DHCP失败

# 步骤2:手动获取DHCP地址
sudo dhclient -v eth0
# -v 显示详细的DHCP过程

# 步骤3:检查DHCP服务器是否可达
ping 192.168.1.1

# 步骤4:查看DHCP日志
sudo journalctl -u isc-dhcp-server

四、常见误区与难点

4.1 误区一:"DHCP使用TCP"

DHCP使用UDP(客户端68,服务器67)。因为客户端在获取IP地址之前没有有效的IP配置,使用UDP更简单。

4.2 误区二:"DHCP Offer是单播发送给客户端的"

在客户端配置IP地址之前,它还不能接收单播数据报。因此,DHCP Offer通常使用广播发送(除非客户端在Discover中设置了broadcast flag=0,且服务器支持单播Offer)。

4.3 难点:理解中继代理的giaddr字段

giaddr(gateway IP address)是中继代理填入的自己的接口地址。DHCP服务器根据giaddr确定客户端所在的子网,从而选择正确的地址池和配置参数。这是DHCP能够跨路由器工作的关键。


五、本章小结

第10章深入讲解了BOOTP和DHCP:

BOOTP取代了RARP,使用UDP传输,支持跨路由器和丰富的配置选项。

DHCP是BOOTP的超集,增加了动态地址分配和租约机制,是现代网络的标准。

DORA过程:Discover→Offer→Request→Acknowledge,四步完成地址分配。

租约机制:客户端租用IP地址,到期前续约,保证地址的有效利用。

DHCP中继代理:通过giaddr字段实现DHCP请求的跨路由器传播。


六、思考与练习

思考题

如果DHCP只有两步(Discover→Ack),没有Request阶段,会有什么问题?

DHCP租约时间设得太长或太短分别有什么问题?如何确定合适的租约时间?

如果网络中有恶意DHCP服务器,会造成什么危害?如何防范?

IPv6的DHCPv6与DHCPv4有什么区别?IPv6的无状态地址自动配置(SLAAC)如何替代DHCP?

练习题

使用tcpdump捕获完整的DHCP DORA过程,分析每个报文的选项字段。

搭建一个DHCP服务器(如dnsmasq),为虚拟机分配IP地址。

查看本机的DHCP租约信息,分析获得的各项配置参数。

10/13BOOT
0%