设备一接入网络,一整套设置就自己到位了——不只是 IP 地址,还有掩码、网关、DNS、域名、时间去哪对表……这些"必要的设置"全装在 DHCP 报文的一个开放清单(options 字段)里,由发号员一次性发下来;而这份配置不是一次性的,它带着租期,客户端身上装着 T1、T2 两道闹钟,到期前自己会去续租——所以整套自动配置几乎不需要人管。
3.12 讲的是"设备怎么才算接入网络":链路通 vs 网络通、四件套、DORA 四步、租期概念、APIPA 兜底。 本节把镜头对准"自动设置"这件事本身,回答三个 3.12 留下没答的问题: 1. "必要的设置"到底有哪几件? 3.12 讲了四件套,其实能自动下发的远不止四件 2. 一个包怎么装得下这么多设置? → 报文的固定字段 + 可长可短的 options 3. 配完就完了吗? → 租期的长期维护机制:两道闹钟
3.21 / 3.22 讲的是"怎么找到别人"(DNS),本节讲的是"自己是谁、怎么配好"(DHCP)——正好是 3.22 那张分岔表的另一半。先有 DHCP 把自己配好,DNS 才有得用。
一、先把这一节的"新"在哪说清
3.12 已经把 DORA 四步和四件套讲完了,那本节还有什么?三件:
| 本节要回答 | 3.12 的状态 |
|---|---|
| 能自动下发的设置清单有多长 | 只讲了最常发的"四件套" |
| 一个包怎么装下这么多不同种类的设置 | 没提报文结构 |
| 配置怎么长期维持(到期、续租的细节) | 只说了句"到期前单播续租" |
| 一个发号员怎么管多个网段 | 没提 |
| 哪些设备其实不该用自动 | 提了一句"固定设备手动",没给第三条路 |
二、"必要的设置"到底是哪几件
DHCP 报文的两半:固定字段 + 设置清单
一个 DHCP 报文分两大块:
| 块 | 里面装什么 |
|---|---|
| 固定字段(长度写死) | 报文类型(请求/应答)、xid 事务号、yiaddr 你的 IP 地址、chaddr 你的 MAC、giaddr(中继用,见第六节) |
| options 选项(可长可短) | 一长串"设置项",想发多少发多少 |
这里有一处最容易想错的地方,我单独拎出来:
大家习惯说"DHCP 发 IP",好像 IP 也是清单里的一项。不是。
分给你的那个 IP 地址,装在报文的固定字段 yiaddr(Your IP Address)里;而掩码、网关、DNS 这些东西装在 options 里。
为什么分开?因为 IP 是"这次问答的结果"(每台设备都必然有一个),而其余设置是"附加信息"(不同网络、不同厂商要发的项不一样)。结果固定,附加项开放。
清单里常见的那几项(图一)
(对应上面第一张图)
| option 号 | 设置项 | 作用 |
|---|---|---|
| 1 | 子网掩码 | 我跟谁算一伙(3.11) |
| 3 | 默认网关 | 出门口在哪(3.7) |
| 6 | DNS 服务器 | 域名去哪查号(3.21) |
| 15 | 域名 | 我是哪个域的成员(Windows 里进域很有用) |
| 51 | 租期 | 这个号能租多久(本节的图二讲它) |
| 58 / 59 | T1 / T2 | 两道续租闹钟的时间点(可省,省了按租期算) |
| 42 | NTP 服务器 | 时间去对表(3.20 里那个 UDP 123 的出处) |
| 121 | 无类静态路由 | 去某些网段走哪条路(比默认网关精细,收 3.7) |
| 54 | 服务器标识 | "发号员是我"(多台服务器时用来指名) |
| 53 | 报文类型 | 这个是 DISCOVER 还是 ACK(第五节的八种报文靠它区分) |
更准确的说法是:DHCP 是一套"下发配置"的框架,IP 地址只是它最显眼的一件货。
这也是它为什么能活到今天:选项是开放的——哪天需要下发一种新的设置(新的时间源、新的代理地址),只要分配一个 option 号就行,协议本身一个字都不用改。
3.12 说的"四件套"(IP/掩码/网关/DNS),对应的就是 yiaddr + option 1 + option 3 + option 6。
3.22 说"DNS 服务器地址本身就是 DHCP 发的"——现在能看到它的具体位置了:在 option 6 里。
所以那条链是:DHCP 先发下一个 DNS 地址(option 6)→ 解析模块才有"问询名单"→ 才查得了域名。两节的顺序是先后关系,不是并列关系。
三、发号员是谁
3.12 提过一句"发号员不一定得是台专门服务器",本节列全:
| 场景 | 发号员 |
|---|---|
| 家里 | 路由器兼任(最普遍) |
| 公司 | 一台专门的服务器(Windows Server 的 DHCP 角色 / Linux 的 dhcpd),或核心交换机 |
| 运营商 | 给宽带用户发号的服务器(发的是公网或大内网地址) |
| 公共 Wi-Fi | 通常是那台无线控制器或网关设备 |
判断自家是哪种,只要一条命令:ipconfig /all 里的「DHCP 服务器」那一行(收 3.12)。
四、八种报文:DORA 之外还有四种
3.12 讲了四步(DISCOVER / OFFER / REQUEST / ACK),那是正常领号的路径。完整的一套其实有八种:
| 报文 | 方向 | 什么时候出现 |
|---|---|---|
| DHCPDISCOVER | 客户端 → 广播 | 我是新来的,谁是发号员? |
| DHCPOFFER | 服务器 → 客户端 | 我这有 192.168.1.103,要不要? |
| DHCPREQUEST | 客户端 → 广播 | 我就要这一个 |
| DHCPACK | 服务器 → 客户端 | 成交,附带一整套设置 |
| DHCPNAK | 服务器 → 客户端 | 你这个号不能用了(换了网段 / 号已被收回)→ 客户端必须立刻放弃、重新 DISCOVER |
| DHCPDECLINE | 客户端 → 服务器 | 这号有人占了!(客户端用免费 ARP 探测发现冲突,收 3.16) |
| DHCPRELEASE | 客户端 → 服务器 | 我走了,号还你(就是 ipconfig /release) |
| DHCPINFORM | 客户端 → 服务器 | 我有地址了,只想知道别的设置(比如手工配了 IP,只想自动拿 DNS) |
用 option 53 里的类型号区分:1 DISCOVER / 2 OFFER / 3 REQUEST / 4 DECLINE / 5 ACK / 6 NAK / 7 RELEASE / 8 INFORM。
NAK 是这四个里面最重要的一个——它把"自动"变成了"可撤销":
想象你带着笔记本从家(192.168.1.x)到公司(10.0.0.x),开机后它习惯性地拿老号去续租。如果服务器只会说"不行"却不明确拒绝,客户端会一直等。
NAK 就是那句干脆的"不行":地址不对、或者这个号已经分配给别人了。客户端收到它,立刻丢掉旧配置、从 DISCOVER 重新开始。
顺带说明:一台设备换到新网络后 IP 会变(收 3.8 那句"IP 跟位置走不跟机器走"),根子就在这个机制上。
3.17 那张已知端口名册里,67 / 68 是唯一一对"成对出现"的端口:
- 68 是客户端用的(它还没地址,所以只能从这个固定号出发)
- 67 是服务器用的(守在这里等所有人来问)
这正是 3.17 讲的"服务器守固定号,客户端借临时号"的一个特例——DHCP 的客户端不得不借一个固定号(68),因为它发第一个包时还没有 IP 地址(源地址写着 0.0.0.0)。
那个 xid 是干什么的
客户端第一次喊话时(DISCOVER),会随手生成一个事务号 xid,后面整轮问答都带着它。
为什么需要?因为可能不止一台发号员——同一次喊话被三台服务器听到,三份 OFFER 都会飘回来。客户端靠 xid 认出"哪几份是回答我这一次的",再把它们放在一起挑一个(通常挑第一个到的)。
而 chaddr(客户端 MAC) 才是服务器认人的依据——服务器记的不是"上次给了谁哪个 IP",而是"上次哪个 MAC 拿了哪个 IP"(收 3.16 的双层门牌)。所以重连往往还是老号,理由在这里。
五、长期维护:租期与两道闹钟
(对应上面第二张图)
IP 是租的不是买断,这一点 3.12 讲过。本节要补的是它怎么自动维持。
| 时间点 | 叫什么 | 客户端做什么 | 用什么方式 |
|---|---|---|---|
| 租期的 50% | T1 | 向原来那台服务器申请续租 | 单播(它知道服务器是谁了,不必再喊) |
| 租期的 87.5% | T2 | T1 没成功 → 广播找任何一台发号员 | 广播 |
| 租期 100% | 届满 | 还没续上 → 停用这个地址,回到 0.0.0.0 重新走 DORA |
— |
几个值得记的点:
- 续租成功 → 时钟归零、重新从 50% 算起。 所以一直续得上,你就一直用同一个号(这就是 3.12 说的"手机断了 Wi-Fi 重连还是老号")。
- T1 走单播,是为了省事;T2 走广播,是因为原服务器可能已经没了(它宕机、或者你换了机房)——广播是"退而求其次找别人"的兜底。
- 两个时间点可以由服务器在 option 58 / 59 里直接指定,不指定就按 50% / 87.5% 算。
租期是服务器定的,但服务器从不主动来催你——它只在你问的时候回答。
续租的发起方永远是客户端。
为什么这么设计?因为一台服务器可能要服务几千台设备。如果它得记住每台的到期时间、再挨个去通知,成本极高;反过来,让每台客户端自己记自己的闹钟,服务器只做"应答"这一件轻活,整套系统的负担就散开了。
这就是 3.22 那句"越靠顶层干的活越少"之外,另一种同源的思路:把复杂度推给数量少、需求弱的那一侧。
把这几个"老化"放在一起看:
| 什么状态 | 怎么维持 | 出处 |
|---|---|---|
| NAT 会话表 | 靠后续包刷新,久了就删 | 3.14 |
| ARP 表项 | 有寿命,几十秒到几分钟 | 3.16 |
| DNS 缓存 | 按 TTL 倒计时 | 3.21 |
| DHCP 租约 | 靠 T1/T2 定时续租 | 本节 |
网络里没有"永久记住"这回事——所有状态都得定时"续一口气",否则自动清掉。这不是偷懒,是为了防止过期信息变成错误信息(收 3.21 那个"改了解析却没生效")。
六、一台服务器怎么管多个网段:中继代理
DHCP 第 1 步是广播,而 广播出不了网段(收 3.9,路由器默认不转发广播)。
按这个逻辑,每个网段都得放一台发号员?公司有二十个网段就得二十台?太浪费了。解决办法叫DHCP 中继代理(relay agent):
客户端 ──广播──► 本网段的路由器(开了中继)──单播──► 远方那台唯一的 DHCP 服务器
↑ 同时把 giaddr 填成"这个网段"的地址
- 中继做的事:把"本网段的广播"翻译成"发往服务器的单播",再把服务器的回答转回本网段。
- 为什么必须填 giaddr:服务器收到请求后要判断"该从哪个地址池发号"。客户端本身没地址(
0.0.0.0),没法告诉服务器自己在哪一段——所以中继在 giaddr 字段里填上"我这边的地址",服务器看它就知道该用哪个池子。
giaddr = "这个请求是从哪个网段转发来的"。 它是 DHCP 能在企业网里"一对多"的全部前提。
家用网络里用不到它,所以普通用户从来看不见这个字段;但只要你在公司网络里见过"DHCP 服务器不在本网段、却能给你发号",背后就是它在工作。
七、自动不等于随便:第三条路
2.5 和 3.12 说过两种配置方式(手工静态 / DHCP 自动)。现实中最常见的其实是第三种:
| 方式 | 号怎么定 | 在哪配 | 适合谁 |
|---|---|---|---|
| 手工静态 | 设备上写死 | 设备上敲 | 极少改动的核心设备 |
| 纯动态 | 从池子里随机给 | 服务器(不用管) | 手机、笔记本、访客 |
| 保留地址(Reservation) | 按 MAC 绑定一个固定号 | 服务器上绑 | 打印机、NAS、摄像头、监控主机 |
保留地址的好处是鱼与熊掌兼得:设备那一边看起来还在"自动获取"(不用手工敲、不会写错),但每次拿到的都是同一个号——它就能被稳定地访问到。
因为服务器认人的依据就是 chaddr 里的 MAC。所以绑定动作在配置界面上通常长这样:
名称: 客厅打印机 MAC: AA-BB-CC-DD-EE-FF → IP: 192.168.1.50
这和 3.16 讲的"把网关的 IP-MAC 静态绑定"是同一个思路:MAC 是设备的身份证,IP 是它的门牌——想让门牌固定,就把身份证和门牌锁在一起。
有些人的习惯是:在路由器上把某台设备的 IP "固定"下来,同时又在设备上手工填了静态 IP。两边都设,反而容易冲突(设备自己不去领号,路由器的保留项就永远空着,池子里还少了一个号)。
挑一条路走:要么服自己配保留地址(推荐,一处集中管理),要么在设备上写静态(同时要在路由器的池子里把这个号排除掉)。
八、DHCP 的软肋:它没有身份验证
和 3.16 的 ARP 一个毛病——谁说话都信:
| 攻击 | 手法 | 后果 |
|---|---|---|
| 假发号员(rogue DHCP) | 自己架一台 DHCP,答得比真服务器快 | 你拿到它给的网关和 DNS → 所有流量从它手里过(中间人 + 收 3.14 的 NAT 能力) |
| DHCP 饿死攻击 | 伪造大量 MAC 反复领号 | 池子被占满 → 真设备领不到,掉进 169.254(收 3.12)→ "网络明明没坏却连不上" |
防御手段:
- DHCP Snooping(交换机功能):只允许可信端口转发服务器的应答,把客户端口来的 DHCP 应答直接丢掉——这是企业网的标准做法
- 端口安全:限制一个交换机端口允许出现的 MAC 数量(治饿死攻击)
- 对家用网络说句公道话:这两条攻击都需要接进你的二层网络。在家里、在打开"AP 隔离"的公共 Wi-Fi 上,攻击面比想象中小得多——但公共 Wi-Fi 别乱连这条告诫,技术底细就在这。
九、IPv6 里,"自动设置"分了两条路
到了 IPv6,"自动获取地址"不再只有 DHCP 一条路:
| 方式 | 谁干活 | 特点 |
|---|---|---|
| SLAAC(无状态地址自动配置) | 设备自己算 | 路由器通过 RA(路由器通告) 广播出网络前缀,设备把前缀 + 自己生成的接口标识拼成一个地址——压根不需要服务器发号 |
| DHCPv6 · 有状态 | 服务器 | 发完整地址 + 全套设置(最接近 IPv4 的 DHCP) |
| DHCPv6 · 无状态 | 服务器 | 只发 DNS 之类的设置,地址还是自己算(SLAAC 负责地址) |
这是与 IPv4 思维最大的不同:IPv4 的地址池是"稀缺资源"、必须集中管理,所以非有 DHCP 不可;IPv6 地址多得不用数,让设备自己生成反而更简单——于是"无状态"成了主流选择。
承载 RA(路由器通告)的正是 ICMPv6。所以 3.15 那句"IPv6 下不能一刀切禁 ICMP",现在的理由更足了:
禁掉 ICMPv6 → 收不到 RA → SLAAC 拿不到网络前缀 → 地址都配不出来。
而 3.16 讲的"ARP 在 IPv6 里被邻居发现 NDP 取代",NDP 也是 ICMPv6 的一部分。ICMPv6 在 IPv6 时代是干实事的,不是可选项。
十、动手 Demo37:把"自动设置"看全
-
逐行读自己的配置(对照图一的清单)
ipconfig /all这次换个读法——按选项目录去读:IPv4 地址(固定字段 yiaddr)→ 子网掩码(option 1)→ 默认网关(option 3)→ DNS 服务器(option 6)→ 再往下找 DHCP 服务器、获得租约的时间 / 租约过期的时间(option 51 的落地)。能找到"租约过期的时间",就说明你看懂租期了。 -
亲眼看 DORA 走一遍(会断网几秒,正常)
ipconfig /release ipconfig /renew release发出的是 DHCPRELEASE("号还你")renew则从 DISCOVER 重新开始(不是直接要号)-
观察
renew前后的租约过期时间:它会往后推。这就是续租成功的痕迹。 -
验证"续租 = 重置时钟"(本节最直接的一步)
ipconfig /all ← 记下"租约过期的时间" (等一两分钟) ipconfig /renew ipconfig /all ← 再看那一行时间往后挪了——因为每次续租成功,租期都从头算。所以一台常年开机的设备,租约时间永远不会到期。 -
看一眼报文类型(可选,装了 Wireshark 的话) 抓包过滤
bootp,能看到一串请求/应答,展开 option 53 那一行——它的值就是 1/2/3/5 这些类型号。八种报文一次看齐。 -
30 秒实验:给自家发号员做三项检查 打开路由器管理页(一般
192.168.1.1),找 DHCP 服务器那一栏,看三样: - 地址池范围(对照 2.5 那张 IP 规划表:池子有没有和静态区分开)
- 租期设置(家用常见 24 小时 / 2 小时;租期短了续租频繁,长了号回收慢)
-
静态分配 / 保留地址列表 → 把家里那台打印机或 NAS 绑上(本节的第七节从纸面落到操作)
-
一条顺手的观察(收 3.16)
arp -a全程盯着里面那条网关记录——它从头到尾没变过。因为续租全程是单播到网关,不需要再广播问 MAC。"DHCP 广播找人"和"ARP 广播问门牌"是两件事,别混。
release 之后你会短暂失去地址(ipconfig 会显示空白或 169.254)。如果正在下载东西、开会、上课,挑个空的时候做。
十一、常见误区
- ❌ "DHCP 只发一个 IP 地址" → 它是一套下发的配置框架:IP 在固定字段
yiaddr,其余设置装在 options 里,能发多少项取决于服务器配了什么 - ❌ "租期一到就换号" → 到期前有两道闹钟(T1 50% / T2 87.5%)自动续租;一直续得上,号就一直不变
- ❌ "服务器会主动来通知续租" → 续租永远是客户端发起的(闹钟装在客户端);服务器只做应答
- ❌ "续租还是广播找人" → T1 阶段是单播(它记得服务器是谁);只有 T2 阶段才广播找别人
- ❌ "服务器记的是上次给过哪台设备哪个号" → 记的是 MAC 与号的对应关系(chaddr 字段,收 3.16)
- ❌ "每个网段都得配一台 DHCP 服务器" → 中继代理能让一台服务器管多个网段,靠 giaddr 判断该用哪个池
- ❌ "自动获取就没法固定" → 保留地址按 MAC 绑定,设备侧仍是"自动",拿到的却是固定号
- ❌ "
169.254.x.x说明网络坏了" → 是没领到号(收 3.12):查路由器、查 DHCP 池是否发完(也可能是被饿死攻击占了池子) - ❌ "DHCP 是可信的" → 没有身份验证,假发号员(rogue DHCP)能抢答,给你一个假网关;企业用 DHCP Snooping 防
- ❌ "IPv6 也全靠 DHCP 发地址" → SLAAC 才是 IPv6 的主流自动配置:设备靠路由器的 RA 拿到前缀,自己拼出地址,不需要发号员
十二、动手自测
- DHCP 报文里,"这次分给你的 IP 地址"放在哪个字段?其余设置放在哪?
- 除了四件套,DHCP 还能自动下发哪些设置?举四个以上。
- DORA 之外的四种报文分别是什么?各出现在什么场合?
xid事务号和chaddr各自解决什么问题?- T1 和 T2 分别是租期的百分之多少?两次续租的通信方式有何不同?
- 为什么租期的"闹钟"装在客户端,而不是由服务器来催?
- 一台 DHCP 服务器怎么给另一个网段的设备发号?
giaddr起什么作用? - 想让一台打印机永远拿到同一个号,又不想在设备上手工敲,怎么做?
rogue DHCP(假发号员)怎么得手的?后果是什么?- IPv6 里为什么可以"不用 DHCP 也能拿到地址"?
答案:
① IP 地址在固定字段 yiaddr;掩码、网关、DNS 等其余设置在 options(选项) 里。分开的原因:IP 是每次问答的"结果",其余是"附加信息"。
② option 1 子网掩码、3 默认网关、6 DNS 服务器、15 域名、51 租期、58/59 T1·T2、42 NTP 服务器、121 无类静态路由、54 服务器标识……选项是开放的,这也是 DHCP 能一直扩展的原因。
③ NAK(服务器说"这号不能用了",客户端立刻重来)、DECLINE(客户端说"这号被别人占了")、RELEASE(客户端说"我走了",即 release)、INFORM(客户端已有地址,只想拿别的设置)。
④ xid 让客户端认出"这些应答是回复我这一次请求的"(可能同时收到多台服务器的报价);chaddr(MAC)是服务器认人的依据——服务器记的是"哪个 MAC 用过哪个号"。
⑤ T1 = 50%、T2 = 87.5%。T1 用单播(记得原服务器是谁),T2 用广播(原服务器可能已经没了,找任何一台)。
⑥ 因为服务器可能服务几千台设备,挨个记住到期时间并主动通知成本太高。让每台客户端自己记闹钟、服务器只做"应答"这件轻活,整套系统的负担就分散了。
⑦ 用中继代理(relay agent):本网段的路由器把广播转成单播发给远处的服务器,并在 giaddr 里填上"我这边的网段地址"。服务器靠它判断该从哪个地址池发号。
⑧ 用保留地址(DHCP Reservation):在 DHCP 服务器上把该设备的 MAC 与一个固定号绑定。设备侧仍然是"自动获取",不用手工敲,却每次拿到同一个号。
⑨ 攻击者架一台假 DHCP 服务器,答得比真服务器快,你于是拿到它下发的网关与 DNS——所有流量都从它手里过(中间人)。防御:交换机开 DHCP Snooping,只允许可信端口转发服务器应答。
⑩ 因为 IPv6 地址极其充裕,不需要集中管理:SLAAC 让设备靠路由器 RA 里的网络前缀 + 自己生成的接口标识拼出地址,不需要任何服务器发号;DHCPv6 则退化成"只补发 DNS 等设置"的无状态模式。
十三、下一步学什么
- ☑ 第三章完结 → 进入第四章 —— 下一节:Web网站是如何构建的(Web网站)。第三章从"通用语言"一路讲到 DHCP 收尾(3.1~3.23 全部完成 🎉),第四章换个角度看同一张网络:Web 网站的运行原理——先讲网站由哪四件构成、怎么搭起来。
本节原来猜"第三章剩下的部分大概率是 HTTP 与网页浏览"——教材确实在 DHCP 收尾,HTTP 归到第四章去讲了。所以第三章到这里结束,下面从 4.1 接着走。
相关笔记
- 使用DNS自动获取IP地址(资源记录、DNS解析模块、递归查询) —— 上一节:那张"DHCP 管我是谁、DNS 管别人在哪"的分岔表,本节把 DHCP 这一半讲全
- 连接网络的过程(IP地址的设置) —— DORA 四步与四件套的原始出处;本节补上报文字段、八种报文、两道闹钟与中继代理
- 如何构建网络(网络的设计) —— IP 规划表里"谁静态、谁进池子";本节给出第三条路(保留地址)与池子的体检方法
- 组成网络(局域网的构建) —— 组网第 3 步"发门牌";本节讲这块门牌上除了号还印了哪些字
- 接收方是1个还是多个(单播、广播、组播) —— DHCP 第 1·3 步与 T2 用广播、T1 用单播的依据;本节是中继代理存在的原因
- 根据端口号分配数据到应用程序(端口号、已知端口号) —— 67 / 68 这对端口的出处;本节解释了客户端为什么不得不借一个"固定号"
- 将IP地址与MAC地址对应(ARP) —— 服务器认人靠 MAC(chaddr)、DECLINE 靠免费 ARP 探测冲突、保留地址就是"MAC 锁门牌"
- 从私有网络到互联网间的通信(NAT) —— 表项老化与租约续期是同一种"状态有寿命"的哲学
- 数据是否成功传输给接收方(ICMP) —— ICMPv6 承载 RA;本节解释了"IPv6 禁 ICMP 会瘫痪"的深层理由
- 负责传输数据的网络分层(网络接口层与网际层) —— 双层门牌:DHCP 认人靠 MAC、认路靠 IP
- 网络为谁而生的(私有网络与互联网) —— DHCP 发的号全是私有地址,出墙还得靠 NAT(收 3.13)