IPv6 封包结构

一个IPv6封包包含一个IPv6 header 零到多个Extension Headers(扩充表头)以及一个upper-layer protocol data unit(上层通讯协议数据单元)。 请注意: IPv6封包的payload(承载数据)是由 Extension HeadersUpper-Layer Protocol Data Unit组成。最大长度为65,535 bytes





n   IPv6 Header  永远存在且固定长度40 bytes
n   Extension Header  零到多个扩展表头,并且长度是可变动的。IPv6表头中的Next Header字段表示下一个扩展表头的类型。在每个扩展表头中还有另一个Next Header字段,用来表示下一个扩展表头的类型。最后一个扩展表头的Next Header字段表示上层通讯协议类型或为No next header(59)(当上层数据不存在时)。
n   Upper-Layer Protocol Data Unit  上层数据,例如ICMPv6UDPTCP


IPv6 Header

IPv6IPv4 更有效率的版本。它删除了IPv4所有不必要的字段,并且把IPv4表头不常使用的字段移到扩展表头。因为精简了需要处理的字段,router能更有效率地处理IPv6 Header并转送封包,进而支持更佳的real-time服务。






Version  4-bit长度,版本编号,固定设为6
Traffic Class  字段大小为8 bits。用来识别IPv6封包的类别或优先等级。
Flow Label  20-bit长度,指定此封包属于来源和目的之间的一组特定的封包。 要求中间IPv6 router进行特殊处理。Flow Label的详细应用请参考RFC 3697 IPv6 Flow Label Specification”。
Payload Length  指定IP payload (即扩展表头以及上层数据) 长度。该字段大小为16 bits,最大可代表65,535的承载长度。
Next Header  8-bit长度,指定紧接在IP header后头的header类型,即IPv6 Extension Header或上层PDU(如 TCPUDP ICMPv6)。
Hop Limit  指定在丢弃IPv6封包前可传送的最大连结数。 该字段大小为8 bitsHop Limit IPv4 TTL字段相似。每经过一个router就会将Hop Limit域值减1,当Hop Limit等于0时,封包将被router丢弃。
Source Address  来源地址,即发送IPv6封包的node地址。 该字段大小为128 bits
Destination address  目的地址,即接收IPv6封包的node地址。该字段大小为128 bits
Next Header域值

ValueDecimal
Header
0
Hop-by-Hop Options header
6
TCP
17
UDP
41
Encapsulated IPv6 header
43
Routing header
44
Fragment header
50
Encapsulating Security Payload header
51
Authentication header
58
ICMPv6
59
No next header
60
Destination Options header
135
Mobility header (RFC 6275)
值得注意的是: No next header并未被指定为零,反而Hop-by-Hop Options header被指定为零。主要原因是router除了处理IPv6 header以外,第一个可能需要额外处理的Extension HeadersHop-by-Hop Options header 因此,当Hop-by-Hop Options header出现时,它必须摆在第一个扩展表头。 Router必须检查IPv6 headerNext Header域值是否为Hop-by-Hop Options header再决定是否对extension header做进一步处理,否则直接转送封包。对硬件而言,检测数字0要比检测其它非零数字快速。此细微的设计考虑是为了尽可能降低router的处理时间,提供更好的real-time traffic

以下是目前造成IPv4传送封包延迟的主因:
u  传送距离的延迟  距离长度带来的延迟,这是物理特性,不可改变。电子流以及电子波都是以光速来传送。最远距离为地球2分之一的圆周长度,故传送距离的最大延迟时间为:(40000/2) / 300000 x 1000 = 66.6666 ms
u  传送数据的延迟  如果以100 M bits为整个传送路径的每个路段的平均传送带宽,平均每秒传送2M bits数据量来计算,其延迟时间为:2 / 100 x 1000 = 20 ms。当平均传送带宽达到1G bits,其平均延迟可以降到2 ms。假设整个传送路径经过N个路段,则传送数据的延迟为2 x N ms
u  Router的转送延迟  很明显地,目前IPv4封包的传送延迟最大的主因是routers转送封包时造成的。保守估计,其平均延迟时间可能超过10 ms 乘以“整个路径转送的router数”。
造成router转送延迟的主因有二:
l   其一是IPv4主干router的路由表往往超过70000,造成router在寻找next-hop的沉重负。然而IPv6的多层的阶层式路由架构除了大大降低路由表数,且可以保障最短路径。
l   其二是IPv4 header中许多字段造成router额外处理时间。譬如 checksumoptional fields等。IPv6已经将这些不必要的字段删除或者移至扩展表头。




















IPv6 Extension Headers(扩展表头)

IPv6中,属于选项的internet-layer讯息依据其功能分别定义在不同的表头。这些表头被称为IPv6 扩展表头, 并且被放置在IPv6表头及上层数据表头之间。
RFC 2460定义所有IPv6 nodes必须支持以下IPv6扩展表头:
-              Hop-by-Hop Option Header
-              Destination Options Header
-              Routing Header
-              Fragment Header
-              Authentication Header
-              Encapsulating Security Payload Header
一般的IPv6数据封包中,不包含扩展表头。除非有特别需要router或者destination进行处理的讯息,封包发送端才会加入一个或多个扩展表头。
每个扩展表头必须以 64 bits (8 bytes) 为界。扩展表头大小不等,它包含一个 Header Extension Length 字段,需要时必须使用padding,以确保扩展表头的大小为 8 bytes的整倍数。
IPv6 header以及所有的扩展表头都包含 Next Header字段,Next Header指明下一个相邻的扩展表头的类型,直到连结到上层通讯协议(TCPUDPICMPv6)为止。
IPv6 Header
Next Header = TCP (6)
TCP Header
Data

IPv6 Header
Next Header = Routing (43)
Routing Header
Next Header = TCP (6)
TCP Header
Data

IPv6 Header
Next Header = Routing (43)
Routing Header
Next Header = Fragment (44)
Fragment Header
Next Header = TCP (6)
TCP Header
Data

IPv6 Header
Next Header = Routing (43)
Routing Header
Next Header = AH (5)
Authentication Header
Next Header = TCP (6)
TCP Header
Data
Hop-by- Hop Options header是整个封包传送路径中routers必须检测且处理的数据,其它的扩展表头则属于封包最终接收端需要处理的讯息,跟router无关。为了避免浪费router不必要的处理时间,当Hop-by- Hop Options header出现时,它必须放在IPv6 Header的后面第一个扩展表头位置。
IPv6 Header
Next Header = Hop-by-Hop (0)
Hop-by-Hop Header
Next Header = ….
…………………………..


扩展表头顺序

扩展表头是依照排列顺序依序处理,且每个扩展表头的内容决定是否继续处理下一个Header。因此,IPv6封包的扩展表头必须遵循一定的次序排列才能被有效地处理。除了Hop-by-Hop Header出现时必须放在第一个位置,当1个以上的扩展表头同时存在一个IPv6封包时,RFC 2460建议其顺序如下:

IPv6 header
Hop-by-Hop Options header
Destination Options header
Routing header
Fragment header
Authentication header
Encapsulating Security Payload header
Destination Options header
upper-layer header

u  Destination Options Header用于目的节点需要额外处理的封包选项讯息,目的node可能是中间目的主机(即routers)或者最终目的主机。因此Destination Options header可能出现2次,第一个乃router需要额外处理的讯息,第二个为最终目的主机需要处理的讯息。
u  Routing header可能被routers或最终目的主机参考,故摆在Fragment header的前端。
u  Authentication header用来保障整个IP封包的完整性,防止被破坏篡改。
u  ESP header除了可加密最终目的主机需要处理的信息,亦可用来保障整个IP封包的完整性。
u  最后4项扩展表头皆属于最终目的主机处理的信息,与router无关,故摆在Fragment header的后头。对于利用AH或者ESP header加密保护的封包,发送端加完密后发现封包过长才将此封包切段后再发送,而接收端必须将这些切段后的片段封包重组后才做解密动作。因此Fragment header必须摆在AH以及ESP header的前端。
当其他新的扩展表头被定义时,它们相对于上面列出的扩展表头的顺序及限制必须被明确指定。


Options(选项)

当前已定义的Extension headers中,Hop-by-Hop Options headerDestination Options Header的名称里面皆包含“options字眼,意味着这2Extension headers都会携带1到多个options
每个option均使用 Type-Length-Value (TLV) 格式进行编码。



Option type  8-bit长度,用来识别该option的类型。
Option Data Length  8-bit长度,指定了该option data的长度。
Option Data  变动长度字段,与该option有关的数据。
Option Type字段中,最高序位的2 bits用来表示如何处理无法识别的option type。(当node不支持某些options,或者有新的options发布时,此2 bits的功用就派上用场了!)
Value(binary)
Action Taken
00
略过这个option,继续处理这个封包的其它字段。
01
不做任何动作,仅将封包丢弃。
10
丢弃封包,并且当这封包的IPv6 headerDestination Address域值是unicast or multicast地址时,发送一个ICMPv6 Parameter Problem message给此封包的发送者。
11
丢弃封包,并且当这封包的IPv6 headerDestination Address域值不是multicast地址时,发送一个ICMPv6 Parameter Problem message给此封包的发送者。
Option Type字段中的第3高位表示: 在到达目的地的路径中,这个option数据内容可被更改(=1)或者不可被更改(=0)。
每个option可能有特定的对齐要求,以确保该optionoption data字段落在特定的边界。对齐的表示法为 xn+y,这意味着该option type字段必须落在x bytes的整倍数加上y。例如:
2n代表option必须落在2 bytes的整倍数边界。
8n+2代表option必须落在8 bytes的整倍数加2的边界。
这种对齐要求主要是因为大多数的处理器在做算数或逻辑运算时有个限制: 当执行N bytesN可能是24 8)的运算时,运算的数据必须落在N的整倍数边界,否则处理器将发生异常。
由于option typeoption data length字段共占了2 bytes,当 xn+y x大于2时,y值大都是等于x-2
RFC 2460特别定义了Pad1 optionPadN option,用来调整需要对齐的option位移。
RFC 24602675 2711 定义以下options
Pad1 option


对齐要求:无
Option Type 0,用于填满单一字节。
PadN option



对齐要求:无
Option Type 1,用于填满 2 个或更多bytes

Jumbo Payload option


  对齐要求:4n+2
Option Type 194,用于指定大于 65,535 bytes payload 的大小。使用 Jumbo Payload option,必须把IPv6 headerPayload Length字段设为0(即: IPv6 headerPayload Length字段为0时,表示存在Jumbo Payload option),可使用 32 bytes Jumbo Payload Length 字段指定最多 4,294,967,295 bytes payload 大小。 Payload 大于 65,535 bytes IPv6 封包称为 jumbogram,此乃为了未来的link MTU有可能大于 65,575而定义的option65535 + IPv6 header长度 40 bytes = 65575)。
Jumbo Payload option仅适用于Hop-by-Hop options扩展表头。 带有此option的封包不可做分段处理(不可包含Fragment扩展表头)。

Router Alert option



  对齐要求:2n+0
Option Type 5,它告知router封包的内容还需要进一步处理。Router Alert Option用于 Multicast Listener Discovery Resource ReServation Protocol (RSVP)
RFC 2711定义了 Router Alert optionData字段的内容如下:
0                  Datagram contains a Multicast Listener Discovery message
1                 Datagram contains RSVP message
2                  Datagram contains an Active Networks message
3-65535      Reserved to IANA for future use
Router Alert option仅适用于Hop-by-Hop options扩展表头,且仅被router检查处理,hosts忽略此option

Hop-by-Hop Options Header

Hop-by-Hop Options header用于指定传送参数到目的地路径上每个router,它告知router必须对封包的内容做进一步处理。在IPv6 标头 Next Header 字段中的值设为 0 来识别。





Next Header  8-bit长度,用来识别下一个表头的类型。
Header Extension Length  8-bit长度。Hop-by-Hop Options表头中8字节区块的数量,不包括第18字节。 因此,长度为8字节 Hop-by-Hop Options 表头,Header Extension Length 字段的值为 0。填满选项用于确保 8 字节边界。
Options  可能引用的options Pad1PadNRouter AlertJumbo Payload options

Destination Options Header

Destination Options Header用于目的节点需要额外处理的封包选项讯息,目的节点可能是中间目的主机(即routers)或者最后目的主机。可在上一个表头的 Next Header 字段中将值设为60来识别此表头。





Destination Options 表头中字段的定义与 Hop-by-Hop Options 表头相同。
可能引用的options Pad1PadNHome Address option
Destination Options 表头有两种使用方式:
1.       如果存在 Routing 表头,则指定每个中间目主机需要额外处理的选项讯息。
2.       也指定最终目的主机额外处理的选项讯息。
1.       目前Destination Option header没有针对router的的实际应用。
2.       Mobile IPv6定义Home Address option,是针对封包最后目的主机的选项讯息的实际应用。在Mobile IPv6章节中会有详细描述。


Routing Header


IPv4 支持的Loose Source and Record Route option相似,IPv6 封包发送端可以使用 Routing 扩充表头指定路由,它列出封包通往目的地的路径上必须拜访的中间目的主机的列表。可在上一个表头的Next Header字段中将值设为43来识别 Routing 表头。






Next Header  定义方法与 Hop-by-Hop Options 扩充表头相同
Header Extension Length  定义方法与 Hop-by-Hop Options 扩充表头相同
Routing Type  用来识别routing的类型。
Segments Left  “路段”的剩余数(Routing Header的路由列表中,中间主机到下一个中间主机之间的路径称为1个“路段”)。也就是说,封包到达目的地前还没经过的路段数。
Routing Type-Specific Data  变动长度的字段。此字段的路由格式由Routing Type字段来决定。
由于Routing type 0已经被RFC 5095封杀,目前Routing Header没有针对router的应用。
Mobile IPv6 定义一个新型的routing header,称为type 2 routing header,是IPv6对最终目的主机的实际应用。在Mobile IPv6章节中会有详细描述。

RFC 2460中定义了Type 0Routing header。虽然基于网络安全理由,Routing type 0已经被RFC 5095封杀,笔者还是认为有必要了解其设计技巧。

Type 0 Routing header的格式如下:













Routing Type-Specific Data列着一系列中间目的地址,这个列表指定封包送达最终目的地前必须依序访问到的中间目的主机(其实就是router),同时封包发送者会先将封包传送到列表里的第一个中间目的主机。 IPv6 封包到达中间目的主机时,Routing 表头会经过处理。中间目的主机根据 Segments Left 域值找到下一个中间目的主机在Routing Type-Specific Data中对应的字段位置,并将下一个中间目的主机的地址填入IPv6 标头中的目的地址,再把自己的地址填入Routing Type-Specific Data,然后把Segments Left 字段减1,接着继续转送封包。此时封包的IPv6 标头中的目的地址已经改成下一个中间目的主机,封包肯定如预期的转送到下一个中间目的主机。除了指定的中间目的主机以外,整个路径会经过哪些其它的routers就不在考虑范围内。
Routing type 0的应用例子》
假设 来源node S欲发送封包给目的node D,并且利用Routing type0Routing Header,指定封包送达目的地D前必须依序访问的中间目的主机分别为I1I2I3。在传送封包的每个路段时的设定值将如下:
路段 S à I1:
IP Header
Routing Header
Source Address = S
Destination Address = I1
Hdr Ext Len = 6
Segments Left = 3
Address[1] = I2
Address[2] = I3
Address[3] = D
路段 I1 à I2:
IP Header
Routing Header
Source Address = S
Destination Address = I2
Hdr Ext Len = 6
Segments Left = 2
Address[1] = I1
Address[2] = I3
Address[3] = D
路段 I2 à I3:
IP Header
Routing Header
Source Address = S
Destination Address = I3
Hdr Ext Len = 6
Segments Left = 1
Address[1] = I1
Address[2] = I2
Address[3] = D
路段 I3 à D:
IP Header
Routing Header
Source Address = S
Destination Address = D
Hdr Ext Len = 6
Segments Left = 0
Address[1] = I1
Address[2] = I2
Address[3] = I3


Fragment Header

IPv6中,只有来源node可对payload 进行分段。 当发送的封包大于path MTU时,则必须用Fragment Header对封包做分段处理后,再一个个发送分段好的片段封包。最后由目的node将所有片段封包重组成原始封包。可在上一个Header Next Header 字段中将值设为 44 来识别此Header



   Next Header  用来识别下一个表头的类型。
Fragment Offset  长度13 bits8 bytes为单位。片段位移:相对于分段前的原始封包的可分段部分的开始位置。
More Fragments  值为1代表此分段后还有分段。值为0代表此分段为最后一个分段。
Identification  32-bit长度,当有大封包需要做分段处理时,发送端会对每个需要分段的原始封包产生不同的识别值,并且把这个识别值填入每个分段好后的片段封包的Identification字段。Identification字段主要是便于目的节点区别并重组不同的片段封包成为原始封包,然后再做进一步的处理。

IPv6 Fragmentation Process 封包切割处理

在将 IPv6 封包分段前,先将它分成不可分段部分和可分段部分:
l  不可分段部分  由于此分段部分为每个router必须处理的部分,即使做了分段,每个分段后的封包必须重复包含此部分。它包含IPv6表头、Hop-by-Hop Options表头、中间目的的 Destination Options表头以及 Routing表头组成。
l  可分段部分  此分段部分包含仅被最终目的节点处理的扩展表头及上层 PDU
分段后的片段封包由以下部分组成:
(1)  不可分段部分  IPv6表头的Payload Length域值须设为此片段封包的承载长度。由于分段后加入了Fragment扩展表头,不可分段部分的最后一个扩展表头的Next Header字段须设为Fragment扩展表头的识别值44。请注意,由于做分段时不可分段部分的最后一个扩展表头的Next Header字段已经被更改,所以重组片段成原始封包时必须回复这个域值。
(2)  Fragment Header  它的内容如下:
-     Next Header字段设为原始封包的可分段部分的第一个扩展表头的识别值。当目的节点将片段封包重组成原始封包时,此字段用来回复不可分段部分的最后一个扩展表头的Next Header的原始设定值。
-     Fragment Offset字段设为位移值(8 bytes为单位): 相对于原始封包的可分段部分的开始位置。
-     如果此片段为最后一个,则M flag字段设为0。其它片段则设M flag字段为1
-     设定Identification字段。

(3)       原始封包可分段部分被分段后的部分












范例:原始封包切分成2个片段封包。
原始封包
IPv6 Header
Next Header = TCP (6)
TCP Header
Data
分段后的封包
IPv6 Header
Next Header = Fragment (44)
Fragment Header
Next Header = TCP (6)
TCP Header
Data 分段1

IPv6 Header
Next Header = Fragment (44)
Fragment Header
Next Header = TCP (6)
TCP Header
Data 分段2

IPv6 Reassembly Process 封包重组处理
-       目的节点利用相同的来源地址、目的地址和Fragment HeaderIdentification的片段封包重组成原始封包。
-       用第1个片段的Fragment HeaderNext Header域值来回复原始封包的不可分段部分的最后一个扩展表头的Next Header的原始设定值。
-       利用不可分段部分的长度,及最后1个片段的长度和Fragment Offset,可以计算出原始封包的承载长度。计算公式如下:
原始封包的承载长度 = PL.first - FL.first - 8 + (8 * FO.last) + FL.last
PL.first:第1个片段的承载长度
FL.first:第1个片段的分段长度。即Fragment Header后的所有数据长度。
FO.last:最后1个片段的Fragment HeaderFragment Offset域值。

FL.last:最后1个片段的分段长度。
















考文献

RFC 2460  IPv6 Specification
RFC 2675  IPv6 Jumbograms
RFC 2711  IPv6 Router Alert Option
RFC 4302  IP Authentication Header
RFC 4303  IP Encapsulating Security Payload (ESP)
RFC 1981  Path MTU Discovery for IPv6

评论

此博客中的热门博文

DHCPv6 简介

IPv6 簡介以及地址介紹

Neighbor Discovery 简介

Multicast Listener Discovery (MLD) 简介

MLDv2 简介

Mobile IPv6 简介

ICMPv6

IP Security 簡介