🌐 第三章 网络间的通用语言TCP/IP
📄 一句话概括

设备一接入网络,一整套设置就自己到位了——不只是 IP 地址,还有掩码、网关、DNS、域名、时间去哪对表……这些"必要的设置"全装在 DHCP 报文的一个开放清单(options 字段)里,由发号员一次性发下来;而这份配置不是一次性的,它带着租期,客户端身上装着 T1、T2 两道闹钟,到期前自己会去续租——所以整套自动配置几乎不需要人管。

📝 本节和 3.12 的分工(别混)

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 选项(可长可短) 一长串"设置项",想发多少发多少

这里有一处最容易想错的地方,我单独拎出来:

❗ IP 地址不在"选项"里

大家习惯说"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 的协议"

更准确的说法是:DHCP 是一套"下发配置"的框架,IP 地址只是它最显眼的一件货。

这也是它为什么能活到今天:选项是开放的——哪天需要下发一种新的设置(新的时间源、新的代理地址),只要分配一个 option 号就行,协议本身一个字都不用改。

3.12 说的"四件套"(IP/掩码/网关/DNS),对应的就是 yiaddr + option 1 + option 3 + option 6。

💡 顺手收 3.22 的账

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 是这四个里面最重要的一个——它把"自动"变成了"可撤销":

📝 为什么必须有 NAK

想象你带着笔记本从家(192.168.1.x)到公司(10.0.0.x),开机后它习惯性地拿老号去续租。如果服务器只会说"不行"却不明确拒绝,客户端会一直等。

NAK 就是那句干脆的"不行":地址不对、或者这个号已经分配给别人了。客户端收到它,立刻丢掉旧配置、从 DISCOVER 重新开始。

顺带说明:一台设备换到新网络后 IP 会变(收 3.8 那句"IP 跟位置走不跟机器走"),根子就在这个机制上。

💡 收 3.17 的账(67 / 68 终于有了落点)

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 —

几个值得记的点:

❗ 本节最值得琢磨的一句:闹钟装在客户端身上

租期是服务器定的,但服务器从不主动来催你——它只在你问的时候回答。

续租的发起方永远是客户端。

为什么这么设计?因为一台服务器可能要服务几千台设备。如果它得记住每台的到期时间、再挨个去通知,成本极高;反过来,让每台客户端自己记自己的闹钟,服务器只做"应答"这一件轻活,整套系统的负担就散开了。

这就是 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

giaddr = "这个请求是从哪个网段转发来的"。 它是 DHCP 能在企业网里"一对多"的全部前提。

家用网络里用不到它,所以普通用户从来看不见这个字段;但只要你在公司网络里见过"DHCP 服务器不在本网段、却能给你发号",背后就是它在工作。

七、自动不等于随便:第三条路

2.5 和 3.12 说过两种配置方式(手工静态 / DHCP 自动)。现实中最常见的其实是第三种:

方式 号怎么定 在哪配 适合谁
手工静态 设备上写死 设备上敲 极少改动的核心设备
纯动态 从池子里随机给 服务器(不用管) 手机、笔记本、访客
保留地址(Reservation) 按 MAC 绑定一个固定号 服务器上绑 打印机、NAS、摄像头、监控主机

保留地址的好处是鱼与熊掌兼得:设备那一边看起来还在"自动获取"(不用手工敲、不会写错),但每次拿到的都是同一个号——它就能被稳定地访问到。

💡 为什么靠 MAC 绑定(收 3.16)

因为服务器认人的依据就是 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)→ "网络明明没坏却连不上"

防御手段:

九、IPv6 里,"自动设置"分了两条路

到了 IPv6,"自动获取地址"不再只有 DHCP 一条路:

方式 谁干活 特点
SLAAC(无状态地址自动配置) 设备自己算 路由器通过 RA(路由器通告) 广播出网络前缀,设备把前缀 + 自己生成的接口标识拼成一个地址——压根不需要服务器发号
DHCPv6 · 有状态 服务器 发完整地址 + 全套设置(最接近 IPv4 的 DHCP)
DHCPv6 · 无状态 服务器 只发 DNS 之类的设置,地址还是自己算(SLAAC 负责地址)

这是与 IPv4 思维最大的不同:IPv4 的地址池是"稀缺资源"、必须集中管理,所以非有 DHCP 不可;IPv6 地址多得不用数,让设备自己生成反而更简单——于是"无状态"成了主流选择。

💡 收 3.15 / 3.16 的账(又多一层理由)

承载 RA(路由器通告)的正是 ICMPv6。所以 3.15 那句"IPv6 下不能一刀切禁 ICMP",现在的理由更足了:

禁掉 ICMPv6 → 收不到 RA → SLAAC 拿不到网络前缀 → 地址都配不出来。

而 3.16 讲的"ARP 在 IPv6 里被邻居发现 NDP 取代",NDP 也是 ICMPv6 的一部分。ICMPv6 在 IPv6 时代是干实事的,不是可选项。

十、动手 Demo37:把"自动设置"看全

  1. 逐行读自己的配置(对照图一的清单) ipconfig /all 这次换个读法——按选项目录去读:IPv4 地址(固定字段 yiaddr)→ 子网掩码(option 1)→ 默认网关(option 3)→ DNS 服务器(option 6)→ 再往下找 DHCP 服务器、获得租约的时间 / 租约过期的时间(option 51 的落地)。能找到"租约过期的时间",就说明你看懂租期了。

  2. 亲眼看 DORA 走一遍(会断网几秒,正常) ipconfig /release ipconfig /renew

  3. release 发出的是 DHCPRELEASE("号还你")
  4. renew 则从 DISCOVER 重新开始(不是直接要号)
  5. 观察 renew 前后的租约过期时间:它会往后推。这就是续租成功的痕迹。

  6. 验证"续租 = 重置时钟"(本节最直接的一步) ipconfig /all ← 记下"租约过期的时间" (等一两分钟) ipconfig /renew ipconfig /all ← 再看那一行 时间往后挪了——因为每次续租成功,租期都从头算。所以一台常年开机的设备,租约时间永远不会到期。

  7. 看一眼报文类型(可选,装了 Wireshark 的话) 抓包过滤 bootp,能看到一串请求/应答,展开 option 53 那一行——它的值就是 1/2/3/5 这些类型号。八种报文一次看齐。

  8. 30 秒实验:给自家发号员做三项检查 打开路由器管理页(一般 192.168.1.1),找 DHCP 服务器那一栏,看三样:

  9. 地址池范围(对照 2.5 那张 IP 规划表:池子有没有和静态区分开)
  10. 租期设置(家用常见 24 小时 / 2 小时;租期短了续租频繁,长了号回收慢)
  11. 静态分配 / 保留地址列表 → 把家里那台打印机或 NAS 绑上(本节的第七节从纸面落到操作)

  12. 一条顺手的观察(收 3.16) arp -a 全程盯着里面那条网关记录——它从头到尾没变过。因为续租全程是单播到网关,不需要再广播问 MAC。"DHCP 广播找人"和"ARP 广播问门牌"是两件事,别混。

⚠️ 第 2 步会真的断网

release 之后你会短暂失去地址(ipconfig 会显示空白或 169.254)。如果正在下载东西、开会、上课,挑个空的时候做。

十一、常见误区

  1. ❌ "DHCP 只发一个 IP 地址" → 它是一套下发的配置框架:IP 在固定字段 yiaddr,其余设置装在 options 里,能发多少项取决于服务器配了什么
  2. ❌ "租期一到就换号" → 到期前有两道闹钟(T1 50% / T2 87.5%)自动续租;一直续得上,号就一直不变
  3. ❌ "服务器会主动来通知续租" → 续租永远是客户端发起的(闹钟装在客户端);服务器只做应答
  4. ❌ "续租还是广播找人" → T1 阶段是单播(它记得服务器是谁);只有 T2 阶段才广播找别人
  5. ❌ "服务器记的是上次给过哪台设备哪个号" → 记的是 MAC 与号的对应关系(chaddr 字段,收 3.16)
  6. ❌ "每个网段都得配一台 DHCP 服务器" → 中继代理能让一台服务器管多个网段,靠 giaddr 判断该用哪个池
  7. ❌ "自动获取就没法固定" → 保留地址按 MAC 绑定,设备侧仍是"自动",拿到的却是固定号
  8. ❌ "169.254.x.x 说明网络坏了" → 是没领到号(收 3.12):查路由器、查 DHCP 池是否发完(也可能是被饿死攻击占了池子)
  9. ❌ "DHCP 是可信的" → 没有身份验证,假发号员(rogue DHCP)能抢答,给你一个假网关;企业用 DHCP Snooping 防
  10. ❌ "IPv6 也全靠 DHCP 发地址" → SLAAC 才是 IPv6 的主流自动配置:设备靠路由器的 RA 拿到前缀,自己拼出地址,不需要发号员

十二、动手自测

❓ 自测一下
  1. DHCP 报文里,"这次分给你的 IP 地址"放在哪个字段?其余设置放在哪?
  2. 除了四件套,DHCP 还能自动下发哪些设置?举四个以上。
  3. DORA 之外的四种报文分别是什么?各出现在什么场合?
  4. xid 事务号和 chaddr 各自解决什么问题?
  5. T1 和 T2 分别是租期的百分之多少?两次续租的通信方式有何不同?
  6. 为什么租期的"闹钟"装在客户端,而不是由服务器来催?
  7. 一台 DHCP 服务器怎么给另一个网段的设备发号?giaddr 起什么作用?
  8. 想让一台打印机永远拿到同一个号,又不想在设备上手工敲,怎么做?
  9. rogue DHCP(假发号员)怎么得手的?后果是什么?
  10. 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 等设置"的无状态模式。

十三、下一步学什么

💡 猜对了一半

本节原来猜"第三章剩下的部分大概率是 HTTP 与网页浏览"——教材确实在 DHCP 收尾,HTTP 归到第四章去讲了。所以第三章到这里结束,下面从 4.1 接着走。

相关笔记