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

本文深入解析了IPv4和IPv6报文的结构,对比了两者的版本、头部长度、服务类型、总长度等关键字段,并详细介绍了IPv6新增的流量类别、流标签、净荷长度等特性,以及IPv6的扩展头部如逐跳选项、目标选项、路由扩展头等。

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

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报文格式对比及主要区别 #### IPv4 报文结构 IPv4 数据包由首部数据两部分组成。首部通常为20字节,当存在选项字段时可能会更长。IPv4 首部包含多个字段来描述路由信息其他控制参数[^2]。 - **版本**:占4位,表示IP协议的版本号。 - **头长度 (IHL)**:占4位,指出整个头部的大小。 - **服务类型 (TOS)**:8位,定义优先级服务质量。 - **总长度**:16位,指明整个数据包(包括头部负载)的总长度。 - **标识符、标志、片偏移**:共同作用于分段重组过程。 - **生存时间 (TTL)**:每经过一个路由器减去1;如果变为零,则丢弃该数据包并发送ICMP消息给源主机。 - **协议**:指示上层使用的传输层协议,如TCP或UDP。 - **校验**:用来检测错误。 - **源地址** **目的地址**:各占用32比特的空间。 #### IPv6 报文结构 相比IPv4, IPv6 的设计更加简洁高效。其固定长度的基本头部仅有40字节,并且取消了一些不必要的字段以减少处理开销[^1]。 - **版本**:同样用4位表示,对于IPv6始终设置为6。 - **流量类别**:取代了IPv4中的ToS/Traffic Class字段,用于QoS标记。 - **流标签**:新增加的一个特性,允许特定应用的数据流被识别而不必依赖复杂的过滤器规则[^3]。 - **有效载荷长度**:代替了IPv4里的总长度字段,仅计算除基本头部之外的有效负荷。 - **下一个头**:类似于IPv4的协议字段,但它可以指向另一个扩展头部而非直接指定高层协议。 - **跳限数(Hop Limit)** :相当于IPv4 TTL的功能。 - **源地址** 及 **目标地址**:均为128位宽,极大地增加了可用地址的数量。 #### 主要差异总结 - **地址空间**: IPv6采用128位地址方案,远超IPv4所提供的32位地址范围,解决了日益严重的地址资源枯竭问题。 - **安全性增强**: IPv6内置支持IPsec加密技术,通过AH(认证头)[^4]等机制提高了网络通信的安全水平。 - **简化转发路径选择算法**: 流量分类变得更为简单直观,因为不再需要基于五元组匹配来进行细粒度区分。 - **自动配置能力加强**: 支持无状态地址自动生成等功能,使得设备更容易接入互联网环境。 ```python # Python伪代码展示如何解析简单的IPv4IPv6报文头部 def parse_ipv4_header(packet_bytes): version_ihl = packet_bytes[0] version = (version_ihl >> 4) & 0xF ihl = version_ihl & 0xF total_length = int.from_bytes(packet_bytes[2:4], byteorder='big') ttl = packet_bytes[8] protocol = packet_bytes[9] src_ip = '.'.join(map(str, list(packet_bytes[12:16]))) dst_ip = '.'.join(map(str, list(packet_bytes[16:20]))) return { 'Version': version, 'Header Length': ihl * 4, 'Total Length': total_length, 'Time To Live': ttl, 'Protocol': protocol, 'Source IP': src_ip, 'Destination IP': dst_ip } def parse_ipv6_header(packet_bytes): version_traffic_class_flow_label = int.from_bytes(packet_bytes[:4], byteorder='big') payload_length = int.from_bytes(packet_bytes[4:6], byteorder='big') next_header = packet_bytes[6] hop_limit = packet_bytes[7] src_addr = ':'.join(['{:02x}{:02x}'.format(x,y) for x,y in zip(packet_bytes[8:24][::2],packet_bytes[9:25][::2])]) dst_addr = ':'.join(['{:02x}{:02x}'.format(x,y) for x,y in zip(packet_bytes[24:40][::2],packet_bytes[25:41][::2])]) return { 'Version': (version_traffic_class_flow_label >> 28), 'Traffic Class': ((version_traffic_class_flow_label >> 20) & 0xFF), 'Flow Label': (version_traffic_class_flow_label & 0xFFFFF), 'Payload Length': payload_length, 'Next Header': next_header, 'Hop Limit': hop_limit, 'Source Address': src_addr, 'Destination Address': dst_addr } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值