
📚 本文收录于「流浪」的系列专栏
| 🐧 Linux系统 | ⚙️ C++ |
| 📊 数据结构与算法 | 🐍 Python |
| 🔗 LangChain & LangGraph | 🗄️ MySQL 数据库 |
| 🌿 Git 工具 | 🌐 计算机网络 |
| 🤖 LLM | 💯 大厂面试、八股 |
| 📚 学习筑基专栏 |
🏠 博客主页:流浪 | 📝 原创首发于 CSDN
前言: 篇19 把 socket 到 tcp_sock 那条对象链摸完,传输层到这里收口。报文出了传输层还得往下走,交给网络层才出得了主机。这篇讲 IP 在这条链里担什么责、IPv4 报头那 12 个字段各管一件事,以及 TTL 怎么拦住那些永远到不了的包。
一、TCP 不是两台主机直接对话,报文要先交给网络层
1.1 传输层只看得见对面那台主机的传输层
- 讲 TCP 时的默认视角:两端传输层直接对话,序号、确认号、窗口都是这边写、那边读,看上去像两台主机的传输层之间拉了一根线。
- 真实过程不是这样:TCP 报文得先向下交付给网络层,由网络层封装成 IP 包,再交给链路层封装成帧,出了网卡才真正进到网络里。
- 对方收到之后方向反过来:链路层剥掉帧头,网络层剥掉 IP 报头,剩下的 TCP 段才交回传输层,这时候才谈得上读序号、回 ACK。
- 中间隔着的那一串路由器,一台都不看 TCP 的内容,它们只认 IP 报头里的地址。
传输层负责「说什么」,网络层负责「怎么送到」;两台主机的传输层从来没有直接通过话,中间那段路全是网络层在扛。
1.2 交付与解包:分层的交接动作
- 向下交付叫封装(encapsulation):每一层在自己的头部前面套一层,TCP 段变成 IP 包,IP 包再变成帧,像俄罗斯套娃一层套一层。
- 向上解包叫解封装(decapsulation):对方按头部里的类型字段一层层剥,剥到 TCP 段才按端口交给对应进程。
- 路标就写在头部里:链路层的帧类型字段说明「里面装的是 IP」,网络层的协议字段说明「里面装的是 TCP 还是 UDP」。
- 白话:装的时候一层套一层,拆的时候看标记从外往里拆,没人会拿剪刀乱剪。
封装和解包是分层的物理形态,报头里的类型字段就是「下一层拆给谁」的路标。
二、IP 只承诺大概率送达,100% 靠传输层补
2.1 IP 的能力边界:送到,但不保证一定送到
- IP 协议的核心作用只有一条:提供一种能力,把数据从主机 A 经过网络送到主机 B。
- 这种能力只是「有很大概率」:包可能丢、可能乱序、可能重复、可能半路被丢弃,IP 一概不管,也不回头补。
- 它连「送到了没有」都不确认,发出去就忘,网络层里没有任何一个字段是为可靠性准备的。
- 白话:IP 像平邮寄信,投进邮筒就不管了;丢没丢、到没到,它不追问。
IP 是尽力而为(best effort)的服务,它交付的是「投递动作」,不是「投递结果」。
2.2 100% 是 TCP 的策略加上 IP 的能力
- TCP 用确认、序号、重传把「大概率」补成「一定」:丢了重发,乱了重排,重了丢掉。
- 分工一句话:传输层解决「丢包了怎么办」,网络层解决「怎么把包送到对方」。
- 两层叠起来才凑成 TCP/IP 协议的核心功能------把数据 100% 可靠地从 A 主机发送到 B 主机,这也是网络要解决的核心问题。
- 白话:IP 负责把包裹送到小区门口,TCP 负责盯着签收,没签收就再寄一次。
可靠性不是网络层给的,是端系统用重传策略叠在尽力而为之上的。
2.3 这套分工的正名:端到端原则
- 端到端原则(end-to-end argument):把复杂功能放在通信的两端,网络中间只做简单转发。
- 好处:中间设备不用为每条连接保存状态,坏一台换一台就行;端系统自己知道要什么,实现可以做得更彻底。
- 代价:中间网元帮不上忙,链路越差,端上重传越多,延迟也越高。
- 白话:快递公司只负责运,验货、退货这些麻烦事交给收发双方自己办。
IP 越薄,网络越好扩展;TCP 越厚,端上越好保证------这套取舍就是互联网能长大的原因。
三、寻址与转发:IP 地址定位网络,子网再交付主机
3.1 主机唯一性靠 IP 地址,进程靠端口
- 两台主机要通信,先得有办法识别双方主机的唯一性,这件事由 IP 地址负责。
- 包到了主机之后,交给哪个进程由传输层解决,靠的是端口号。
- 白话:IP 地址是小区门牌,端口号是屋里的房间号;快递只送到门口,进屋找谁得看房间号。
网络层定位到主机,传输层定位到进程,两层各给一段地址。
3.2 IP 地址 = 网络号 + 主机号
- 一个 IPv4 地址 32 位,拆成网络号(network)和主机号(host)两段,从哪切由前缀长度或子网掩码决定。
- 例子:
192.168.1.10/24,前 24 位是网络号192.168.1,后 8 位是主机号10;子网掩码255.255.255.0和地址按位与得到的192.168.1.0,就是网络号。 - 同一网络号下的主机在同一个子网里,可以直接交付;网络号不同,就必须经过路由器。
- 白话:地址前半截是「哪个小区」,后半截是「小区里哪一户」;同小区的直接敲门,跨小区得先出大门。
IP 地址天生是两段结构,这个结构决定了「哪些能直送、哪些必须转发」。
3.3 先到网络,再到主机
- IP 协议并不能直接把数据转发到目标主机,它先把包转发到目标主机所在的局域网(子网),再由子网交付给具体的主机。
- 逛故宫的比喻:不能坐飞机或火车直接落到故宫门口,得先到北京,再从北京去故宫。
- 白话:跨城快递只承诺送到目的地城市的分拨中心,最后几公里归当地网点。
网络层的转发粒度是「网络」不是「主机」,最后一跳交给子网完成。
3.4 每台主机都要有 IP 地址,但不必是公网 IP
- 主机要的是一个可路由的地址,公网地址只是其中一种;私网地址(
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)在局域网里照样能用。 - 出公网时由 NAT 换成公网地址:只换 IP 叫 NAT,IP 加端口一起换叫 NAPT,后者才能让一屋子主机共用一个公网地址(后面会讲这些)。
- 后果:私网地址可以在全世界重复,代价是外部无法主动连进来,端口映射、P2P 穿透这些场景都得额外处理。
- 白话:公司内部工位号随便编,寄外部快递时统一换成公司对外的门牌。
地址的唯一性只在需要的范围内成立,NAT 把「全局唯一」降级成「局部唯一」。
3.5 路由器逐跳转发,节点是主机与路由器的统称
- 源网络和目标网络之间隔着很多网络,传输过程要靠路由器一跳一跳转接,发到下一个网络。
- 相邻的两个路由器属于同一个子网,所以路由器转发的中介动作是「从一个网络到另一个网络」。
- 路由器只需要网络层及以下的功能;但当代路由器已经具备应用层,可以看作一台小型计算机。
- 节点(node):主机和路由器的统称。
- 白话:路由器是高速公路上的服务区,只负责把你导到下一段路,不关心你后备箱装了什么。
网络层的工作单位是「跳」,每一跳只决定下一站,全局路径是逐跳拼出来的。
四、IPv4 报头:20 字节定长,12 个字段各管一件事

4.1 协议在代码里就是一个结构体
- 协议在实现上就是一个结构体,IPv4 报头对应内核里的
struct iphdr,字段顺序和位宽跟协议文档对得上。 - 结构体定义(简化自内核源码,用位域写法让宽度一眼可见):
c
struct iphdr { // IPv4 报头,定长部分 20 字节
__u8 version:4, // 版本:4 表示 IPv4
ihl:4; // 首部长度:以 4 字节为单位
__u8 tos; // 服务类型:优先权 + TOS + 保留位
__be16 tot_len; // 总长度:报头 + 数据
__be16 id; // 标识:同一报文的分片共用一个值
__be16 frag_off; // 标志(3 位)+ 片偏移(13 位)
__u8 ttl; // 生存时间:每经过一个路由器减一
__u8 protocol; // 上层协议:TCP 6、UDP 17、ICMP 1
__sum16 check; // 首部检验和:只校验报头
__be32 saddr; // 源地址
__be32 daddr; // 目的地址
};
- 定长部分 20 字节,后面可跟选项(options),选项后面才是数据;选项让报头最长能到 60 字节。
- 白话:报头是一张固定格式的表格,每一格宽度写死,填完 20 字节就开始装货。
字段宽度决定了这个协议能表达多大的数,报头设计就是一次容量分配。
4.2 12 个字段全景
| 字段 | 位宽 | 管什么 |
|---|---|---|
| 版本 | 4 | 这是 IPv4 还是 IPv6 |
| 首部长度 | 4 | 报头有多长,单位 4 字节 |
| 服务类型 | 8 | 这个包想要什么样的服务 |
| 总长度 | 16 | 报头加数据一共多少字节 |
| 标识 | 16 | 分片属于哪个原始报文 |
| 标志 | 3 | 能不能分片、后面还有没有片 |
| 片偏移 | 13 | 这一片在原报文里的位置 |
| 生存时间 | 8 | 还能经过几个路由器 |
| 协议 | 8 | 上层是 TCP、UDP 还是 ICMP |
| 首部检验和 | 16 | 报头有没有被传坏 |
| 源地址 | 32 | 谁发的 |
| 目的地址 | 32 | 发给谁 |
- 定长部分合计 20 字节;首部长度字段以 4 字节为单位,所以它的最小值是 5(5 × 4 = 20)。
- 12 个字段里没有一个是确认、重传、序号------跟可靠性有关的位一个都没留,报头本身就说明了这是个尽力而为的协议。
- 白话:这张表就是 IP 的全部说话能力,它只会表达这些事,别的一概不管。
字段少、宽度紧,是尽力而为在设计上的体现------不预留任何可靠性相关的位。
4.3 4 位版本:IPv4 还是 IPv6
- 4 位版本(version)标明这个包是 IPv4 还是 IPv6,IPv4 填 4,IPv6 填 6;中间设备拿到包先看这一格,才知道后面按哪套格式解析。
- 现在网络里大量还是 IPv4,原因有三:
- 地址分配的历史惯性
- NAT 把地址短缺顶住了
- 升级要动全链路的软硬件。
- IPv6 的过渡方式是双栈(dual stack):一台主机同时配 v4 和 v6 地址,按对端能力选一套。
- 白话:IPv4 是用了四十年的老地址簿,虽然不够用,但换本子得全家一起换。
版本字段是给中间设备看的,它决定后面整段报头按哪套格式解析。
4.4 4 位首部长度:报头有多长
- 4 位首部长度(IHL,Internet Header Length)表示报头长度,单位是 4 字节,它决定数据从哪里开始。
- 它能表达的报头最长 15 × 4 = 60 字节,减去 20 字节定长部分,选项最多 40 字节;实际报文绝大多数填 5,也就是不带选项。
- 换算方式与 TCP 的数据偏移同源,都是字段值乘 4,这里不再重复推一遍。
- 白话:这一格是「表头占几行」,选项越多表头越长,装货的地方就越靠后。
首部长度是解包的起点,不知道报头多长,后面所有字段都读不准。
4.5 8 位服务类型:四个愿望只能挑一个
- 服务类型(Type Of Service)8 位拆成三段:3 位优先权字段(已经弃用)、4 位 TOS 字段、1 位保留字段(必须置 0)。
- 4 位 TOS 分别表示最小延时、最大吞吐量、最高可靠性、最小成本;这四者相互冲突,只能选一个。
- 应用举例:ssh/telnet 这类交互程序,最小延时更重要;ftp 这类批量传输程序,最大吞吐量更重要。
- 现行口径提一句:这个字段后来被 DSCP(6 位区分服务码点)和 ECN(2 位显式拥塞通知)接管,语义从「我想要什么」变成「这个包属于哪一类」。
- 白话:这四个愿望像点菜只能选一个套餐------要快就别贪量大,要稳就别嫌贵。
TOS 是把服务质量写进报头的第一次尝试,四选一的设计注定它只能给倾向,给不了承诺。
4.6 16 位总长度:报头加数据一共多长
- 16 位总长度(total length)表示报头加有效载荷的总字节数。
- 封包时正着算:数据长度加上首部长度填进去;解包时反着算:总长度减去首部长度,得到数据长度。
- 上限是 65535 字节,这是 IP 包自身的表达极限;链路层的 MTU 是另一回事,以太网常见 1500 字节。一个管协议能表达多大,一个管这条链路能扛多大。
- 白话:这一格是整张快递单的总重,毛重含包装,净重得减掉包装才知道。
总长度和 MTU 分属两层,混着说就会得出「IP 包最大 1500 字节」这种错误结论。
4.7 标识、标志、片偏移:分片要用的三个字段
- 16 位标识(identification):同一个原始报文分出来的所有片共用一个值,接收方靠它对号,把片重新拼回一个报文。
- 3 位标志(flags):一位保留必须为 0;DF(Don't Fragment)置 1 表示不许分片,路上遇到扛不住的大包就丢弃并回 ICMP;MF(More Fragments)置 1 表示后面还有片。
- 13 位片偏移(fragment offset):这一片的数据在原始报文里的位置,单位是 8 字节,所以除最后一片外,每片的数据长度必须是 8 的倍数。
- 白话:标识是快递单号,MF 是「这箱是第几箱、后面还有没有」,片偏移是箱子在货架上的位置。
分片三件套是 IP 唯一的多包协作机制,也是网络层不做可靠传输的代价------丢一片,整个报文作废。
4.8 8 位协议:这个包该交给谁
- 8 位协议(protocol)标明上层是哪个协议:TCP 是 6,UDP 是 17,ICMP 是 1。
- 接收方靠它完成分用(demultiplexing):按字段值把包交给对应的处理模块,再往下按端口交给对应进程。
- 白话:这一格是信封上的收件部门,写着技术部就直接送到技术部,不用全公司挨个问。
协议字段是分用的第一道分流,网络层只负责把包交对部门,进哪个进程由端口决定。
五、TTL:报文为什么不会永远在网络里打转
5.1 环路从哪来:拓扑不完善加上软件 bug

- 网络拓扑复杂,转发又要靠软件做报文路由,实现里有 bug 就可能出现路由环路。
- 拓扑结构不完善时,A 发给 B 的报文可能被来回转发,两边都以为对方会把包送出去。
- 距离矢量类算法还会「计数到无穷」:一条链路断了,两个路由器互相以为对方有更短的路径,跳数一路往上加。
- 白话:两个人互相指路「你往前走,他会告诉你」,结果谁也没指对,人就在原地转圈。
环路不是物理故障,是转发决策互相矛盾的结果,靠拓扑自愈解决不了全部。
5.2 集线器与交换机的分工
- 集线器(hub)工作在物理层,只把电信号整形放大再广播出去,放大之后报文就可以被更多的路由器接收到,可能进一步增加报文在网络中的循环;集线器不做路由,也不按地址转发,更不会改 TTL。
- 交换机(switch)工作在数据链路层,按 MAC 地址转发;拓扑里出现环形连接会形成广播风暴,靠 STP(生成树协议)把环剪成树来解决。
- 只有路由器这类三层设备才会把 TTL 减一;集线器和交换机经过多少台,TTL 一个数都不动。
- 白话:集线器是个大喇叭,谁说话全屋都听见;交换机是带门牌的分拣员;环路是分拣规则自己绕成了圈。
环路分二层和三层两种,二层靠 STP,三层靠 TTL,设备在哪一层就归哪一层的规矩管。
5.3 报文永远不死会带来什么
- 带宽被吃:同一个包在环里反复传,占的是实打实的链路容量。
- CPU 和缓存被占:每个包都要查表、要缓存、要中断,环里的包让设备一直空转。
- 路由表被污染:环路往往伴随错误的路由条目扩散,故障范围从一个子网扩到一片。
- 白话:一封找不到地址的信在邮局之间来回寄,邮车、分拣员、仓库全被它占着。
没有上限的转发会把局部故障放大成全局拥塞,必须有个字段能强制叫停。
5.4 TTL:每跳减一,减到零就丢

- 8 位生存时间(TTL,Time To Live)就是那个强制叫停的字段,初值由发送方设定,常见 64、128、255。
- 报文每经过一个路由器,该路由器把 TTL 减一;当 TTL 减到 0 时,路由器直接丢弃这个包。
- 丢弃时会回一个 ICMP 超时报文(类型 11)给源地址,源端才知道包死在半路。
- 白话:TTL 是一张限次车票,每过一个站剪一个洞,洞剪完了就不许再坐。
TTL 用 8 位代价换来了网络里不存在永久流浪的包,这是最便宜的兜底。
5.5 从 ttl=52 反推跳数
- 实测例子:
ping www.baidu.com回来的包里ttl=52。 - 反推:初始 TTL 常见 64,64 减 52 等于 12,说明这个包路上大约经过 12 个路由器。
- 注意:中间设备可能改 TTL,反推出来的只是估算,不能当精确拓扑证据。
- 白话:车票上剩 52 个洞,本来 64 个,一路剪掉 12 个,就知道中途过了 12 个站。
TTL 剩下的值能粗略画出「离你多远」,这也是 traceroute 的实现基础。
5.6 TTL 顺带解决的两件事
- traceroute:从 TTL=1 开始逐个加一,每一跳都会触发一个 ICMP 超时,回包地址就是这一跳的路由器。
- 初始值指纹:不同系统的默认 TTL 不同,可以作粗略的操作系统判别。
- Linux 常见 64
- Windows 常见 128
- 部分网络设备 255
- 白话:同一个字段,既是保险丝,也是探路针。
一个为防环设计的字段,被工程上二次利用成了拓扑探测工具,这属于协议设计的意外红利。
六、首部检验和与源/目的地址
6.1 16 位首部检验和:只保报头,不保数据
用来检测IP 头部在传输过程中有没有比特出错(损坏)
- 首部检验和(header checksum)只校验报头这 20 字节(含选项),有效载荷完全不参与。
- 算法是反码求和:发送方把首部按 16 位一组相加,进位回卷到低位,结果取反填入字段;接收方用同样方法把整段首部(含检验和)加一遍,结果应为全 1。
- 为什么只校验首部:数据正确性交给上层,TCP 和 UDP 各自有检验和;网络层只保证「这个包该去哪」这件事没被读错。
- 白话:只验快递单填得对不对,不验箱子里货好不好------货的事归发货方管。
检验和范围划在报头,是分层职责的直接体现,也是性能上的取舍。
6.2 为什么每跳都要重算首部检验和
- TTL 每跳减一,报头就变了,原来的检验和立刻失效,所以每个路由器转发前都要重算一遍。
- 代价:这是网络层唯一一处每跳都要动报头的开销,也是 IPv6 取消首部检验和的原因之一。
- 白话:单子上改了一个数字,合计就得重算,不然对不上账。
可变字段决定了检验和必须重算,这是 IPv4 设计里一处明确的性能成本。
6.3 检验和要防的是什么:从电磁干扰到比特翻转
- 物理层上,电信号在铜缆里传输会受电磁干扰,光信号在光纤里也会有衰减和噪声,比特可能翻面。
- 设备内部同样会出错:内存位翻转、DMA 传输错误、驱动 bug 都可能把某个位写反。
- 检验和能挡住的是偶然的、少量的位错误;它挡不住恶意篡改,那要靠上层加密和认证。
- 白话:单子上的字可能被水洇糊,验一遍数字合计就知道有没有糊掉一位。
检验和是一道便宜的偶然错误防线,不承担安全职责。
6.4 32 位源地址与目的地址
- 源地址标明发送方,目的地址标明接收方,各 32 位,是整张报头里最宽的两个字段。
- 转发全程只看目的地址:每一跳拿目的地址查路由表,决定下一跳往哪送;源地址只在回包和排错时用得上。
- 地址在转发过程中不变,NAT 场景除外,那是中途改写,属于特例(后面会讲)。
- 白话:目的地址是「寄给谁」,源地址是「谁寄的」;邮局只关心寄给谁,退件时才看谁寄的。
目的地址驱动转发,源地址服务于回程与诊断,两者分工在报头里就写定了。
七、全篇总结
1. 传输层说话,网络层送信
- TCP 报文要向下交给网络层才出得了主机,封装与解包是分层的物理形态。
2. IP 是尽力而为,可靠性在端上
- IP 只承诺大概率送达;100% 靠 TCP 的重传策略补上,这套分工就是端到端原则。
3. 地址两段结构决定转发粒度
- IP 地址等于网络号加主机号;先到网络再由子网交付主机,公网地址靠 NAT 才全局唯一。
4. 报头 12 个字段各管一件事
- 20 字节定长:版本、首部长度、服务类型、总长度、标识、标志、片偏移、TTL、协议、检验和、源地址、目的地址。
5. TTL 与检验和是两处兜底
- TTL 每跳减一防环,检验和只保报头且每跳重算;一个防死循环,一个防读错。
八、文末面试题
8.1 推导题
1. IP 只保证尽力而为,为什么互联网敢把可靠性交给端系统而不是网络中间?这套取舍的代价是什么?
答(推导):这是端到端原则的直接后果。中间只做转发、不留状态,设备坏了换一台就行,扩展性全押在这条「薄」上;可靠性放到端系统,因为只有收发双方才知道自己要什么级别的可靠。代价是端上必须自己发现丢包并重传,链路越差重传越多,弱网下 TCP 的表现会明显变差。
2. 一个 IP 包从 A 到 B,报头里哪些字段会被改写、哪些不变?为什么检验和必须每跳重算?
答(推导):每跳必改的是 TTL,减一;因为 TTL 变了,首部检验和随之失效,所以每跳都要重算,这是 IPv4 里唯一一处每跳动报头的开销。分片时由分片的那台设备填写标识、标志和片偏移。版本、协议、源地址、目的地址在转发中保持不变,只有 NAT 设备会改写地址和端口,那属于特例。目的地址全程驱动每一跳查表,源地址只在回程和诊断时用到。
3. 如果没有 TTL,一个路由环路会造成什么后果?TTL 为什么选 8 位而不是更大?
答(推导):没有 TTL,环里的包会永远转下去,链路带宽被同一批包反复占满,路由器的查表、缓存、中断全被空转掉,再叠加错误路由条目的扩散,一个子网的故障会被放大成一片网络的拥塞。8 位够用,是因为互联网直径只有几十跳,远小于 255,再宽就是拿报头宽度换用不上的余量。
8.2 真题
1. IPv4 首部有哪些字段,各占多少位?
答(转述):定长 20 字节,按五个四字节分组记:第一组版本 4 位、首部长度 4 位、服务类型 8 位、总长度 16 位;第二组标识 16 位、标志 3 位、片偏移 13 位;第三组 TTL 8 位、协议 8 位、首部检验和 16 位;第四组源地址 32 位;第五组目的地址 32 位。后面还可以跟选项和填充,首部最长 60 字节。
【真题·转述自 牛客:IP 协议的首部结构】
2. IP 数据报中的首部检验和并不检验数据报中的数据,这样做的好处和坏处是什么?
答(转述):好处是每跳重算的代价被压到最小,只算 20 字节报头;数据部分的正确性由 TCP 或 UDP 的检验和兜底,网络层再算一遍属于重复劳动。坏处是数据部分被破坏时网络层不报错,包会带着错误继续往前走到端系统,上层若用没有校验和的 UDP,坏数据可能直接交给应用。
【真题·转述自 牛客:IP 数据报首部检验和的范围】
3. 关于 IP 报文头的 TTL 字段的理解?
答(转述):TTL 占 8 位,最大值是 255,不是 65535;正常情况下路由器不应该从接口收到 TTL 为 0 的报文;它的主要目的是防止报文在网络中循环转发、白吃带宽;只有路由器这类三层设备才把 TTL 减一,集线器和交换机不改 TTL,所以「每经过任何网络设备都减一」是错的。
【真题·转述自 牛客:华为笔试题·IP 报文头的 TTL 字段】
4. 一个数据报长度为 4000 字节(固定首部),经过 MTU 为 1500 字节的网络,怎么分片?
答(转述):有效载荷是 4000 减 20 等于 3980 字节,每片最多带 1500 减 20 等于 1480 字节数据,所以要分 3 片:前两片各 1480 字节,最后一片 1020 字节。片偏移以 8 字节为单位,三个值分别是 0、185、370;MF 标志分别是 1、1、0,最后一片 MF 为 0 表示后面没有了。
【真题·转述自 牛客:IP 数据报分片计算】
5. 公网 IP 和私网 IP 有什么区别,NAT 是怎么工作的?
答(转述):私网地址只在组织内部有效、可以全世界重复,公网地址全球唯一、由统一机构分配。NAT 装在私网连外网的路由器上(出入口路由器),把出站的私网地址换成公网地址,回包再按转换表换回去;只换地址的叫 NAT,地址加端口一起换的叫 NAPT,后者才能让多台主机共用一个公网 IP。代价是转换表要维护、外部无法主动连进来、设备重启会断掉已有连接。
【真题·转述自 牛客:下面有关 NAT 的描述,说法错误的是】
6. 以下出现在 IPv4 头部却未出现在 IPv6 头部的是哪些字段?
答(转述):首部检验和与分片相关的片偏移。IPv6 把首部固定成 40 字节、去掉了检验和,因为链路层和传输层都会校验,每跳重算的开销不值得;同时 IPv6 只允许源和目的主机分片,中间路由器不分片不重组,所以片偏移这类字段也没有存在的必要。
【真题·转述自 牛客:小米集团笔试题·IPv4 与 IPv6 首部差异】
💬 结语: IP 把「送到」和「送到且送对」拆成两件事:它只负责把包交给下一个网络,剩下的交给端系统。12 个字段、TTL 与检验和,都是在这个前提下做的最小兜底。评论区聊聊你第一次抓包看 IP 报头时,哪个字段最出乎意料。
