
📚 本文收录于「流浪」的系列专栏
| Linux系统 | C++ |
| 数据结构与算法 | Python |
| LangChain&LangGraph | MySQL数据库 |
| Git工具 | 计算机网络 |
| LLM | 大厂面试八股 |
| 学习筑基 |
🏠 博客主页:流浪 | 📝 原创首发于 CSDN
前言: 篇22 把公网地址划分与分片组装收尾,网络层停在「报文知道往哪片网走」;可最后一跳从一台主机交到另一台主机,始终要落到一段具体链路上,本篇拆这跳的以太网帧格式、MAC 地址、MTU 对 UDP 与 TCP 的牵制,以及 ARP 怎么拿 IP 换出 MAC。
一、数据链路层的定位
1.1 网络转发,本质是网和子网之间的转发
1. 路由器把报文从一片网搬到另一片网

- 学完 IP 之后有一个问题一直没回答干净:报文从主机 B 要去主机 C,为什么不能直接走,而非得先交给路由器 F?
- 答案藏在「网络」这个词的层级里:日常说的网络其实是一层套一层的,公网是最大的那张网,公网里又切出一段一段的子网,子网里才直接挂主机。
- 路由器干的事,就是把报文从一片子网搬到另一片子网,它从来不负责「子网内部那一台到另一台」怎么送,那是另一层的事。
网络层解决的是「为什么走这条、跨了几片网」,不解决「一片网里两台主机怎么当面交付」。
2. IP 留的同子网问题,由数据链路层接手
- IP 协议把报文送到了正确的子网,可报文到了子网里,还要从网卡出去、走过网线、进到对面主机的网卡,这一段「最后一跳」IP 不管。
- 同一个子网里,一台主机怎么把数据交给另一台主机 ,这就是数据链路层要解决的问题,俗称局域网通信。
- 所以两层各管一摊:网络层管长距离、跨子网的路径选择,数据链路层管一段链路上两台节点之间怎么把帧送过去。
数据链路层解决子网通信问题,补上 IP 留下的「同子网内怎么交付」这一截。
1.2 五层宏观认识:每层回答的问题不一样
1. 怎么办、为什么、保可靠,三层各扛一个问题

- 把视角拉到五层模型上看,每一层其实都在回答一个不同的问题:数据链路层回答「怎么办」,也就是这一跳具体怎么把帧送过去;网络层回答「为什么走这条」,也就是长距离传输和路径选择;传输层回答「怎么保可靠」,也就是传输过程中的可靠性问题。
- 这三层串起来才是一条完整的发送链路:网络层定路径、数据链路层走每一跳、传输层在上面盯着有没有出错要不要重传。
- 传输数据本身不是目的,只是手段,真正完成应用、交换应用层报文才是目的,这一层归应用层管,它决定传什么、传给谁。
五层不是五个孤立的工序,而是「定路径---走每一跳---保可靠---定内容」一条链,数据链路层是这条链上落地的那一跳。
二、以太网与 MAC 帧
2.1 以太网:一种技术标准,不是一种具体的网络
1. 以太网规定了链路层和物理层的一整套规矩
- 「以太网」这三个字容易让人以为是一种具体的网络,其实它是一种技术标准,既包含数据链路层的内容,也包含一部分物理层的内容。
- 它规定了网络拓扑结构、访问控制方式、传输速率这些事,比如以太网的网线必须用双绞线,速率有 10M、100M、1000M 等几档。
- 以太网是当前应用最广泛的局域网技术,和它并列的还有令牌环网、无线 LAN 等,只是大家平时接触到的局域网几乎都是以太网,所以这两个词经常被混着用。
以太网是一套标准而非一张具体的网,它把一段链路上「线怎么连、帧怎么发、多快」一次性定死。
2.2 以太网帧格式:五个定长字段撑起封装与分离

1. 五个字段各司其职,定长让分离不靠猜
- 以太网的帧格式一共五个字段:目的地址 6 字节、源地址 6 字节、类型 2 字节、数据 46 到 1500 字节、末尾 CRC 校验 4 字节。
- 源地址和目的地址都是网卡的硬件地址,也就是 MAC 地址,长度 48 位,在网卡出厂时就固化好了;帧末尾的 CRC 是循环冗余校验码,用来让接收方核对帧在路上有没有被损坏。
- 定长字段的最大好处是分离和封装都不用猜:接收方按固定字节数切下去,目的地址、源地址、类型一字不差地取出来,数据段的边界也由类型和长度约束卡死。
固定长度是帧格式能被机器快速拆装的根基,去掉它,分离就成了盲切。
2. 数据段装的大部分是 IP 报文
- 帧的数据段装的就是上层交下来的报文,在绝大多数情况下,这个上层就是网络层,所以数据段里放的大部分是 IP 报文。
- 但数据段并不只允许装 IP,具体装什么协议,由紧跟在源地址后面的那个 2 字节类型字段说了算,这就是下一节要讲的类型字段的作用。
数据段不是只能装 IP,装什么由类型字段指认,IP 只是其中最常见的乘客。
2.3 类型字段:0800、0806、0x8035 三种值对应三种协议

1. 一个 2 字节字段定死帧里装的是什么协议
- 类型字段长 2 字节,它就干一件事:告诉接收方这个帧的数据段里装的是哪种协议的报文,好让接收方拿到数据段后知道往哪一层上交。
- 这个字段有三种常见取值:0x0800 代表载荷是 IP 协议,0x0806 代表是 ARP 协议,0x8035 代表是 RARP 协议。
- 所以同一个以太网帧,靠类型字段就能承载不同协议的报文,接收方拆完帧看一眼类型字段,就把数据段往对应的协议处理模块送,不会张冠李戴。
类型字段是帧里的「签收单」,让上层协议和链路层帧之间精确对接。
2.4 MAC 地址:48 位的网卡硬件地址

1. 出厂固化、通常全球唯一
- MAC 地址用来识别数据链路层中相连的节点,长度 48 位,也就是 6 个字节,一般用十六进制数字加冒号的形式表示,比如
08:00:27:03:fb:19。 - 它在网卡出厂时就确定了,通常不能修改,而且通常是全球唯一的;也有例外,虚拟机里的 MAC 地址不是真实网卡的 MAC,可能会冲突,有些网卡也支持用户自己配置 MAC 地址。
- 它和 IP 地址最大的不同在于:MAC 地址绑死在硬件上,跟着网卡走,而 IP 地址是配置出来的,跟着主机所在的网络走。
MAC 地址是网卡出厂自带的身份证,不随网络搬家,搬到哪里都是同一个号。
2.5 对比 MAC 地址和 IP 地址:整体起终点对每区间起终点
1. IP 描述整条路,MAC 描述每一小段
- 把一次端到端的传输看成一段旅程,IP 地址描述的是路途总体的起点和终点:源 IP 是出发点、目的 IP 是终点,这两个地址从出发到到达一个字节都不改。
- MAC 地址描述的是路途上每一个区间的起点和终点:报文每经过一跳,源 MAC 和目的 MAC 都会换成这一跳两端的硬件地址,跳一跳就换一对。
- 把两者放在一起看就清楚了:IP 决定整条路的走法,进而决定了每一段该走哪两台节点,而每一对节点的 MAC 才是这一段帧真正填进首部的东西,所以是 IP 决定了 MAC 的选择。
IP 是整条路的起终点,MAC 是每一跳的起终点,IP 定路线、MAC 填每一跳。
三、MTU:链路层的尺寸上限牵动上层
3.1 MTU 就是链路层给数据的尺寸限制
1. 1500 是以太网的上限,超了就分片
- MTU(Maximum Transmission Unit,最大传输单元)相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的,不同的链路层标准 MTU 不一样。
- 以太网规定帧的数据段最小 46 字节、最大 1500 字节,1500 就是以太网的 MTU;ARP 数据包本身不够 46 字节,要在后面补填充位凑够,这是下限在起作用。
- 一旦某个数据包从以太网被路由到一条 MTU 更小的链路,比如某种拨号链路,而这个包的长度超过了那条链路的 MTU,就要对包进行分片,这件事网络层会自动做,篇22 已经把分片和重组的完整过程拆开讲过,这里不重复。
MTU 是链路层画的一条尺寸线,上层的数据要么压在线以内,要么被网络层切开放行。
3.2 MTU 对 IP 协议的影响:超出上限就拆包打标签
1. 超过 MTU 的 IP 包由网络层自己拆成小块

-
链路层的 MTU 卡在那里,网络层就必须遵守:一个 IP 包如果比要经过的链路 MTU 大,网络层会把它拆成多个小包分别发出去,这就是分片(fragmentation);篇22 拆过完整的分片与重组过程,这里按链路层的视角把要点收一遍。
-
拆的时候不是随便切,每个小包都被打上标签,好让接收端知道它们原本是一个包:所有小包的 IP 首部里,16 位标识(id)字段填的是同一个值,接收端靠这个值把同一次分片拆出来的小包认成一家人。
-
3 位标志字段里的两位各管一件事:第 2 位置 0 表示这个包允许分片,第 3 位是结束标记,当前小包不是最后一片就置 1,是最后一片就置 0。
2. 重组在对端做,丢一片就前功尽弃
- 这些小包各自独立地在网络上走,可能走不同的路、也可能乱序到达,接收端网络层按标识字段把它们收拢,再按顺序重组拼回原来的 IP 包,交回给传输层。
- 代价在于原子性:只要这些小包里任意一片在路上丢了,接收端的重组就失败,整个 IP 包作废,前面收到的那几片也白收。
- 而 IP 层自己不负责重传,只承诺尽力而为,丢了就是丢了,要不要重传是上面传输层的事------这也正是 TCP 要想办法从源头避开分片的原因,后面讲 MSS 时会展开。
MTU 逼出来的分片是网络层的自救,代价是把一个包的成败押在每一片上,所以能不分片就不分片。
3.3 对 UDP:1472 是不触发分片的红线
1. 1500 减掉两层首部,剩下才是 UDP 的地盘
- 以太网 MTU 是 1500 字节,这 1500 里要先扣掉 IP 首部 20 字节,再扣掉 UDP 首部 8 字节,剩下 1472 字节才是 UDP 报文能放数据的最大空间,算式是 1500 − 20 − 8 = 1472。
- 一旦 UDP 携带的数据超过 1472,网络层就会把它分成多个 IP 数据报往外发,篇14拆过 UDP 那 8 字节定长报头,这里回到它和 MTU 的关系上。
- 分片的代价很直接:这多个 IP 数据报里只要有任意一个在路上丢失,接收端网络层的重组就失败,整个 UDP 数据报作废,所以 UDP 报文一旦被分片,整体丢失的概率就被放大了。
1472 不是 UDP 自己定的,是链路层 1500 扣掉 IP 与 UDP 两层首部剩下的余量。
3.4 对 TCP:MSS 是握手时双方商量出来的发送上限
1. MSS 1460 来自 1500 减两层 20
- TCP 的单个数据报也不能无限大,同样受制于 MTU,TCP 把「单个数据报能放的最大数据长度」叫 MSS(Max Segment Size)。
- 在以太网上算一笔账:1500 减 IP 首部 20、再减 TCP 首部 20,剩下 1460,所以最理想情况下 MSS 是 1460,算式是 1500 − 20 − 20 = 1460。
- MSS 不是某一方拍板定的,而是在 TCP 建立连接的过程中双方商量出来的:通信双方在发送 SYN 的时候,会在 TCP 头部的 40 字节变长选项里(kind=2)各自写入自己能支持的 MSS 值,然后各自取对方报的那个较小值作为最终使用的 MSS。篇18 讲滑动窗口和拥塞控制时拿 MSS 当过计量单位,那篇用的是它的「量」,这里补的是它的「来历」。
MSS 是双方握手时谈拢的发送上限,1460 是以太网上的理想值,实际随链路 MTU 变。
3.4 双方 MSS 为什么可能不同,以及 TCP 为什么不靠 IP 分片
1. 不同方向链路不同,MSS 就可能不同
- 通信双方的 MSS 可能不同,这件事要从单向通信的角度看:A 发给 B 走的是 A 这一端的链路,B 发给 A 走的是 B 那一端的链路,两个方向的链路 MTU 不一定相同。
- A 按自己出口链路的 MTU 算出自己能发的 MSS 写进 SYN,B 也按自己出口链路的 MTU 算出自己能发的 MSS 写进 SYN,两边链路不同,写出来的 MSS 自然就可能不同。
- 协商的规则是取较小者,最终双方都用那个更小的 MSS 发送,这样谁都不会把报文发得超过对方那条链路能收的上限。
双方 MSS 不同,根子在两个方向的出口链路 MTU 不一定相同,取小是为了不撑爆对方那条路。
2. 握手定好 MSS,TCP 才基本不靠 IP 分片
- 三次握手把 MSS 谈拢之后,TCP 发出去的报文段大小就被锁在 MSS 以内,而 MSS 又是按链路 MTU 倒推出来的,所以正常通信时报文不会超过本端链路的 MTU,也就不会在网络层触发分片。
- 这正是 TCP 和 UDP 在面对 MTU 时的本质差别:UDP 不协商、闷头发,超了就靠 IP 分片硬扛,丢一片全完;TCP 提前商量好不超线,从源头躲开分片。
- 严格说,握手谈拢的 MSS 只保证报文不超过本端出口链路的 MTU,如果中间某一段链路的 MTU 比两端都小,IP 层仍可能分片,这也是为什么真正完整的方案还要靠 path MTU discovery 去探一路上最小的那条 MTU,本篇点到为止不展开。
TCP 不分片的真正原因,是握手时就把发送上限按 MSS 锁死在了本端链路以内,把分片这件事挡在了发生之前。
四、理解局域网通信
4.1 同一局域网的主机,都能收到这一帧
1. 网卡先看目的 MAC,不是自己的就丢,上层无感
- 局域网通信有一个反直觉的事实:同一个局域网里的所有主机,其实都能收到这一帧报文,并不是只有目标那台才收得到。
- 区别在数据链路层:每台主机的网卡收到帧之后,会解析帧首部的目的 MAC 地址,发现不是自己的硬件地址,就直接把这一帧丢掉,根本不往上层送。
- 所以从上层协议的角度看,好像只有目标主机收到了报文,其实底层是大家都听见了、只是非目标主机在链路层就把帧扔了,上层感觉不到这一层筛选。
局域网里帧是「全屋广播、各自筛选」,筛选发生在网卡这一层,上层只看见落到自己头上的那一帧。
4.2 一个例子:A 发给 E,B C D 听见就扔

1. 五台主机同在一个局域网
- 假设主机 A、B、C、D、E 在同一个局域网里,A 要发一段信息给 E,它封装出的 MAC 帧首部是:源 MAC 填 MacA,目的 MAC 填 MacE,数据段装那段信息。
- 这一帧发出去之后,B、C、D 三台主机的网卡都收到了,它们各自解析帧首部的目的地址,发现是 MacE、不是自己的 MAC,于是把帧直接丢掉,不上交。
- 只有 E 的网卡解析目的地址发现是自己的 MacE,于是接收这一帧,把 MAC 首部剥掉、把数据段分离出来,再一层一层向上交付,最终交到上层协议处理。
同局域网内「发给谁」由目的 MAC 决定,非目标主机在链路层就静默丢弃,这就是上层感觉不到别人也收过帧的原因。
五、局域网内与跨局域网通信对比
5.1 局域网内发送数据由谁决定:两次按位与的结果
1. 网络地址相同就是局域网内,不同就是跨网段
- 一台主机要发数据,第一步不是封装 MAC 帧,而是先判断目标在不在自己的同一个局域网里,这个判断由两次按位与的结果决定:
- 一次是自身 IP 与自己的子网掩码按位与,得自身的网络地址;
- 一次是目标 IP 与同一个子网掩码按位与,得目标的网络地址。
- 两个网络地址相等,就说明目标和自己在同一个子网、同一段局域网里,这次发送就是局域网内的事,可以直接二层交付;两个网络地址不相等,就说明目标在另一个子网里,这次发送就是跨网段的事,得交给路由器三层转发。
- 所以严格地说,决定「这次发送走不走局域网直连」的是子网掩码的按位与结果,而一旦判定是局域网内,「具体发给谁」就由目的 MAC 地址落地;篇21 已经定死同一个网段内所有主机的掩码必须一样,正是为了让这个判断基准全网段统一。
局域网内发送由谁决定:判同网段靠两次按位与,走直连还是找网关靠结果是否相等,掩码是这条判据的公共尺子。
5.2 情况一:同网段,二层直接交付
1. ARP 找对端主机 MAC,交换机按 MAC 表转发
- 主机判定目标和自己在同一个网段后,先发起 ARP 查询,获取目标主机的 MAC 地址,因为帧首部要填的是硬件地址,光知道 IP 还发不出帧。
- 拿到目标主机 MAC 后封装 MAC 帧:源 MAC 填本机 MAC、目的 MAC 填对端主机 MAC,源 IP 和目的 IP 保持不变。
- 交换机收到这一帧后查询自己的 MAC 地址表,直接把帧转发给目标主机所接的那个端口,目标主机网卡一比对目的 MAC 是自己,就收下并上交;篇20 拆集线器和交换机分工时讲过交换机按 MAC 转发,这里就是它的用武之地。
- 全程不经过路由器,源 IP 和目的 IP 从头到尾没动过,动的只有链路层这一层。
同网段通信是二层的事:找对端 MAC、交换机转发、路由器不参与、IP 全程不动。
5.3 情况二:跨网段,交给路由器三层转发
1. ARP 找的是网关 MAC,每一跳都换 MAC

- 主机判定目标和自己不在同一个网段后,发起 ARP 查询的对象就变了:这次找的是网关,也就是路由器 LAN 口的 MAC 地址,因为帧要先送到路由器那里去。
- 拿到网关 MAC 后封装 MAC 帧:源 MAC 填本机 MAC、目的 MAC 填网关 LAN 口 MAC,源 IP 和目的 IP 保持不变,而且这两个 IP 从头到尾都不会变。
- 交换机把这一帧转发给路由器,路由器收到后解封装、取出 IP 报文,查询自己的路由表找到下一跳,再重新封装一个新的 MAC 帧:源 MAC 换成路由器出接口的 MAC、目的 MAC 换成下一跳的 MAC,继续往下一跳转发。
- 这样一跳一跳换 MAC 地往前走,直到最后一跳的目的侧路由器在目的局域网里 ARP 找到目标主机,把帧交给它;整个过程中源 IP 和目的 IP 一直没动,变的是每一跳的源 MAC 和目的 MAC。
跨网段通信是三层的事:帧交给网关、路由器逐跳换 MAC、源目 IP 全程不变、只有 MAC 每跳换。
5.4 一句话考点:IP 不变,MAC 每跳换
1. 两种情况唯一的共同点和唯一的差别
- 同网段时,目的 MAC 是对端主机 MAC,交换机转发;跨网段时,目的 MAC 是网关 MAC,交给路由器三层转发,这是两种情况在动作上的差别。
- 无论哪种情况,源 IP 和目的 IP 从头到尾都不变,只有 MAC 地址每一跳会更换,这是两种情况在不变量上的共同点。
- 这条规律正是篇2 跨层全景里封装解封装那条主线落到每一跳上的具体形态:IP 报文像一层不变的内壳,MAC 帧像一层随跳更换的外壳,一路被拆被封地传过去。
记住一句:同网段目的 MAC 是对端、跨网段目的 MAC 是网关,源目 IP 全程不变、MAC 每跳换。
六、碰撞与帧长 46~1500 的由来
6.1 以太网是一个临界资源
1. 同一时刻只能发一个帧,多发就撞
- 在同一个局域网里,如果有多台主机同时往外发 MAC 帧,这些帧的信号就会在共享的传输介质上撞到一起,互相干扰,谁也传不清楚。
- 所以同一时刻只能有一个数据帧在以太网这段介质上发送,从这个角度看,以太网就是一个临界资源,所有主机争用同一段介质。
- 这也解释了为什么前文讲局域网通信时强调「同一局域网的主机都能收到帧」:在共享介质的模型下,一帧发出去本来就是全介质可见的,只是非目标主机在链路层丢掉了。
以太网是所有主机争用的临界资源,同一时刻只允许一帧上路,这是碰撞问题的根。
6.2 帧太长和太短,都会放大碰撞概率
1. 比特流串行发送,时长就是碰撞窗口
- 以太网在介质上是以比特流串行送出的,一帧从第一个比特发出到最后一个比特发完,持续的时间和帧长成正比,帧越长,比特流持续越久。
- 帧太长的后果:一帧占用介质的时间久,其他主机在这段时间里想发的概率就大,一旦有人忍不住发了,就撞上,所以帧越长、碰撞概率越大。
- 帧太短的后果:同样一段数据要被切成更多的小帧来发,发帧的次数变多,每次发帧都是一次争用介质的机会,争用次数一多,碰撞次数自然也多,所以帧太短同样放大碰撞概率。
帧长卡在 46~1500,是在「一帧占介质太久」和「一段数据切太碎」两头之间找平衡,不是随便定的数。
6.3 经典角度:64 字节最小帧与冲突检测绑定
1. 最小帧长是按冲突检测的往返时间算出来的
- 除了「帧太短次数多」这个角度,最小帧长还有一个更经典的来历:CSMA/CD 要求发送方在还没发完一帧的时候就能检测到冲突,否则帧发完了、信号已经上路,检测到也来不及停。
- 这就要求一帧的发送时间不能短于信号在两台最远主机之间往返一趟的时间,以太网把这个往返时间对应成 512 比特时间,也就是 64 字节,所以最小帧长卡在 64 字节,正好和冲突检测的往返窗口绑定。
- 把这个角度和帧格式合起来看:数据段最小 46 字节,加上帧首部 14 字节(目的 6 加源 6 加类型 2)和 CRC 4 字节,正好凑足 64 字节,两个约束其实指向同一件事。
64 字节最小帧长不是凭空定的,是按「发完之前必须能检测到冲突」反推出来的往返时窗口。
七、ARP 地址解析协议
7.1 为什么需要 ARP:只有 IP 没有 MAC 发不出帧

1. 帧首部要的是 MAC,IP 填不进去
- 网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址;可 MAC 帧首部要填的是硬件地址,光知道 IP 填不进去。
- 数据包首先是被网卡接收到的,再交给上层协议处理,如果接收到的帧硬件地址与本机不符,网卡直接丢弃,所以收方这一侧也只认 MAC。
- 于是发送前必须先拿到目的主机的硬件地址,把 IP 地址转换成对应的 MAC 地址,这件事就是 ARP 协议存在的理由。
ARP 桥接了网络层的 IP 和数据链路层的 MAC,没有它,IP 知道往哪送却发不出帧。
7.2 目标 IP 从哪来:用户指定或内置
1. 应用层决定访问哪个 IP
- 要 ARP,得先有一个目的 IP,这个目的 IP 通常由用户决定,比如用户要访问一个确定的服务器 IP。
- 也有内置的情况,比如客户端、服务端程序里写死了要连的对端 IP,应用层启动时就把这个 IP 喂给协议栈。
- 不管哪种来源,目的 IP 都是应用层先确定的,ARP 只是拿着这个 IP 去换出 MAC,它自己不决定访问谁。
目的 IP 是应用层给定的输入,ARP 只负责把它翻译成能填进帧首部的 MAC。
7.3 ARP 简单流程:广播问、单答复

1. 出入口路由器拿目的 IP 在局域网内广播
- ARP 的简单流程是这样的:出入口路由器拿着目的 IP,在它所在的那个局域网内广播一个 ARP 请求,问「IP 地址是这个的主机,你的硬件地址是多少」。
- 局域网里所有主机都可能收到这个 ARP 请求,因为请求是以广播帧的形式发出去的,以太网帧首部的目的地址填的是全 1 的广播地址
FF:FF:FF:FF:FF:FF。 - 目标主机收到广播请求后,发现里面问的 IP 正是自己,就发送一个 ARP 应答数据包给请求方,把自己的硬件地址填写在应答里;其他主机发现问的不是自己,就不答复。
ARP 是「广播问、单答复」:请求全网段都听见,只有被问的那台回 MAC。
7.4 ARP 的定位:介于数据链路层和网络层之间
1. 放在链路层讲,是因为它服务帧的封装
- 严格地说,ARP 不是一个单纯的数据链路层协议,它是一个介于数据链路层和网络层之间的协议,因为它拿的是网络层的 IP、换出来的是数据链路层的 MAC。
- 把它放在数据链路层这一章讲,是因为它的产物 MAC 直接喂给 MAC 帧的封装,服务的对象是链路层的发送动作,所以从用途上归在链路层更顺手。
- 这种「跨层协议按用途归类」的情况在网络里不少见,ARP 只是其中一个典型,理解它的关键不在归到哪一层,而在它干的事:替 IP 找 MAC。
ARP 跨在两层之间,归在链路层讲是因为它的产物 MAC 直接进帧首部,归类是按用途,不是按出身。
7.5 ARP 的细节:缓存表、报文格式与几个字段
1. 缓存表让 ARP 不必每次都广播
- 每台主机都维护一张 ARP 缓存表,记录已经查到的 IP 到 MAC 的映射,可以用
arp -a命令查看;有了缓存表,发往同一个 IP 的后续帧不必每次都重新广播 ARP 请求,直接查表就行。 - 缓存表里的表项有过期时间,一般约 20 分钟,20 分钟内没有再次使用某个表项,这个表项就失效,下次还要发 ARP 请求重新获取。
- 为什么要有缓存表?因为 ARP 广播是全网段都收的,频繁广播会挤占介质,缓存表把重复的查询压到最少;为什么表项要过期而不是一直有效?因为对端主机的 MAC 可能变动、网卡可能更换、IP 可能重新分配,过期机制让缓存跟上这些变化。

缓存表压掉了重复广播,过期时间让缓存跟上 MAC 的变动,两者一静一动,是为了缓存既省事又不失真。
2. ARP 报文格式里的几个关键字段

- ARP 报文里源 MAC 和目的 MAC 在以太网首部和 ARP 报文里各出现一次,对于链路层是以太网的情况这种重复是多余的,但如果链路层是其他类型的网络,就有可能是必要的。
- 报文里有几个字段要记住:硬件类型指链路层网络类型,1 表示以太网;协议类型指要转换的地址类型,0x0800 为 IP 地址;硬件地址长度对以太网是 6 字节,协议地址长度对 IP 是 4 字节。
- op 字段区分报文种类:op 为 1 表示这是 ARP 请求,op 为 2 表示这是 ARP 应答,一个字段就把广播问和单答复两种动作区分开。
向下层交付

3. ARP工作链路

ARP 报文把「问什么、怎么答、转换的是哪种地址」一次写清楚,op 字段是请求和应答的分水岭。
八、全篇总结
1. 数据链路层接的是 IP 留下的最后一跳
- 网络层把报文送到正确的子网,数据链路层负责同子网里两台节点之间这一跳的交付。
- 它解决的是「怎么办」,和网络层的「为什么走这条」、传输层的「怎么保可靠」各扛一个问题。
2. 以太网帧靠定长字段和类型字段撑起封装分离
- 五字段帧格式里,定长字段让机器盲切就能拆装,类型字段让一帧能承载 IP、ARP、RARP 等不同协议。
- MAC 地址是网卡出厂的硬件身份证,和 IP 一个管每一跳、一个管整条路。
3. MTU 是链路层画给上层的尺寸线
- 1500 是以太网 MTU,UDP 算出 1472、TCP 算出 MSS 1460,都是这条线倒推出来的。
- TCP 握手谈拢 MSS 从源头躲开分片,UDP 不协商、超了就靠 IP 分片硬扛,这是两层的本质差别。
4. 局域网通信靠目的 MAC 筛选,靠按位与判同网段
- 同一局域网主机都收帧,非目标主机在链路层静默丢弃,上层无感。
- 走直连还是找网关,由两次按位与的网络地址是否相等决定,掩码是这条判据的公共尺子。
5. 跨网段通信只换 MAC、不改 IP
- 同网段目的 MAC 是对端、交换机转发;跨网段目的 MAC 是网关、路由器逐跳换 MAC。
- 源目 IP 从头到尾不变,只有 MAC 每一跳换,这是封装解封装落到每一跳的具体形态。
6. ARP 拿 IP 换 MAC,是跨层协议按用途归类
- ARP 广播问、单答复,靠缓存表压重复广播、靠过期时间跟上 MAC 变动。
- 它跨在链路层与网络层之间,归在链路层讲是因为产物 MAC 直接进帧首部。
7. 帧长 46~1500 是碰撞约束反推出来的
- 帧太长占介质久、帧太短次数多,两头都放大碰撞,所以卡在这个区间。
- 64 字节最小帧长更深的来历,是 CSMA/CD 冲突检测的往返时窗口。
九、文末面试题
9.1 推导题
1. 【推导】MAC 地址和 IP 地址在端到端传输中各自描述的是什么?为什么说 IP 决定了 MAC 的选择?
答(推导):IP 地址描述的是整条路途的总起点和总终点,从出发到到达一个字节不改;MAC 地址描述的是路途上每一个区间的起点和终点,每经过一跳就换一对。IP 决定了整条路怎么走,也就决定了每一段该走哪两台节点,而每一对节点的 MAC 才是这一段帧首部真正要填的值,所以是 IP 决定了 MAC 的选择。
2. 【推导】UDP 的 1472 和 TCP 的 MSS 1460 这两个数是怎么算出来的?为什么 TCP 基本不靠 IP 分片?
答(推导):两个数都来自以太网 MTU 1500。UDP 是 1500 减 IP 首部 20 减 UDP 首部 8 得 1472;TCP 是 1500 减 IP 首部 20 减 TCP 首部 20 得 MSS 1460。TCP 在三次握手中双方在 SYN 里写各自支持的 MSS、取较小者,发送上限被锁在 MSS 以内,而 MSS 又是按链路 MTU 倒推的,所以正常通信不超本端链路 MTU,基本不触发 IP 分片;UDP 不协商,超了就靠 IP 分片硬扛。
3. 【推导】同一个局域网里 A 发给 E,B C D 会怎样处理这一帧?为什么上层感觉不到?
答(推导):B、C、D 的网卡都能收到这一帧,因为局域网帧对全网段可见;它们解析帧首部目的 MAC,发现是 MacE 不是自己,就在链路层直接丢弃,不上交上层。只有 E 解析目的 MAC 是自己才接收并分离数据段上交。筛选发生在网卡这一层,所以上层只看见落到自己头上的帧,感觉不到别人也收过。
4. 【推导】主机怎么判断目标是同网段还是跨网段?同网段和跨网段在封装 MAC 帧时有什么不同?
答(推导):主机用自身 IP 与子网掩码按位与得自身网络地址、用目标 IP 与同一掩码按位与得目标网络地址,两个网络地址相等就是同网段,不等就是跨网段。同网段时 ARP 找对端主机 MAC、目的 MAC 填对端、交换机转发、不经路由器;跨网段时 ARP 找网关 MAC、目的 MAC 填网关、路由器逐跳解封装重封装换 MAC。两种情况源目 IP 全程不变。
5. 【推导】为什么以太网帧的数据段卡在 46 到 1500 字节?
答(推导):帧太长则比特流持续久、占用介质时间长,其他主机争用碰撞概率大;帧太短则一段数据要切更多帧、争用介质次数多,碰撞次数也多,两头都放大碰撞,所以卡在这个区间。更深一层,46 字节加上 14 字节帧首部和 4 字节 CRC 正好 64 字节,是最小帧长,按 CSMA/CD 冲突检测的 512 比特时往返窗口反推出来。
9.2 真题
1. ARP 协议的作用是什么?为什么 ARP 缓存表里的表项要设过期时间?
答:ARP 建立 IP 地址和 MAC 地址的映射,把网络层的 IP 翻译成数据链路层的 MAC,让 MAC 帧能填上目的地址发出去。表项设过期是因为对端 MAC 可能变动、网卡可能更换、IP 可能重新分配,过期机制让缓存跟上这些变化,避免用到失效的映射。
【真题·转述自小林 coding《计算机网络图解笔记·ARP 协议》】
2. 以太网帧的最小长度和最大长度分别是多少?为什么要有最小长度限制?
答:以太网帧最小 64 字节、最大 1518 字节(不含前导码),对应数据段最小 46、最大 1500。最小长度限制是为了让发送方在发完一帧之前能检测到冲突,对应 CSMA/CD 的冲突检测往返时窗口 512 比特时间。
【真题·转述自小林 coding《计算机网络图解笔记·以太网帧》】
3. MTU 是什么?MTU 对 TCP 和 UDP 分别有什么影响?
答:MTU 是最大传输单元,以太网一般是 1500 字节,是链路层给数据段画的上限。对 UDP,超过 1472(1500 减 IP 首部 20 减 UDP 首部 8)就触发 IP 分片,任一片丢失则整个 UDP 报文作废;对 TCP,握手时双方协商 MSS 取较小者,把发送上限锁在 MSS 以内,正常不触发分片。
【真题·转述自牛客网面经汇总《计算机网络高频面试题》】
4. 同一网段内两台主机通信,MAC 帧的目的地址填什么?跨网段时填什么?源 IP 和目的 IP 会改变吗?
答:同网段通信时 MAC 帧目的地址填对端主机的 MAC,由交换机转发;跨网段时目的地址填网关的 MAC,交给路由器三层转发,路由器逐跳把目的 MAC 换成下一跳 MAC。无论哪种情况,源 IP 和目的 IP 从头到尾不变,只有 MAC 每一跳更换。
【真题·转述自牛客网面经汇总《计算机网络高频面试题》】
5. ARP 请求是广播还是单播?ARP 应答呢?
答:ARP 请求是广播发送,以太网帧首部目的地址填全 1 的广播地址 FF:FF:FF:FF:FF:FF,局域网内所有主机都能收到;ARP 应答是单播,只有被问的那台主机回复,应答直接发给请求方。
【真题·转述自 0voice GitHub 面试题库《计算机网络面试题汇总》】
6. TCP 的 MSS 是怎么协商的?为什么不直接用一个固定值?
答:MSS 在 TCP 建立连接时由双方在 SYN 报文的 TCP 首部 40 字节变长选项(kind=2)里各自写入自己能支持的值,然后双方各自取较小者作为最终 MSS。不用固定值是因为通信双方两端的链路 MTU 可能不同,协商取小能让双方都不超出对方链路能收的上限,从源头避开 IP 分片。
【真题·转述自 0voice GitHub 面试题库《计算机网络面试题汇总》】
小结:网络层把报文送到对的子网,数据链路层把它送进对的网卡,这一跳怎么封装、MAC 怎么填、超长怎么和上层打交道,都落在本篇拆的这几个字段和协议里。想看哪一节再展开,评论区说。