《深入理解 RFC 791:Internet Protocol》 📅 2026/7/7 7:10:47 大家好今天我们来聊聊互联网的基石——IP协议。我将带你深入剖析 RFC 791 文档把这份略带古早味却极其核心的协议规范嚼碎喂给你。 第一步文档速览在深入学习之前我们先看看这份文档的“身份证”信息RFC 编号791完整标题Internet Protocol (互联网协议)发布日期1981年9月协议状态互联网标准核心目标在互联互通的网络环境中提供从源主机到目的主机传送数据包称为数据报的功能。它主要解决两大核心问题寻址和分片。IP协议负责为数据包打上地址标签并在必要时将大包拆小穿越不同能力的网络链路。 第二步核心机制通俗讲解IP协议是怎么工作的我们用生活中的例子来打个比方。1. 协议运行的整体流程和关键角色你可以把 IP 协议想象成邮政系统。高层协议如 TCP就像是写信的人把信写好交给邮局。IP 模块就是邮局它给信件套上信封IP头写上寄信人和收信人地址IP地址。本地网络接口底层链路就像是运送邮件的卡车或飞机。网关路由器就是中转邮局负责把信件从一条线路转运到另一条线路。工作流程TCP模块把数据交给IP模块IP模块创建IP数据报交给本地网络接口发送中途的网关收到数据报剥去底层链路头检查IP头中的目的地址网关决定下一跳再次封装进底层链路并发送目的主机收到后层层剥开最终把数据交给对应的应用程序。2. 报文结构、关键字段的含义和作用IP数据报的头部就像是快递面单包含以下关键信息Version (版本)4位。说明IP协议版本RFC 791描述的是版本4即IPv4。IHL (Internet Header Length)4位。头部长度以32位4字节为单位。最小值是5意味着最小头部有20字节。Type of Service (服务类型, TOS)8位。指示希望的服务质量比如要求低延迟、高吞吐量或高可靠性。Total Length (总长度)16位。整个数据报头部数据的长度最大可达 65,535 字节。Identification (标识符)16位。发送方分配的ID用来让接收方识别哪些分片属于同一个原始数据报。Flags (标志位)3位。包含 DFDont Fragment不可分片和 MFMore Fragments还有更多分片。Fragment Offset (分片偏移)13位。指示当前分片在原数据报中的位置以8字节为单位。TTL (Time to Live, 生存时间)8位。数据报的寿命每经过一个路由器减1减到0就丢弃防止数据报在网络中无限循环。Protocol (协议)8位。指示上层协议比如TCP或UDP相当于告诉收件人这封信该交给哪个部门处理。Header Checksum (头部校验和)16位。只校验头部不校验数据。因为TTL每跳都在变所以校验和每跳都要重新计算。3. 交互机制无连接的独行侠IP协议没有状态机也没有握手交互。它是一个无连接的协议没有端到端确认信寄出去了邮局不管你收没收到。没有错误控制数据丢了就丢了IP只管头部有没有错数据内容出错它不管。没有流控不会因为接收方处理不过来就放慢发送速度。 这些可靠性问题统统甩给了上层如TCP去解决。4. 和其他常见协议的依赖与配合向上服务为 TCP、UDP 等传输层协议提供寻址和传输服务。向下调用调用底层本地网络协议如以太网、Wi-Fi将数据报送到下一个节点。️ 第三步开发者必知要点在开发或排错时以下几个点最容易踩坑576 字节的黄金底线文档明确规定所有主机必须准备好接收 576 字节的数据报不管是否分片。如果你要发大于 576 字节的包必须确认目的端有能力接收否则很容易在传输中被丢弃或引发问题。分片偏移量以 8 字节为单位IP分片不是随便切得稀碎的。数据的拆分必须在 8 字节64位的边界上进行。第一个分片必须是 8 字节的整数倍。计算分片偏移时千万别忘了除以 8。TTL 的本质是跳数上限虽然名字叫“Time to Live”单位也是秒但在实际实现中每经过一个处理节点 TTL 至少减 1哪怕处理时间不到 1 秒。所以把它当成“跳数限制”来理解更准确。最大值为 255约 4.25 分钟。校验和只管头部不管数据IP的 Header Checksum 不包含数据部分。如果你在抓包发现应用层数据被篡改IP层是发现不了的必须依赖 TCP/UDP 的校验和或者应用层自身的完整性校验。DF 位的高级用法设置 DF1不可分片可以用来探测路径上的最小 MTUPMTUD 机制。如果中间链路不支持这么大的包数据报会被丢弃。文档中提到下载小主机引导程序时就会用到 DF防止小主机没有足够内存重组分片。 一句话记住这个协议“IP协议是互联网的 postal service只管打包寻址和分片转发不保证送达却四通八达。”希望这篇博客能帮你重新认识这位每天都在默默工作的老朋友——IPv4