互联网协议 — IPv4 — 报文格式

本文详细介绍了IPv4报文的格式,包括IPv4 Header的各字段详解,如版本号、头部长度、TOS、总长度等。同时,探讨了IP报文的分片和重组机制,涉及IP MTU、IP Fragment和Reassembly的过程。此外,还讨论了Path MTU Discovery技术,用于避免分片和提升传输效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

IPv4 报文的格式

IPv4 Header

  • Version(版本号)(4bits):值的 4,表示 IPv4。

  • Header Length(IPv4 Header 的长度)(4bits):IPv4 Header 不是固定长度的,存在一些可选字段。

    • 最小值为 5:代表头部长度为 20Bytes(5×4)。如果没有可选字段,那么它的值就是 5。
    • 最大值为 15(2^4-1):代表头部长度为 60Bytes(15×4)。
  • TOS(Type of Service,IPv4 承载的上层业务类型)(8bits):用于 QoS 场景。

    • TOC 模式:前 3bit 用于标识优先级(Precedence),4-7bit 分别同于标识时延、吞吐量、可靠性、开销(一个数据包只能有一位生效),最后 1bit 备用。
### IPv4 报文结构 IPv4 数据报由两个主要部分组成:IP 首部和数据。IP 首部的固定部分长度为20字节,后面可以跟随可选字段,这些字段的总长度是变化的[^4]。 #### IP 首部字段解释: - **版本 (Version)**: 4位,指明使用的IP协议版本号,在这里是4。 - **首部长度 (IHL, Internet Header Length)**: 4位,指示该IP头有多长,单位是最小32比特边界。 - **区分服务 (DSCP, Differentiated Services Code Point)** 和 **ECN (Explicit Congestion Notification)**: 合并占用8位,用于QoS标记和服务质量控制。 - **总长度**: 16位,表示整个IP数据报(包括头部和负载)的大小,以字节数计算。 - **标识符 (Identification)**: 16位,用来唯一识别主机发出的数据包片段。 - **标志 (Flags)**: 3位,主要用于防止分片或指导如何处理分片。 - **偏移量 (Fragment Offset)**: 13位,指出本分片在其原始未分割数据报中的位置。 - **生存期 (TTL, Time to Live)**: 8位,定义了数据报在网络中能够经过的最大路由器数。 - **协议 (Protocol)**: 8位,指定上层协议类型,比如TCP(6), UDP(17)等。 - **头部校验和 (Header Checksum)**: 16位,确保IP头部信息无误。 - **源地址 (Source Address)**: 32位,记录发送者的IP地址。 - **目的地址 (Destination Address)**: 32位,记录接收者的IP地址。 - **选项 (Options)**: 可变长度,提供额外的功能配置。 ### 数据传输流程 当应用程序准备通过网络发送数据时,会经历如下过程: 1. 应用程序产生的消息被传递给传输层,如TCP或者UDP,根据所选用的不同协议来创建相应的段(segment),附加必要的控制信息作为段头。 2. 接下来,这个带有段头的消息会被交给互联网层(IPv4),在这里它将被打包成一个完整的IP数据报,并加上上述提到的各种IP首部字段。 3. 如果数据过大无法一次性传送,则会在运输之前先进行分片操作;每一片都会有自己的IP首部以便独立路由到达目的地后再重新组装回原样[^2]。 4. 完整构建好的IP数据报随后进入链路层,此时MAC地址等相关信息也会加入到帧(Frame)里去形成最终要发出去的形式。 5. 帧经物理介质传送到下一个节点——这可能是一个中间设备像交换机或者是直接抵达目标机器上的NIC(Network Interface Card)卡处接受解析。 6. 到达终点后,各层次依次剥离对应的头部直至把原始应用级的信息呈现出来供终端用户使用。 ```python def send_data(data): transport_layer_segment = create_transport_layer_segment(data) ip_datagram = encapsulate_with_ip_header(transport_layer_segment) if datagram_too_large(ip_datagram): fragments = fragment_datagram(ip_datagram) for fragment in fragments: frame = add_mac_headers(fragment) transmit(frame) else: frame = add_mac_headers(ip_datagram) transmit(frame) def receive_data(received_frame): received_ip_packet = strip_mac_headers(received_frame) reassembled_message = reassemble_if_fragmented(received_ip_packet) original_data = remove_ip_and_transport_headers(reassembled_message) deliver_to_application(original_data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值