Skip to content

地址怎么拿到、怎么被改写:发一个分组前要凑齐四样东西(专题总纲)

Intro

DHCP、DNS、ARP、NAT,翻书时分别在应用层、网络层、数据链路层三章里,中间隔着几十页。但真题很少单独考它们——它们往往一起出现在同一道题里,因为它们本来就是同一件事的四个片段。

那件事是:一台刚开机、什么都不知道的主机,要把一个分组发出去,它得先补齐哪些信息。

每个报文都在消解一个不确定性

发一个 IP 分组之前,必须凑齐四样东西。缺哪一样,就有一个协议专门去补哪一样:

缺什么谁来补这个报文长什么样
① 我自己的 IPDHCP源 IP = 0.0.0.0(我还没有地址)、目的 IP = 255.255.255.255(受限广播,我还不知道该问谁)
② 对方的 IP(只知道名字)DNS应用层报文,装进 UDP、端口 53
③ 下一跳是谁自己算:拿目的 IP 和自己的子网掩码比同子网 → 下一跳就是对方本人;不同子网 → 下一跳是默认网关
④ 下一跳的 MACARP以太网帧目的 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.x10.x.x.x),它在公网上不合法,出去就被丢。所以还需要 NAT

经过 NAT 那一跳,分组头上会有三处变化。题面问「这一跳修改了哪些字段」时三件要写全(2011 年那道题就是三件齐了才满分);题面只问「源/目的 IP 各是什么」时就只答地址:

  1. 改地址:出网关改源 IP(SNAT);从公网回来、或者外网主动访问内网服务器时改目的 IP(DNAT,也就是端口转发)。
  2. TTL 减 1——严格说这是经过任何路由器都会发生的,不是 NAT 特有;只是 NAT 那一跳恰好也是路由器。
  3. IP 头部校验和重算——这一条才是「头部字段被改了」的直接后果。

真题考过一种狠的:两个不同的内网用同一个私网网段,两边都有 192.168.1.2。这时就要逐跳把源、目的两个地址的变化写出来——一跳一行,写清这一跳之后源 IP 是什么、目的 IP 是什么。 这是这一组最容易写乱的一问,老老实实列表格。

怎么列这条报文序列

  1. 先判这台主机现在缺哪一样。 刚开机 → 缺自己的 IP;用域名 → 缺对方 IP;ARP 表空 → 缺 MAC;私网出公网 → 缺合法源地址。
  2. 列报文序列:先把 ①② 这两次触发排上,再在每一个要发出去的 IP 分组前面插进 ③④。每一行写清:这一步之前还缺什么信息、报文的源/目的 IP、封装的帧目的 MAC。
  3. 凡是"我还不知道该问谁"的那一步,地址就是广播地址。

一道题的答卷长什么样

取 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 服务器的 MACARP 请求H1 → FF-FF-FF-FF-FF-FF(广播)
2ARP 应答DNS → H1(单播)
3不知道域名对应的 IPDNS 查询(UDP 53,IP 目的 192.168.1.126)H1 → DNS
4DNS 应答DNS → H1
5不知道网关的 MACARP 请求H1 → FF-FF-FF-FF-FF-FF(广播)
6ARP 应答R → H1(单播)
7HTTP 请求(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 判分入口见站内大题专题

基础没打牢的,先回这几篇:

同一条数据路径上的另一段:下一跳到底该是谁、路由表怎么填出来——那是地址与转发那个专题的事。这两篇建议连着看,它们本来就是一条路径切成的两段。

考纲要求、但这一组真题没有正面考过的:

  • 电子邮件——SMTP / POP3 / IMAP 从没进过大题
  • VLAN——另一种隔广播域的手段,18 年里只作为「这台交换机没有 VLAN 功能」的条件出现过

⚠️ HTTP 不在此列:报文格式确实没考过,但「持久非流水线连接取 N 个对象要几个 RTT」考过(2011 年那道题里占 2 分,答 12 或 1 都是典型错答)。别因为它是应用层就跳过。

真题练习