Appearance
地址怎么拿到、怎么被改写:发一个分组前要凑齐四样东西(专题总纲)
Intro
DHCP、DNS、ARP、NAT,翻书时分别在应用层、网络层、数据链路层三章里,中间隔着几十页。但真题很少单独考它们——它们往往一起出现在同一道题里,因为它们本来就是同一件事的四个片段。
那件事是:一台刚开机、什么都不知道的主机,要把一个分组发出去,它得先补齐哪些信息。
每个报文都在消解一个不确定性
发一个 IP 分组之前,必须凑齐四样东西。缺哪一样,就有一个协议专门去补哪一样:
| 缺什么 | 谁来补 | 这个报文长什么样 |
|---|---|---|
| ① 我自己的 IP | DHCP | 源 IP = 0.0.0.0(我还没有地址)、目的 IP = 255.255.255.255(受限广播,我还不知道该问谁) |
| ② 对方的 IP(只知道名字) | DNS | 应用层报文,装进 UDP、端口 53 |
| ③ 下一跳是谁 | 自己算:拿目的 IP 和自己的子网掩码比 | 同子网 → 下一跳就是对方本人;不同子网 → 下一跳是默认网关 |
| ④ 下一跳的 MAC | ARP | 以太网帧目的 MAC = FF-FF-FF-FF-FF-FF(广播,我还不知道该问谁) |
⚠️ 这四步不是排成一条直线依次走完的。 ①② 是「触发」,一次场景里各发生一次;而 ③④ 是内循环——每要发出一个 IP 分组,就得先跑一遍。
后果很直接:第 ② 步的 DNS 查询本身就是一个 IP 分组,所以它发出去之前得先跑完 ③④。 2021 年那道题的时间线因此是:
① ARP ——问本地域名服务器的 MAC(广播) ← 为了发 DNS 查询
② DNS 查询 / DNS 应答
③ ARP ——问默认网关的 MAC(广播) ← 为了发 HTTP 请求
④ HTTP 请求ARP 出现了两次,而且都在 DNS 前后而不是最后。 那道题第 (2)(3) 问——交换机的自学习表有几条、旁观主机收到几个帧——全部建立在「两次 ARP、两次都是广播」上。照着「先 DNS 再 ARP」列时间线,两问都会答少。
第 ① 和第 ④ 步的报文都是广播,道理一样:连"该问谁"都不知道的时候只能吼一嗓子。所以问「某台旁观主机收到了几个帧」时,数的就是这些广播——2021 年那道题的答案是「至少 2 个,都是封装 ARP 请求的广播帧」。
第 ③ 步是整条链的枢纽,也是最容易错的地方
帧的目的 MAC 填的是「下一跳」的 MAC,不是最终目的主机的 MAC。
- 目的和我在同一子网 → 下一跳就是它本人,ARP 问的是它的 MAC,根本不经过网关。
- 目的在别的子网 → 下一跳是默认网关,ARP 问的是网关的 MAC,帧里填网关的 MAC,而 IP 头里的目的 IP 仍然是最终目的。
IP 地址端到端不变,MAC 地址逐跳改写——这一句是这个专题的骨。
由此可以直接推出一个真题考过的结论:默认网关配错了,同子网内的通信照样正常,只有出子网才断。 因为同子网压根不走第 ③ 步的"网关"分支。碰到"某主机能上内网不能上外网"的题,先查网关。
第五样:私网地址出不去,要在网关上被改写
前四样凑齐,分组能在本子网内走。但如果源地址是私有地址(192.168.x.x、10.x.x.x),它在公网上不合法,出去就被丢。所以还需要 NAT。
经过 NAT 那一跳,分组头上会有三处变化。题面问「这一跳修改了哪些字段」时三件要写全(2011 年那道题就是三件齐了才满分);题面只问「源/目的 IP 各是什么」时就只答地址:
- 改地址:出网关改源 IP(SNAT);从公网回来、或者外网主动访问内网服务器时改目的 IP(DNAT,也就是端口转发)。
- TTL 减 1——严格说这是经过任何路由器都会发生的,不是 NAT 特有;只是 NAT 那一跳恰好也是路由器。
- IP 头部校验和重算——这一条才是「头部字段被改了」的直接后果。
真题考过一种狠的:两个不同的内网用同一个私网网段,两边都有 192.168.1.2。这时就要逐跳把源、目的两个地址的变化写出来——一跳一行,写清这一跳之后源 IP 是什么、目的 IP 是什么。 这是这一组最容易写乱的一问,老老实实列表格。
怎么列这条报文序列
- 先判这台主机现在缺哪一样。 刚开机 → 缺自己的 IP;用域名 → 缺对方 IP;ARP 表空 → 缺 MAC;私网出公网 → 缺合法源地址。
- 列报文序列:先把 ①② 这两次触发排上,再在每一个要发出去的 IP 分组前面插进 ③④。每一行写清:这一步之前还缺什么信息、报文的源/目的 IP、封装的帧目的 MAC。
- 凡是"我还不知道该问谁"的那一步,地址就是广播地址。
一道题的答卷长什么样
取 2021 年那道题:局域网内 H1(192.168.1.2/25)在浏览器里访问 www.abc.com, 同网段还有本地域名服务器(.126)、网关 R(.1)和旁观的 H2(.3),都挂在交换机 S 上。
先判子网:/25 → 网络号 192.168.1.0,地址范围 .0 ~ .127。所以 DNS 服务器和网关都在同一子网内。
然后一行一步把报文序列写出来:
每个 ARP 请求都有一个应答,两行都要写(下面第 2、6 行)——漏了它们,后面的交换表就数不对:
| # | 这一步之前还缺什么 | 发的是什么 | 帧的源 → 目的 MAC |
|---|---|---|---|
| 1 | 不知道 DNS 服务器的 MAC | ARP 请求 | H1 → FF-FF-FF-FF-FF-FF(广播) |
| 2 | — | ARP 应答 | DNS → H1(单播) |
| 3 | 不知道域名对应的 IP | DNS 查询(UDP 53,IP 目的 192.168.1.126) | H1 → DNS |
| 4 | — | DNS 应答 | DNS → H1 |
| 5 | 不知道网关的 MAC | ARP 请求 | H1 → FF-FF-FF-FF-FF-FF(广播) |
| 6 | — | ARP 应答 | R → H1(单播) |
| 7 | — | HTTP 请求(IP 目的是公网 Web 服务器) | H1 → R(网关的 MAC) |
这张表把后面几问全带出来了:
- 问「旁观的 H2 收到几个帧」→ 数广播行:第 1、5 两行,都是 ARP 请求。应答是单播,H2 收不到。
- 问「交换机 S 的转发表有几条」→ 数当过源 MAC 的:H1(第 1 行)、DNS(第 2 行)、R(第 6 行),三条。 R 是靠它回的那个 ARP 应答被学到的,不是靠第 7 行——第 7 行里 R 只是目的地址,交换机不从目的学。 H2 全程一帧未发,所以学不到它。
- 问「第 7 步的帧目的 MAC 是谁」→ Web 服务器在公网、跨子网,填网关的 MAC。
⚠️ 两个最容易漏的地方:ARP 出现了两次、而且分列在 DNS 前后(按「先 DNS 再 ARP」的直觉列会漏掉第 1 行); 以及只写请求不写应答——交换机学 MAC 靠的是「谁发过帧」,而 DNS 和 R 恰恰只在应答里当过发送方。
真题的两种形态
5 道真题,分成两组。
第一组 · 把报文序列列出来
题面给一张拓扑和一台主机的动作(开机、访问某个域名、ping 某台机器),问你:这中间用到了哪些协议、某个报文的源/目的地址是什么、某台旁观主机收到了几个帧。
固定动作:按上面那张四步表列时间线。 每一行三个字段——协议、IP 层的源和目的、链路层的目的 MAC。
这一组还常常捎带两个链路层的点:交换机的自学习表(靠"进来的帧的源 MAC + 从哪个端口进来"填表,所以问 t 时刻表里有几条,就是数在这之前有几个不同的源 MAC 进过交换机),以及广播帧会被交换机泛洪、但会被路由器拦住——定向广播不跨子网。
第二组 · 链跑通之后:地址被改写
这一组和上面那条链关系不大——地址都已经有了,问的是它在路上怎么被改。
题面给一个私网访问公网、或公网访问内网服务器的场景,让你写清每一跳之后地址变成了什么,或者判断某台设备该配什么、该提供什么服务。
固定动作:画路径,一跳一行,每行写源 IP 和目的 IP 两列。 遇到 NAT 那一跳就改对应的一列,同时记得 TTL 和校验和。
这一组还有一类问法是判断设备类型和接口配置:哪台是路由器、哪台是交换机、哪些接口要配 IP。规则很固定——跨子网的地方必须是路由器,交换机不隔广播域也不需要配 IP;路由器每个接口都要有本子网内的一个地址。
交卷前扫一眼
先问缺哪一样 · 每发一个包都要重新「算下一跳 + ARP」 · 帧目的 MAC 是下一跳的 · 不知道问谁就广播 · ARP 请求要配一条应答
配套内容
逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题。
基础没打牢的,先回这几篇:
同一条数据路径上的另一段:下一跳到底该是谁、路由表怎么填出来——那是地址与转发那个专题的事。这两篇建议连着看,它们本来就是一条路径切成的两段。
考纲要求、但这一组真题没有正面考过的:
⚠️ HTTP 不在此列:报文格式确实没考过,但「持久非流水线连接取 N 个对象要几个 RTT」考过(2011 年那道题里占 2 分,答 12 或 1 都是典型错答)。别因为它是应用层就跳过。