
📚 本文收录于「流浪」的系列专栏
| 🐧 Linux系统 | ⚙️ C++ |
| 📊 数据结构与算法 | 🐍 Python |
| 🔗 LangChain & LangGraph | 🗄️ MySQL 数据库 |
| 🌿 Git 工具 | 🌐 计算机网络 |
| 🤖 LLM | 💯 大厂面试、八股 |
| 📚 学习筑基专栏 |
🏠 博客主页:流浪 | 📝 原创首发于 CSDN
前言: 篇21 把地址怎么切讲完,收在「私网地址要在出口换成公网地址」这一句。这篇把它展开:公网怎么一级一级搭起来,报文在哪一步被换掉地址,跨网络时 MTU 怎么把大报文拆开、对端又怎么拼回去。
一、运营商与路由器的两套 IP
1.1 什么是运营商:建网、要号段、分 IP

运营商的定位一句话:对上替你申请公网资源,对下替你组建并管理子网,中间那台路由器就是它的落地点。
1.2 一台路由器要有两套 IP

两套 IP 不是奢侈配置,是路由器"跨界"这件事的必然结果——它必须同时属于两边。
1.3 家用路由器:运营商子网里的一个节点

从家到公网不是一跳,而是一串路由器的接力,每一站做的是同一件事:判断下一站是谁。
二、私网 IP 为什么不能出现在公网
2.1 重复:全世界都在用 192.168.*

私网地址能成立的前提是"只在局部唯一",公网要的是"全局唯一",两套规则在公网上正面撞车。
2.2 出口替换:报文到路由器就换 WAN 口 IP
NAT 的动作极简:每过一层出口,内网地址就被换成对外的地址,换到最外层就只剩公网 IP。
2.3 运营商能控制报文出不出口
网络边界不只是通道,还是闸门;闸门开多大,由出口设备上的规则说了算。
三、公网是逐级搭起来的:国家 8 位、省 8 位、市 4 位
3.1 公网 IP 从哪来:各国运营商自主申请
公网不是抽象概念,它是被一段段号段占满的实体资源,谁的网民多,谁占的段就大。
3.2 国际路由:用 8 位表示国家
- 每个国家一个 /8,就是 2 的 24 次方,约 1677 万个地址
- 掩码 /8 让国际路由器一次按位与就能把其余所有国家排除掉

8 位国家号的意义不在编号好看,而在于一次比对就能把候选从"全球"砍到"一国"。
3.3 国内路由:再取 8 位区分省份
- /30 只留 2 个可用地址,正好够两台设备点对点互联
- 河南同样有 5.2.0.1/16 与 5.2.128.1/30 两套对外口

每多切一级,前缀就长一截:/8 到 /16 用掉 8 位,剩下的位留给下一层去分。
3.4 省内路由:再取 4 位区分市

到市这一级,公网的层级划分就停住了,再往下交给运营商的私网自治。
划分全链路

3.5 两种看法与全网连通
所谓公网,就是无数台配着两套 IP 的路由器层层互联拼出来的一张大网。
3.6 真实世界怎么分配
模型给你的是直觉:一层一层切、一层一层转发;真实世界只是层数更多、前缀更碎。
四、IP 的查找与转发全过程
4.1 从俄罗斯访问 5.1.16.X:逐级按位与

查路不存在全局计算,每一层只做同一件事:按位与、对表、交给下一跳。
4.2 路由表:转发判断的依据
- Flags 里的 U 表示这条记录有效,可以临时禁用某条记录
- Flags 里的 G 表示下一跳是某台路由器的地址;没有 G 说明目的网络与本机接口直接相连,不必经路由器

路由表按网段记账,不按主机记账;它回答的是"这个网段往哪走",不是"这台机器在哪"。
4.3 路由表怎么来的
谁生成表不重要,重要的是没有任何一台设备掌握整条路径,路径是每一跳现场拼出来的。
五、MTU:报文太大就要分片
5.1 MTU 1500 与网络层自动分片
MTU 是链路层的容量上限,分片是网络层为了遵守这个上限自己做的妥协。 
5.2 分片的代价:丢一片,整包全丢
分片不是白给的能力,它拿"整体成功率"换"能塞进链路",片数越多这笔交易越亏。
5.3 减少分片的办法:传输层控制长度
少分片。MSS 是传输层递给网络层的安全尺寸:按这个尺寸切段,中间每一跳都不需要再动刀。
六、分片的识别与组装
6.1 三个字段各管什么
三个字段凑成一套寻亲机制:标识说我们是一家的,MF 说后面还有没有,片偏移说我排第几。
6.2 怎么判断一个报文被分片了

在IPV4协议报头中 有一个三位标志:
- 第 0 位(保留 R)
- 第 1 位 DF
- 第 2 位 MF
片偏移:标记当前这片数据,在原始 IP 报文的数据部分里,从哪个位置开始
MF 和片偏移一组合,“是不是分片”"是不是最后一片"两个问题一次答完。
6.3 怎么发现分片丢了:三种情况
- 升序排好后相邻两片本应首尾相接
- 逐对验证,等式断掉的位置就是缺口
三种丢失共用一个原理:分片本应首尾相接铺满原始报文,任何一处接不上都是丢失的证据。
6.4 组装完成,交给上层
分片的完整闭环:发送端超长就切、途中每片独立转发、接收端按标识归组、按偏移排序拼回原样。
七、全篇总结
1. 公网是路由器拼出来的
2. 私网地址在出口被换掉
3. 转发就是逐级按位与
4. 超过 MTU 才分片,丢一片全丢
5. MSS 从源头减少分片
6. 三个字段撑起识别与组装
八、文末面试题
8.1 推导题
1. 链路 MTU 1500 字节,IP 报头 20 字节、TCP 报头 20 字节,MSS 是多少?一次要发 5000 字节数据,至少切成几段?
答(推导):MSS = 1500 − 20 − 20 = 1460 字节。5000 字节按每段 1460 装,5000 ÷ 1460 得 3 余 620,所以要 4 段,前三段各 1460、最后一段 620。这里要注意区分:这是传输层按 MSS 切段,不是网络层分片,两者目的相同但层次不同。
2. 给一个 IP 报文的 MF 与片偏移取值,怎么判断它是完整报文、中间片还是最后一片?
答(推导):先看 MF 再看片偏移。MF 为 0 且片偏移为 0,是完整未分片的报文;MF 为 1,是还有后续的中间片,其中片偏移为 0 的那个就是第一片;MF 为 0 但片偏移不为 0,是最后一片。判断要点在于最后一片必须靠 MF 归零来标识,不能只看偏移。
3. 收到的分片片偏移依次是 0、185、370,各片数据长度都是 1480 字节,判断是否收齐。
答(推导):按"片偏移 + 自身数据长度 = 下一片片偏移"逐个验。第一片偏移 0 表示起点 0,加 1480 得 1480,除以 8 是 185,与第二片偏移吻合;第二片起点 1480,加 1480 得 2960,除以 8 是 370,与第三片吻合。三片首尾相接没有缺口,但还要看最后一片的 MF 是否为 0,只有尾片标识归零才能判定收齐。
8.2 真题
1. 一个 5960 字节的数据报(20 字节 IP 首部加 5940 字节数据),经过 MTU 为 1500 的链路,怎么分片?
答(转述):每片数据最多 1500 − 20 = 1480 字节,5940 ÷ 1480 约等于 4.01,向上取整得 5 片。前四片各带 1480 字节数据、总长 1500,第五片带 5940 − 4×1480 = 20 字节数据、总长 40。片偏移依次为 0、185、370、555、740,前四片 MF 为 1、最后一片 MF 为 0,DF 全为 0。
【真题·转述自 牛客:一个 5960 字节的数据报(其中 20 字节 IP 首部加上 5940 字节数据)】
2. 路由表里有 169.96.40.0/23 下一跳 176.1.1.1 走 S1、169.96.40.0/25 走 S2、169.96.40.0/27 走 S3、0.0.0.0/0 走 S4,目的地址 169.96.40.5 从哪个接口转发?
答(转述):前三条具体路由都能匹配上,按最长前缀匹配选前缀最长的 /27 那条,从 S3 转发给下一跳 176.3.3.3。判断方法是把目的地址与每条记录的掩码按位与,结果等于该条目的网络号就算命中,命中多条时前缀越长越优先。
【真题·转述自 牛客:若路由器收到一个目的地址为 169.96.40.5 的 IP 分组】
3. 路由表里 128.96.39.0/25 走 m0、128.96.39.128/25 走 m1、128.96.40.0/25 走 R2、192.4.153.0/26 走 R3,另有默认路由 R4,目的地址 128.96.40.151 走哪一条?
答(转述):目的地址 128.96.40.151 与 /25 掩码相与,末字节 151 与 128 相与得 128,结果是 128.96.40.128,与三条 /25 路由的目的网络 128.96.39.0、128.96.39.128、128.96.40.0 都对不上;再与 /26 掩码相与,末字节 153 与 192 相与得 128,结果是 192.4.153.128,也不匹配 192.4.153.0。既然没有命中项,就走默认路由 R4。
【真题·转述自 牛客:计算机网络网络层部分习题解答】
4. MTU 和 MSS 是什么关系,MSS 一般是多少?
答(转述):MTU 是链路层一次能承载的最大数据长度,MSS 是 TCP 一次向下交付的最大数据量。以太网 MTU 通常 1500 字节,TCP 与 IP 报头常规各 20 字节,所以 MSS = 1500 − 20 − 20 = 1460 字节。MSS 的作用就是让网络层尽量不需要分片,因为分片会增加丢包概率与额外开销。
【真题·转述自 牛客:后端高频面试方向 IP 协议】
5. TCP 握手时已经协商了 MSS,为什么实际传输中还会发生 IP 分片?
答(转述):MSS 只约束发送端与接收端协商出的这一档值,管不住中间路径。路径上不同链路的 MTU 可能更小,报文在中间路由器上仍可能被切开;应用层一次交付的数据过大,TCP 切段后配上报头依然超出路径 MTU 时也会触发。要进一步避免,得依靠路径 MTU 发现这类机制。
【真题·转述自 牛客:汇川嵌入式软件开发一面面经】
6. 分片到达接收方后,怎么判断有没有丢片?
答(转述):三件事一起看。有没有片偏移为 0 的首片,有没有 MF 为 0 的尾片,按片偏移升序排好后相邻两片是否首尾相接。三样都满足才算收齐,缺任何一样都拼不回原报文,整包只能丢弃。
【真题·转述自 牛客:计算机网络面试之网络层 IP 工作原理】
💬 结语: 公网不是一张平铺的网,它是一层一层切出来、一跳一跳走出来的;报文太大时,网络层还会替你把它拆开,再在对端拼回去。评论区聊聊,你第一次算片偏移时,有没有忘记那个除以 8。



