IPv4和IPv6报文格式介绍和对比

IPv4数据报

IPv4数据报格式

IPv4报文详解

  • 版本Version:Version域记录了数据报属于哪一个版本的协议。不同版本的报文的格式都是不同的。这里的值永远是4。
  • 头部长度IHL:IHL域指明了该头部有多长(以32位字的长度为单位)。IHL的最短长度为5,此时头部没有加入可选项;最大值为15,限制了头部的最大长度为60字节,那么意味着可选项部分最多为40字节。
  • 服务类型TOS:这6位组合起来表示服务类型。这些类别包括4个排队优先级、3种丢弃可能性和一些历史类别。
  • 总长度Total Length:表示包括报头和数据在内的报文的总长度,以字节为单位。因此IP数据报的最大长度为65535字节,但是由于MTU的限制,长度超出MTU的数据报都将被分片传输,所以实际传输的数据报长度都远远没达到最大长度。
  • 标识Identification:主机每发出一个数据报,那么生成唯一一个值,此数据报的分片
    都将复制这个标识值,这样目标主机就可以将分片组合起来接受一个完整的数据报。
  • 保留位:不用多说。
  • DF(Don’t Fragment):假如这个位设置了值,那么分片将会被禁止,那么假如报文长度超出了MTU,IP模块将此报文将丢弃,并返回ICMP差错报文。
  • MF(More Fragment):除了最后一个分段之外,其他的分片都要将这个位置置为1。它的意义在于,接收方可以通过这个值来判断什么时候已经将所有分片都接收了。
  • 分段偏移Fragment Offset:该域指明了本分段在报文的什么位置。除了一个数据报的最后一个分段之外,其他的分段都必须是8字节的倍数,这里的8字节是基本的分段单位。由于该域有13位,所以每个数据报最多有8192个分段,65536字节,比TotalLength域还要大1。
  • 生命周期TTL:数据报达到目的地之前与需经过的最大跳数。数据报在传输过程中,每经过一个路由器,这个值就减1,当此值变为0时,路由器将数据包丢弃并返回源主机ICMP差错报文。TTL可以有效防止数据包长时间逗留在网络中陷入路由器循环。
  • 协议Protocol:网络层组装成一个完整的数据报之后,需要知道如何对它进行处理,此字段指明了将数据报交给哪个处理进程,1交给ICMP,6交给TCP,17交给UDP。
  • 头部校验和Header Checksum:只校验头部,一般使用CRC算法,来确保报文在传播过程中没有损坏。
  • 源地址和目标地址
  • 选项:可选项包括一些安全相关的信息和路径设置等内容,如下图所示:一些IP选项

IPv6数据报

IPv6数据报格式

IPv6报文详解

  • 版本Version:和IPv4中的作用相同,对于IPv6报文来说,这里永远是6。
  • 流量类别Traffic Class:类似于IPv4中的ToS(服务类型)字段,通信分类字段用来标识对应IPv6的通信流类别,或者说是优先级别。
  • 流标签Flow Label:IPv6数据报中新增的一个字段,占20位。通过该域,源端和目标端可以建立一个具有特殊属性和需求的伪连接。举个栗子,源端和目的端之间的传输有严格的延迟要求,需要预留带宽。这时候就可以提前建立一个流Flow,当一个Flow Label域非0的分组出现的时候,路由器检查内部表,根据已经记录的Flow Label值来确定给予它什么样的特殊待遇。这个的意义在于,保证了数据报子网的灵活性和质量。另外,每个流是通过源地址、目的地址和流编号来指定的,所以一对给定的IP之间可以有很多活动的流标签。
  • 净荷长度Payload Length:指明了跟在头部之后还有多少字节,类似于IPv4中的Total Length,区别在于,Total Length还包括了报头部分。
  • 下一个头Next Header:IPv6灵活性的体现,这里引入了扩展头,该域指明了当前头部之后还有扩展头的话,是哪一种头部(6种),如果当前头部是最后一个,那么这个域指明该分组该给哪一个传输协议处理器,类似于IPv4的Protocol域。
  • 跳数限制Hop Limit:和IPv4中的TTL相同,这里直接表明限制跳数。
  • 源地址和目的地址。
  • 扩展头部:有些省略掉的IPv4头部有时候还会有用,所以IPv6引入了扩展头部(extension header)的概念。这些头部有时可以提供一些额外的信息,但是它的编码方式更加高效。现在已经定义了6种扩展头。IPv6扩展报头附加在IPv6报头目的IP地址字段后面,如果有多个扩展头出现的话,最好要用表中的顺序列出:扩展头部选项

扩展头部详解

  • 逐跳选项头部(Hop-by-hop Options Header):本扩展报头类型值为0(在IPv6报头下一个头部字段中定义,下同)。此扩展报头须被转发路径所有节点处理。目前在路由告警(RSVP和MLDv1)与Jumbo帧处理中使用了逐跳选项头,因为路由告警需要通知到转发路径中所有结点,而Jumbo帧是长度超过65535字节的报文,传输这种报文需要转发路径中所有结点都能正常处理。

  • 目标选项头部(Destination Options Header):类型值为60,加入这一可选头部最初其实是为了“充数”,利用这个项可以将一个头部拉长到8字节的倍数。现在移动IPv6中使用了目的选项头,称为家乡地址选项。家乡地址选项由目的选项头携带,用以移动结点离开“家乡”后通知接受节点此移动结点对应的家乡地址。接受节点收到带有家乡地址选项的报文后,会把家乡地址选项中的源地址(移动节点的家乡地址)和报文中源地址(移动节点的转交地址)交换,这样上层协议始终认为是在和移动节点的家乡地址通信,实现了移动漫游功能。

  • 路由扩展头部(Routing Header):类型值为43,列出了在通向目标的途中需要经过的一台或者多台路由器,类似于IPv4中可选项的Loose source routing字段。

  • 分段扩展头(Fragment extension header):类型值为44,类似于IPv4中分段控制相关的字段,当源节点发送的报文超过传输链路MTU(源节点和目的节点之间传输路径的MTU)时,需要对报文进行分段时使用。与IPv4不同的是,IPv6只有源主机才能对数据报进行分段。

  • 认证扩展头部(Authentication header):类型值为51,用于IPSec,提供报文验证,完整性检查。它提供了一种“让分组的接收方确定分组返送方身份”的机制,只有真正的接收方才能完整读取分组内容。

  • 加密的安全负荷头:本扩展头类型值为50,用于IPSec,提供报文验证、完整性检查差和加密。

IPv4和IPv6报文详细对比

下面对两者的报文做一个充分、详尽的对比:

  • 整体对比:整体对比
    IPv4中的主要字段都已经被IPv6继承了,而删去的字段都以可选扩展头部的形式出现在IPv6报文里。
  • TOS和Traffic ClassTOS和Traffic Class
    两者功能几乎一致,标识对应的通信流类别,或者说是优先级别。
  • Total Length和Payload LengthTotal Length和Payload Length
    这两者是有区别的:IPv4中的Total Length包括了头部和数据:Total Length而IPv6中的Payload Length只是包括了除去默认头部之外的字段长度:Payload Length
  • MTU:MTU的不同在这里插入图片描述
  • Protocol和Next HeaderProtocol和Next Header
    IPv4的协议字段规定了数据报应该交由哪种协议来处理,类似的,IPv6中的Next Header字段可选择性的指向下一个扩展头部,或者协议:NextHeader
  • TTL和Hop Limit在这里插入图片描述
    最初的IPv4的TTL协议规定的是分段传输的最大时间,但实际上,所有的操作都用跳数来取代了时间,鉴于此,IPv6直白的使用Hop Limit来限定传输时间。当然两者功能相同,都有效的组织了数据分段在网络停留太久时间陷入无限循环。
  • 头部校检和:IPv6放弃了IPv4中的CheckSum字段,因为TCP和UDP报文中都已经有16位的checksum字段。校检和checksum
    以上就是IPv4和IPv6报文格式的详细对比。
### IPv4IPv6报文结构及字段详解 #### 1. IPv4 报文结构 IPv4 数据报由固定部分可变选项部分组成。其基本格式如下: | 字段名称 | 长度 (位) | 描述 | |------------------|-----------|----------------------------------------------------------------------| | 版本 | 4 | 表明协议版本号,对于 IPv4 始终为 4[^2]。 | | 头部长度 (IHL) | 4 | 指定头部的长度,单位为 32 位字,最小值为 5(即 20 字节)。 | | 差分服务字段 | 8 | 曾称为 TOS,用于 QoS 控制。 | | 总长度 | 16 | 整个数据报的总长度,包括头部数据部分,单位为字节。 | | 标识符 | 16 | 用于唯一标识主机发送的数据报。 | | 标志 | 3 | 控制分片行为,通常用来防止进一步分片。 | | 分片偏移量 | 13 | 如果发生分片,则表示该片段相对于原始数据报的位置。 | | 生存时间 (TTL) | 8 | 定义数据报在网络中的最大跳数,每经过一个路由器减 1,直到变为 0 则丢弃。 | | 协议 | 8 | 指定上层协议类型,如 TCP 或 UDP。 | | 首部校验 | 16 | 对整个首部进行错误检测。 | | 源地址 | 32 | 发送方的 IP 地址。 | | 目标地址 | 32 | 接收方的 IP 地址。 | IPv4 的主要特点是头部较复杂,包含许多固定的字段以及可选字段。 --- #### 2. IPv6 报文结构 IPv6 设计的目标之一是简化头部结构并提升性能。以下是 IPv6 报文的基本格式: | 字段名称 | 长度 (位) | 描述 | |------------------|-----------|----------------------------------------------------------------------| | 版本 | 4 | 表明协议版本号,对于 IPv6 始终为 6。 | | 流类别 | 8 | 类似于 IPv4 中的差分服务字段,用于流量分类。 | | 流标签 | 20 | 可用于标记特定流,便于中间节点优化处理。 | | 载荷长度 | 16 | 不包括基础头部在内的有效载荷长度,单位为字节。 | | 下一头部 | 8 | 指向下一个头部类型,类似于 IPv4 的协议字段。 | | 跳数限制 | 8 | 功能类似于 TTL,控制数据报的最大跳数。 | | 源地址 | 128 | 发送方的 IPv6 地址。 | | 目标地址 | 128 | 接收方的 IPv6 地址。 | 相比 IPv4IPv6 删除了一些冗余字段并将某些功能转移到扩展头部中,从而减少了固定头部的大小到仅 40 字节[^4]。 --- #### 3. 扩展头部 IPv6 支持多种类型的扩展头部,这些头部按顺序附加在基础头部之后。常见的扩展头部包括但不限于以下几种: - **逐跳选项头部**: 影响路径上的每一个节点的行为。 - **路由头部**: 提供显式的源路由机制。 - **分段头部**: 实现分片操作。 - **认证头部 (AH)** **封装安全净荷 (ESP)**: 提供安全性支持。 通过这种模块化设计,IPv6 能够灵活适应不同的应用场景需求。 --- #### 4. IPv4IPv6 报文对比总结 | 属性 | IPv4 | IPv6 | |-------------------|------------------------------------|------------------------------------| | 固定头部长度 | 20 字节 | 40 字节 | | 地址空间大小 | 32 位 (约 43 亿个地址)[^3] | 128 位 (几乎无限多)[^3] | | 首部校验 | 存在 | 移除 | | 自动配置能力 | 较弱 | 强大 | | 安全特性 | 需要额外协议实现 | 内置 IPSec | | 扩展性 | 使用选项字段 | 使用扩展头部 | 上述差异使得 IPv6 更加适合现代互联网的需求,在地址耗尽、移动性安全性等方面具有显著优势[^3]。 ```python # 示例 Python 程序展示如何解析简单的 IPv4/IPv6 数据包头 import struct def parse_ipv4_header(packet): version_ihl, tos, total_length, identification, flags_offset, ttl, protocol, checksum, src_ip, dst_ip = \ struct.unpack('!BBHHHBBHII', packet[:20]) ihl = version_ihl & 0xF header_len = ihl * 4 return { 'version': version_ihl >> 4, 'header_length': header_len, 'tos': tos, 'total_length': total_length, 'identification': identification, 'flags_offset': flags_offset, 'ttl': ttl, 'protocol': protocol, 'checksum': checksum, 'src_ip': socket.inet_ntoa(struct.pack('!I', src_ip)), 'dst_ip': socket.inet_ntoa(struct.pack('!I', dst_ip)) } def parse_ipv6_header(packet): ver_tc_flow, payload_length, next_header, hop_limit, src_addr, dst_addr = \ struct.unpack('!IHBB16s16s', packet[:40]) return { 'version': ver_tc_flow >> 28, 'traffic_class': (ver_tc_flow >> 20) & 0xFF, 'flow_label': ver_tc_flow & 0xFFFFF, 'payload_length': payload_length, 'next_header': next_header, 'hop_limit': hop_limit, 'src_address': socket.inet_ntop(socket.AF_INET6, src_addr), 'dst_address': socket.inet_ntop(socket.AF_INET6, dst_addr) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值