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)
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 。
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):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
各字段功能:
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 扩展头排列顺序如下:
其他关于 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 IPv6扩展报头出现顺序
图2 IPv6下,基本报头、扩展报头和三层协议数据报文的相互关系
IPv6 扩展报头报文格式:
1、逐跳选项报头:
逐跳选项报头报文格式
为了保证选项头的长度为 64 bits 的整数倍(便于 64 位处理)经常需要在 Options 中添加填充段,填充段有两种:
逐跳选项报头填充段
逐跳选项报头中用于巨型载荷(载荷长度超过 65 535 字节)的超大有效载荷选项结构:
逐跳选项报头超大有效载荷选项结构
2、目的选项报头:
目的选项报头报文格式
3、路由报头:
路由报头报文格式
4、分段报头:
分段报头报文格式
5、认证报头:
认证报头报文格式
6、封装安全净载报头:
封装安全净载报头报文格式
区别
字段: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 的整体设计回归简洁,设计更加透明,固定长度的报头效率更高。
效率 / 规范 / 安全 / 优质
参考自:
【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