IPv4 和 IPv6 数据报格式详解
IPv4 报文头格式及各字段功能IPv4 报头格式各字段功能:1、版本号(Version):长度 4 bit 。标识目前采用的 IP 协议的版本号。一般的值为 0100(IPv4),0110(IPv6)版本号版本RFC 文档0保留1~3未分配4Internet 协议版本 4(IPv4)RFC7915ST 数据报(Datagram)RFC11906简单 Internet..
IPv4 报文头格式及各字段功能
IPv4 报头格式
各字段功能:
1、版本号(Version):长度 4 bit 。标识目前采用的 IP 协议的版本号。一般的值为 0100(IPv4),0110(IPv6)
版本号 | 版本 | RFC 文档 |
0 | 保留 | |
1~3 | 未分配 | |
4 | Internet 协议版本 4(IPv4) | RFC791 |
5 | ST 数据报(Datagram) | RFC1190 |
6 | 简单 Internet 协议(SIP) | |
6 | IPv6 | RFC1883 |
7 | TP / IX | RFC1475 |
8 | P Internet 协议(PIP) | RFC1621 |
9 | 使用更大地址的 TCP 和 UDP(TUBA) | RFC1347 |
10~14 | 未分配 | |
15 | 保留 |
2、IP 报头长度(Header Length):长度 4 bit 。这个字段的作用是为了描述 IP 报头的长度,因为在 IP 报头中有变长的可选部分。该部分占 4 个 bit,长度单位为 4 个字节,即本区域值 = IP 头部长度(单位为字节)/ 长度单位(4 个字节)。因此,一个 IP 报头的长度最长为 “ 1111 ”,即 15 x 4 个字节 = 60 个字节。IP 报头最小长度为 20 字节。
Header Length | Header Length 所代表的实际的 IP 报头长度 |
0101 | 20 字节 |
0110 | 24 字节 |
0111 | 28 字节 |
… | … |
1101 | 52 字节 |
1110 | 56 字节 |
1111 | 60 字节 |
3、服务类型(Type of Service):长度 8 bit 。8 位按位被如下定义:PPP DTRC0(更多详细信息可以参见 RFC1340 和 RFC1349)
- PPP:前 3 位,定义包的优先级,取值越大数据越重要
- 000 普通(Routine)
- 001 优先的(Priority)
- 010 立即的发送(Immediate)
- 011 闪电式的(Flash)
- 100 比闪电还闪电式的(Flash Override)
- 101 CRI / TIC / ECP(找不到这个词的翻译)
- 110 网间控制(Internetwork Control)
- 111 网络控制(Network Control)
- DTRCO:后 5 位
- D 时延:0:普通,1:延迟尽量小
- T 吞吐量:0:普通,1:流量尽量大
- R 可靠性:0:普通,1:可靠性尽量大
- M 传输成本:0:普通,1:成本尽量小
- 0 最后一位被保留,恒定为 0
4、IP 包总长度(Total Length):长度 16 bit 。以字节为单位计算的 IP 包的长度(包括头部和数据),所以 IP 包最大长度 65 535 字节。所以,数据包有效载荷的大小 = IP 包总长度(Total Length)- IP 报头长度(Header Length)。
5、标识符(Identifier):长度 16 bit 。该字段和 Flags 和 Fragment Offest 字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
6、标记(Flags):长度 3 bit 。
- 该字段第一位不使用。
- 第二位是 DF(Don’t Fragment)位,DF 位设为 1 时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。
- 第三位是 MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的 IP 包的报头中将 MF 位设为 1 。
IPv4 报头格式(中文解释)
7、片偏移(Fragment Offset):长度 13 bit,以 8 个八位组为单位。表示该 IP 包在该组分片包中位置,接收端靠此来组装还原 IP 包。
8、生存时间(TTL):长度 8 bit,设计之初是以秒(s)为单位的,但实际以跳数为单位,建议的缺省值为 64 。当 IP 包进行传送时,先会对该字段赋予某个特定的值。当 IP 包经过每一个沿途的路由器的时候,每个沿途的路由器会将 IP 包的 TTL 值减少 1 。如果 TTL 减少为 0,则该 IP 包会被丢弃。这个字段可以防止由于路由环路而导致 IP 包在网络中不停被转发。
9、协议(Protocol):长度 8 bit 。标识了上层所使用的协议。以下是比较常用的协议号:1 ICMP;2 IGMP;6 TCP;17 UDP;88 IGRP;89 OSPF 。(更多协议号请点击这里:IP协议号汇总)
10、头部校验(Header Checksum):长度 16 bit 。用来做 IP 头部的正确性检测,但不包含数据部分。 因为每个路由器要改变 TTL 的值,所以路由器会为每个通过的数据包重新计算这个值(RFC1141 讨论了一些简化计算的策略)。
11、起源和目标地址(Source and Destination Addresses):这两个地址都是 32 bit 。标识了这个 IP 包的起源和目标地址。要注意除非使用 NAT,否则整个传输的过程中,这两个地址不会改变。
12、可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
- 松散源路由(Loose source routing):给出一连串路由器接口的 IP 地址。IP 包必须沿着这些 IP 地址传送,但是允许在相继的两个 IP 地址之间跳过多个路由器。
- 严格源路由(Strict source routing):给出一连串路由器接口的 IP 地址。IP 包必须沿着这些 IP 地址传送,如果下一跳不在 IP 地址表中则表示发生错误。
- 路由记录(Record route):当 IP 包离开每个路由器的时候记录路由器的出站接口的 IP 地址。
- 时间戳(Timestamps):当 IP 包离开每个路由器的时候记录时间。
- 填充(Padding):因为 IP 报头长度(Header Length)部分的单位为 32 bit,所以 IP 报头的长度必须为 32 bit 的整数倍。因此,在可选项后面,IP 协议会填充若干个 0,以达到 32 bit 的整数倍。
IPv6 报文头格式及各字段功能
各字段功能:
IPv6 报头格式
1、版本(Version):4 bit,值为 6(二进制值为 0110)表示 IPv6 报文。
2、流量类别(Traffic Class):8 bit,这相当于 IPv4 协议中的 ToS 字段。但是,考虑到 ToS 字段这些年的发展,现在都用来做区分服务等级(Differentiated Class of Service,DiffServ)了。所以,即使这个字段和旧的 ToS 字段有些相似,它们的名字要比所传送的值更能确切地反映目前的用处。
3、流标签(Flow Label):20 bit,IPv6 中新增。流标签可用来标记特定流的报文,以便在网络层区分不同的报文。转发路径上的路由器可以根据流标签来区分流并进行处理。由于流标签在 IPv6 报文头中携带,转发路由器可以不必根据报文内容来识别不同的流,目的节点也同样可以根据流标签识别流,同时由于流标签在报文头中,因此使用 IPSec 后仍然可以根据流标签进行 QoS 处理。
4、有效载荷长度(Payload Length):16 bit,以字节为单位的 IPv6 载荷长度,也就是 IPv6 报文基本头以后部分的长度(包括所有扩展头部分)。IPv4 的总长度字段是 16 位的,但 IPv6 的有效载荷长度字段却是 20 位,这就意味着该字段能够指定更长的有效载荷(1 048 575 字节,相对 IPv4 中只有 65 535 字节)(本句源自《 TCP / IP 路由技术 》,有误)。
5、下一报头(Next Header):8 bit,用来标识当前头(基本头或扩展头)后下一个头的类型。此域内定义的类型与 IPv4 中的协议域值相同。IPv6 定义的扩展头由基本头或扩展头中的扩展头域链接成一条链。这一机制下处理扩展头更高效,转发路由器只处理必须处理的选项头,提高了转发效率。
6、跳数限制(Hop Limit):8 bit,和 IPv4 中的 TTL 字段类似。每个转发此报文的节点把此域减 1,如果此域值减到 0 则丢弃。注意:IPv4 中的 TTL 设计之初是以秒(s)为单位的,但实际使用时跟 IPv6 中的 Hop Limit 一样,是以跳数为单位。
7、源地址(Source Address):128 bit,报文的源地址。
8、目的地址(Destination Address):128 bit,报文的目的地址。
IPv6 报头格式(中文解释)
IPv6 扩展报头种类:
IPv6 选项字段是通过形成链式结构的扩展头支持的。IPv6 基本头后面可以有 0 到多个扩展头。
IPv6 扩展头排列顺序如下:
- 逐跳可选项报头(Hop-By-Hop Options),值为 0(在 IPv6 基本头中定义)。此选项头被转发路径所有节点处理。目前在路由告警(RSVP 和 MLDv1)与 Jumbo 帧(巨型帧)处理中使用了逐跳选项头。路由告警需要通知到转发路径中所有节点,需要使用逐跳选项头。Jumbo 帧是长度超过 65 535 的报文,传输这种报文需要转发路径中所有节点都能正常处理,因此也需要使用逐跳选项头功能。
- 目的可选项报头(Destination Options),值为 60 。只可能出现在两个位置:路由头前,这时此选项头被目的节点和路由头中指定的节点处理;上层头前(任何 ESP 选项后),此时只能被目的节点处理。Mobile IPv6 中使用了目的选项头。Mobile IPv6 中新增加一种类型的目的选项头(家乡地址选项)。家乡地址选项由目的选项头携带,用于移动节点离开家乡后通知接收节点此移动节点对应的家乡地址。接收节点收到带有家乡地址选项的报文后,会把家乡地址选项中源地址(移动节点的家乡地址)和报文中源地址(移动节点的转交地址)交换,这样上层协议始终认为是在和移动节点的家乡地址在通信,实现了移动漫游功能。
- 路由报头(Routing),值为 43 。用于源路由选项和 Mobile IPv6 。通过列出在到达目的地的路径中数据包所要经过的节点列表来提供源路由选择的功能。
- 分段报头(Fragment),值为 44 。此选项头在源节点发送的报文超过 Path MTU(源和目的之间传输路径的MTU)时对报文分片时使用。在 IPv4 和 IPv6 数据包中有一个重要的不同是,只有发起该数据包的节点能够对数据包进行分段;而 IPv6 路由器对数据包并不分段。因此,发起该数据包的节点要么必须使用路径 MTU 发现(Path MTU Discovery,PMD,具体参见 RFC1191)来得到该数据包到达目的地的路径上最小的 MTU 值,要么就从不发出大于 1280 字节的数据包。IPv6 协议规定运行 IPv6 的所有链路都必须能够支持最小 1280 字节大小的数据包。因此,发起数据包的节点如果可以选择的话,可以利用最小长度大小选项,而不用 PMD 。
- 认证报头(Authentication Header,AH),值为 51 。用于 IPSec,提供报文验证、完整性检查。定义和 IPv4 中相同。
- 封装安全有效载荷报头(Encapsulation Security Payload,ESP),值为 50 。用于 IPSec,提供报文验证、完整性检查和加密。定义和 IPv4 中相同。
- 上层报头,上层协议头,如 TCP / UDP / ICMP 等,目的选项头最多出现两次(一次在路由头前,一次在上层协议头前),其它选项头最多出现一次。但 IPv6 节点必须能够处理选项头(逐跳选项头除外,它固定只能进随基本头之后)的任意出现位置和任意出现次数,以保证互通性。
其他关于 IPv6 扩展报头的解释,可作参考:
报头类型 | Next Header 字段值 | 描述 |
逐跳选项报头 | 0 | 该选项主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段,应用场景:
|
目的选项报头 | 60 | 目的选项报头携带了一些只有目的节点才会处理的信息。目前,目的选项报头主要应用于移动 IPv6 。 |
路由报头 | 43 | 路由报头和 IPv4 的 Loose Source and Record Route 选项类似,该报头能够被 IPv6 源节点用来强制数据包经过特定的路由器。 |
分段报头 | 44 | 同 IPv4 一样,IPv6 报文发送也受到 MTU 的限制。当报文长度超过 MTU 时就需要将报文分段发送,而在 IPv6 中,分段发送使用的是分段报头。 |
认证报头 | 51 | 该报头由 IPSec 使用,提供认证、数据完整性以及重放保护。它还对 IPv6 基本报头中的一些字段进行保护。 |
封装安全净载报头 | 50 | 该报头由 IPSec 使用,提供认证、数据完整性以及重放保护和 IPv6 数据报的保密,类似于认证报头。 |
IPv6 扩展报头规约:
- 扩展报头必须按图 1 排列的顺序出现。
- 除目的选项报头外,每种扩展报头只能出现一次。
- 目的选项报头最多出现两次,一次出现在路由报头之前,一次出现在上层协议数据报文之前;如果没有路由报头,则只能出现一次。
- 基本报头、扩展报头和上层协议数据报文的相互关系如图 2 所示。
图1 IPv6扩展报头出现顺序
图2 IPv6下,基本报头、扩展报头和三层协议数据报文的相互关系
IPv6 扩展报头报文格式:
1、逐跳选项报头:
逐跳选项报头报文格式
- Next Header 表示下一个头的协议类型;
- Hdr Ext Len 表示选项头的长度(不包括 Next Header);
- Options 是一系列选项字段和填充字段的组合。
为了保证选项头的长度为 64 bits 的整数倍(便于 64 位处理)经常需要在 Options 中添加填充段,填充段有两种:
逐跳选项报头填充段
逐跳选项报头中用于巨型载荷(载荷长度超过 65 535 字节)的超大有效载荷选项结构:
逐跳选项报头超大有效载荷选项结构
- 由选项类型(值为 194)、选项长度(Opt Data Len)和超大有效载荷长度(Jumbo Payload Length)三个字段组成;
- 如果有效载荷长度超过 65 535 字节,则 IPv6 基本报头中的有效载荷长度中的值被置 0,数据包的真正有效载荷长度用超大有效载荷长度选项中的超大有效载荷长度字段来表示;
- 超大有效载荷长度字段占有 32 bit,能够表示 4 294 967 295 字节。
2、目的选项报头:
目的选项报头报文格式
- 参数含义与逐跳选项报头相同,目的选项报头包含目的地需要处理的信息;
- 报文的最终目的地和路由头地址列表中的节点都会检查该选项;
- 可出现两次:路由报头之前和上层协议数据报文之前。
3、路由报头:
路由报头报文格式
- 用于指定报文转发必须经过的中间节点;
- Next Header 表示下一个头的协议类型;
- Hdr Ext Len 表示扩展头的长度(不包括 Next Header);
- Routing Type 表示路由报头类型(RFC 定义为 0);
- Segments Left 表示到达最终目的地还需要经过多少个必须的中间节点;
- Type-specific data 根据 Routing Type 的值,给出相应的转发数据。
4、分段报头:
分段报头报文格式
- 当报文超过了 MTU 时就需要将报文分段发送,分段发送通过分段扩展头来完成;
- Next Header 表示下一个报文头;
- Reserved 是保留字段设为 0;
- Framgment Offset 表示分段偏移量,就是指报文段在原始报文中的位置偏移量;
- Res 是保留字段设置为 0;
- M flag:1 表示后续还有分片报文,0 表示最后一个分片报文;
- Identification 表示分段的 ID 。
5、认证报头:
认证报头报文格式
- 认证扩展报头用于提供 IP 报文的认证等功能,应用于 IP 安全,提供报文验证、完整性检查;
- RFC2402 中定义了该扩展报头的具体细节。
6、封装安全净载报头:
封装安全净载报头报文格式
- 封装安全净载扩展报头主要应用于 IP 安全,提供报文验证、完整性检查和加密;
- RFC2406 中定义了该扩展报头的具体细节。
IPv6 与 IPv4 比较
区别
字段:IPv4 报头有 14 个字段(带选项和填充字段),基本的 IPv4 报头有 12 个字段;IPv6 报头只有 8 个字段。IPv4 中的 header length(4)、Identifier(16)、Flags(3)、Framented offset(13)、Options(Length variable、used for test)、Padding 这些项在 IPv6 中都没有了。
首部长度:IPv6 报头为定长的 40 bytes,IPv4 报头为不定长。IPv4 首部的选项字段允许 IP 首部被扩展,由此导致数据报首部长度可变,故不能预先确定数据字段从何开始,同时也使路由器处理一个 IP 数据报所需时间差异很大(有的要处理选项,有的不需要)。基于此,IPv6 采用固定 40 字节长度的报头长度(称基本报头)。然后 IPv6 通过扩展报头的选项字段实现类似于 IPv4 的扩展功能,并由 IPv6 基本报头的 “ 下一报头 ” 字段指向扩展报头(如果有的话)。路由器不处理扩展报头,提升了路由器转发效率。同时,IPv6 报头字段 64 bit 对齐,能够直接对内存进行存取。
分片 / 重组:IPv6 中分片与重组只能在源与目的地上执行,不允许在中间路由器进行。分片与重组是个耗时的操作,将该功能从路由器转移到端系统,大大加快了网络中的 IP 转发速率。如果路由器收到 IPv6 数据报太大而不能转发到出链路上怎么办?该路由器丢弃该包,并向发送发发回一个 ” 分组太大 ” 的 ICMP 差错报文,再发送使用较小长度的 IP 数据报重发数据。
首部检查和:每个路由器上 IPv4 首部检查和都需要重新计算,是一项耗时操作。加之数据链路层和传输层协议已经执行了检验操作,网络传输可靠性提升,所以 IPv6 不进行首部检查和,从而更快速处理 IP 分组。
选项和填充:选项由扩展报头处理,填充字段也去掉。
整体来讲,IPv6 的整体设计回归简洁,设计更加透明,固定长度的报头效率更高。
IPv6 报文格式的优点
效率 / 规范 / 安全 / 优质
- 取消 IP 层的校验:减少重复操作,由上层完成数据校验。
- 取消中间节点的分片功能:分片重组功能由源和目的端进行,通过 PMTU 机制来保证。
- 定长的 IPv6 报头:有利于硬件的快速处理,大部分的扩展报头中间节点不需要处理。
- 安全选项必须支持:如 OSPFv3 中取消了原有认证等特性,全部依赖于 IP 安全属性。
- 在基本 IP 头中增加流标签:提高 QoS 效率,保留了 DSCP 。
参考自:
【PDF】TCP/IP路由技术 卷一(第二版)/ 卷二
http://blog.sina.com.cn/s/blog_6a1837e901012ds8.html
http://blog.csdn.net/frank_jb/article/details/45093615
转自:CCIE Engineer Community Knowledge Base
原文:https://ccie.lol/knowledge-base/ipv4-and-ipv6-packet-header/
提交人:Ricky
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)