资讯动态

【计算机网络 | 网络层6:IPv4 数据报格式:TTL、分片、首部校验和分别有什么用?】

发布时间:2026/9/2 7:55:21 来源:尧图企业网站定制
上一篇把一个 IPv4 地址块划分成多个子网解决的是“目的地址属于哪个网络”的问题。路由器知道该往哪个方向转发后还需要读懂正在转发的 IP 数据报它有多长能否通过下一段链路已经经过了多少跳以及首部是否在传输中出错。这一篇仍位于 TCP/IP 五层模型的网络层聚焦 IPv4 数据报的首部。重点不是死记每一个字段的位置而是理解三个很实际的问题数据报为什么不会在路由环路中无限转发遇到链路 MTU 不足时为什么会分片路由器为什么要反复计算首部校验和。一、IPv4 数据报由什么组成IPv4 数据报由两部分组成首部携带转发和处理所需的控制信息数据部分承载上层交下来的内容例如 TCP 报文段、UDP 用户数据报或 ICMP 报文。IPv4 首部有 20 字节的固定部分还可以带可选字段因此首部总长度为 20 到 60 字节。实际网络中大多数 IPv4 数据报使用 20 字节的固定首部可选字段会增加每台路由器的处理开销所以很少使用。可以把它粗略看成一张随数据一起旅行的“转运单”源地址和目的地址说明从哪里来、往哪里去总长度说明这件“包裹”有多大TTL 防止它绕圈分片字段帮助把过大的包裹拆开首部校验和检查转运单本身有没有损坏。二、首部中最值得掌握的字段IPv4 的首部字段很多但它们可以按用途理解。字段长度与单位作用版本4 位指明使用的 IP 版本IPv4 的值为 4首部长度4 位以 4 字节为单位告诉接收方首部在哪里结束、数据从哪里开始常见值为 5表示 20 字节区分服务8 位可用于表达服务质量或拥塞通知等处理需求总长度16 位单位为字节首部与数据部分的总长度最大可表示 65535 字节标识、标志、片偏移16 位、3 位、13 位三者配合实现分片与重组TTL8 位限制数据报可经历的转发跳数协议8 位指示数据部分交给哪个上层协议处理例如 TCP、UDP、ICMP首部校验和16 位只检验 IPv4 首部是否出错源地址、目的地址各 32 位标识发送接口和目标接口的 IPv4 地址首部长度、总长度与数据长度这三个长度概念最容易混淆数据长度 总长度 - 首部长度首部长度以 4 字节为单位是因为 IPv4 首部按 32 位边界组织。若存在可选字段可能需要用全 0 填充使整个首部长度仍是 4 字节的整数倍。总长度则以字节为单位包含首部和数据。若一个数据报的固定首部为 20 字节、总长度为 1500 字节那么它的数据部分长度是 1480 字节。协议字段不是“本次传输使用的网络协议”协议字段回答的是**IP 的数据部分应该交给谁处理。**例如值对应 TCP 时目的主机的 IP 层会把数据部分交给 TCP对应 UDP 时交给 UDPICMP 报文也直接封装在 IP 数据报中。因此IP 数据报的数据部分不一定是 TCP 或 UDP 数据。路由器和主机为网络诊断、路由控制等产生的某些网络层报文同样可以由 IP 承载。三、TTL数据报为什么不会永远绕圈网络中可能出现临时的错误路由或路由环路。若没有限制一个数据报就可能在几个路由器之间反复转发占用链路和队列资源。TTL 是 Time To Live 的缩写位于 IPv4 首部中占 8 位。现代网络中可将它直观理解为“允许继续转发的跳数预算”源主机发送数据报时设置一个初始 TTL每台路由器在转发前将 TTL 减 1若减完变为 0路由器丢弃该数据报并通常向源端发送 ICMP 超时报告。例如初始 TTL 为 3第一台路由器把它改为 2 并转发第二台改为 1 并转发第三台减为 0 后丢弃。因此它最多能被成功转发两次不能无限经过路由器。这也是traceroute或tracert能逐跳探测路径的基础工具有意发送 TTL 很小的数据报让不同距离的路由器依次返回超时信息。四、MTU 不够时IPv4 为什么需要分片不同数据链路层技术对一帧中能承载的 IP 数据报大小有上限这个上限叫MTU即最大传送单元。常见以太网 MTU 为 1500 字节表示封装进一个以太网帧的数据部分最多装下 1500 字节的 IP 数据报。若一个 IPv4 数据报总长度超过下一跳链路的 MTU就无法直接封装成该链路的帧。IPv4 可以把原数据报拆成多个较小的分片分别发送每个分片都是独立的 IPv4 数据报都有自己的首部。目的主机收到所有分片后再按首部信息重组出原始数据。分片由哪三个字段配合标志字段的长度为3个比特各比特含义如下最低位More Fragment, MF表示本分片后面是否还有分片。MF1表示本分片后面还有分片MF0表示本分片后面没有分片。中间位Don’t Fragment, DF表示是否允许分片。DF1表示不允许分片DF0表示允许分片。最高位为保留位必须设置0。| 字段 | 作用 || -------------- | ------------------------------------------------------------ || 标识 | 同一原始数据报产生的所有分片使用相同标识便于目的主机归类 || 标志中的 DF 位 | DF 为 1 表示不允许分片若包太大路由器丢弃它并反馈错误信息 || 标志中的 MF 位 | MF 为 1 表示后面还有分片最后一片的 MF 为 0 || 片偏移 | 指出本分片数据部分在原始数据部分中的相对位置单位是 8 字节 |标志字段还有一个保留位必须为 0。片偏移以 8 字节为单位所以除最后一个分片外每个分片的数据部分长度必须是 8 字节的整数倍这不是随意切分而是首部字段表达能力带来的约束。一个完整的分片计算例子设原数据报使用 20 字节固定首部总长度为 3820 字节因此原数据部分为3820 - 20 3800 字节下一跳 MTU 为 1420 字节。每个分片还要带 20 字节首部所以一个“尽可能大”的非末片最多放 1400 字节数据1400 恰好是 8 的倍数。每个非末片最大数据长度 1420 - 20 1400 字节于是可分成三片分片数据部分长度总长度片偏移MF第 1 片1400 字节1420 字节01第 2 片1400 字节1420 字节1751第 3 片1000 字节1020 字节3500第二片从原数据的第 1400 字节开始片偏移为 1400 除以 8即 175第三片从第 2800 字节开始片偏移为 350。三片的标识字段相同接收端据此、结合片偏移和 MF 位才能知道怎样还原原来的 3800 字节数据部分。注意IP 分片不会让原始数据变多但会因为每个分片都要带独立 IP 首部所以传输的总字节数会增加。分片并不是没有代价任意一个分片丢失目的主机就无法完成原数据报的重组最终往往需要依赖上层协议重传。多个分片也会重复携带 IPv4 首部增加开销。因此工程上通常通过路径 MTU 发现、发送端控制报文大小等方式尽量避免中途分片。五、首部校验和为什么路由器每跳都要重算首部校验和占 16 位只覆盖 IPv4 首部不覆盖数据部分。它的作用是检查路由器据以转发的数据是否可靠例如版本、首部长度、总长度、TTL、协议以及源和目的地址等首部信息是否出现差错。计算时把首部按 16 位分组相加采用“溢出回卷”的一补码加法再对结果取反。验证时接收方以同样规则把各 16 位字段和校验和相加若结果正确应得到全 1。路由器每转发一次都会修改 TTL。因为 TTL 属于首部原来的校验和立刻失效路由器必须更新校验和后再发送。发生分片时每个分片的总长度、标志和片偏移等字段也不同也各自需要校验和。需要区分两件事**首部校验和只验证首部。**它不保证业务数据没有出错**链路层和传输层还可能提供各自的差错检测。**例如以太网帧有 FCSTCP/UDP 有覆盖报文内容的校验和。它们覆盖范围和职责不同不是简单重复。普通路由转发过程中源地址和目的地址通常保持不变TTL 才是每一跳必然变化的字段。NAT 等特殊设备可能改写地址但那是额外的地址转换行为不能当作普通路由器转发的常规步骤。首部检验和的计算方法与 UDP 和TCP 的检验和的计算方法相同。跟TCP、UDP的不同是只是”首部”的校验不管数据部分。不需要加伪首部这也解释了我们为什么要用一个填充字段把首部变成4B的整数倍数据部分是在上层检验的六、把一次转发过程串起来当路由器收到一个以太网帧时会先处理链路层帧再查看其中的 IPv4 数据报检查 IPv4 首部的版本、首部长度和校验和是否合理根据目的地址查询转发表确定出接口或下一跳TTL 减 1若到 0 则丢弃并报告超时若下一跳 MTU 不足且允许分片则生成符合 MTU 的分片若 DF 禁止分片则丢弃并报告更新每个待发送数据报的首部校验和重新封装为下一跳链路的帧并发送。这也解释了前面“路由器工作原理”一文中的一个细节路由器不会原封不动地转发旧的二层帧但 IP 数据报通常会继续向目的地前进途中 TTL、校验和以及必要时的分片字段可能发生变化。七、常见误区误区更准确的理解TTL 表示精确的秒数现代网络中它主要按路由器转发跳数递减TTL 为 3 的数据报能成功通过 3 台路由器第 3 台把 TTL 减到 0 后会丢弃它最多被成功转发 2 次MTU 是 IPv4 数据部分的最大长度MTU 限制的是可装入链路层帧的整个 IP 数据报即首部加数据所有分片的数据长度都必须是 8 的倍数最后一个分片可以不是非末片必须满足分片后只需要第一个分片带首部每个分片都是独立 IP 数据报都有自己的首部首部校验和校验整个数据报IPv4 首部校验和只校验首部数据部分由其他层的机制负责保护普通路由器每跳都会改写源、目的 IP 地址普通转发通常只改 TTL 等字段改写地址属于 NAT 等特殊处理八、总结IPv4 首部让数据报具备跨网络转发所需的基本信息。TTL 为每个数据报设置了跳数上限避免它因路由环路永久存在MTU 限制决定过长数据报是否需要分片标识、标志和片偏移让目的主机能够重组首部校验和则保护路由决策依赖的首部信息并因 TTL 的变化而需要逐跳更新。理解地址、子网和数据报首部后就能进一步回答一个很常见的问题多台内网主机为什么能共用一个公网地址访问互联网下一篇将从 NAT 的地址与端口转换机制展开。如果这篇文章对你有帮助欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价