IPV6学习笔记
IPV6基础
ipv6编址和数据包结构
ipv6包结构
-
ipv6长度从ipv4的32bit变成了128bit,并且在ipv4的基础上进行了简化,去掉了一些不需要的字段,确保ipv6的头部长度在40字节。
- 去掉了ARP和广播
- 流标记字段提供流量区分,为qos提供方便
- 拓展包头妨碍提了ipv4包头的选项字段,提供了更多的灵活性
-
ipv4包头格式:
-
|0---------------1---------------2---------------3--------------| |0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |version| IHL |type of service| total length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | identification |flags| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time to live | protocol | header checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | source address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | destiantion address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | options | padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
ipv6包头格式:
-
|0---------------1---------------2---------------3--------------| |0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |version| traffic class | flow label | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | payload length | next header | hop limit | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + source address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + destiantion address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
ipv6 包头字段说明:
- version(4bit):版本号,ipv6取值为6
- traffic class(8bit):等同于ipv4中的TOS字段,用于QOS
- flow label(20bit):用于区分实时流量,不同流标签+源地址可以唯一确定一条流。
- payload length(16bit):与ipv4不同,ipv6只包含包头之后的payload长度,不会计算包头本身的长度。
- next header(8bit):和ipv4的protocol type相似,可以是高层协议也可以是一个新增的扩展包头。
- hop limit(8bit):下一跳限制,控制报文通过路由器的次数,类似TTL。
- source address/destination address(128bit):ipv6源/目的地址。
-
ipv6 扩展包头:
-
去掉了ipv4中的option字段和分片字段,ipv6中这些字段以及新增功能都存在扩展包头中(extension header)。
-
在ipv4中包含的option可以将包头从20字节增加到60字节,但是在转发过程中就需要消耗大量资源来进行软件处理。
-
在ipv6中将options从包头剥离,放到拓展包头中。拓展包头放在了ipv6包头和后面的上层协议包头之间。一个ipv6包头可以包含0到多个包头,使用多个包头时,需要将前面的包头中的下一个包头字段指向下一个拓展包头,形成链表,例如:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ipv6 header | routing header | fragment header | fragment of TCP | | | | header + data | next header = | next header = | next header = | | routing | fragment | TCP | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
除了逐跳包头外,其余的携带拓展包头的ipv6报文,中间网络节点不会对拓展包头进行处理,只有目的节点可以处理。
-
如果是逐跳包头(hop-by-hop),所有经过的网络节点必须交给cpu进行软件处理,所以在有多个拓展包头的情况下,逐跳包头必须紧跟ipv6包头处于第一个位置。
-
目前定义的拓展包头:
-
vlue header 0 Hop-by-Hop Options Header 逐跳选项 43 Routing Header 路由选项 44 Fragment Header 分段 50 Encapsulating security Payload 封装有效安全载荷 51 Authentication Header 认证包头 59 No next header 60 Destination Options Header 目的选项 -
option选项:逐跳包头和目的选项包头中会携带option。option格式如下。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | option type | opt data len | option data +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 如果有节点不支持option,可以根据option type中的定义来处理:
- 前两个bit:00----跳过继续处理,01----丢弃,10----丢弃并且向源IP发送ICMP参数错误消息
(Code=2),11----当目的IP不是组播地址时,丢弃并且向源IP发送ICMP参数错误消息(Code=2)。 - 第三个bit:0 - Option Data 不改变 en-route,1 - Option Data 可以改变 en-route
- 前两个bit:00----跳过继续处理,01----丢弃,10----丢弃并且向源IP发送ICMP参数错误消息
- 如果有节点不支持option,可以根据option type中的定义来处理:
-
-
逐跳选项:
-
逐跳选项格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | next header | hdr ext len | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | | options | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
携带的信息会被每个中间节点检查和处理,所以必须紧跟ipv6包头,next header为0。
-
逐跳选项定义了两个option:1、router alert – 指明报文需要网络节点进一步处理 2、jumbogram option – 将ipv6的payload字节长度从2字节扩充到4字节,这样报文长度从65535字节增加到4294967295字节。
-
-
路由选项:
- 路由选项格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | next header | hdr ext len | routing type | segments left | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | type-specifio data | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
该包头能够被ipv6源节点用来强制数据包经过特定的路由器。
-
ipv6一旦确定了中间ipv6路由器的列表,在发送ipv6数据报文之前,源节点会进行以下操作:
-
将ipv6基本包头中的目的地址转换为中间路由器列表中的第一个路由器地址,而不是原始的ipv6目的地址。
-
将原始的ipv6地址作为中间路由器列表的最后目的地。
-
数据包经过每个路由器时,将路由器包头的剩余段(segments left)字段减1,该字段指向剩余路由器段数。然后中间路由器会将ipv6的基本包头中的目的地址更换为中间列表中的下一个路由器,并将路由器选项剩余字段减1,路由器将自己的地址放在路由选项中间路由器列表的下一个路由器前面(用来记录路由)。接收到有路由选项的数据包之后,目的节点能够看到记录在路由选项中的中间路由器列表,然后目的节点还能够使用路由选项向源节点发送应答数据包,并逆序制定相同的路由器列表。
-
例子,源节点S发数据报文到D,中间经过路由器L1,L2,L3,过程如下:
-
IPv6 header Routing header Packet from S to I1 Source address S
Destination address I1Segments Left 3
Address (1) = I2
Address (2) = I3
Address (3) = DPacket from I1 to I2 Source address S
Destination address I2Segments Left 2
Address (1) = I1
Address (2) = I3
Address (3) = DPacket from I2 to I3 Source address S
Destination address I3Segments Left = 1
Address (1) = I1
Address (2) = I2
Address (3) = DPacket from I3 to D Source address S
Destination address DSegments Left = 0
Address (1) = I1
Address (2) = I2
Address (3) = I3
-
-
分段选项:
- 分段选项格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | next header | reserved | fragment offset |res|M| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | identifioation | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ipv6中间节点不允许对数据报文进行分片,如果需要分片,则需要源节点来完成。当中间节点发现数据报文大于MTU时,就会将报文丢弃。同时向源节点发送ICMP too big(TYPE=2)来告知节点相应的MTU值。
-
目的选项:
-
目的选项格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | next header | hdr ext len | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | | options | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
目的选项携带了一些只有目的节点才会处理的信息,在ipv6报文中,目的选项可以出现两次。第一次是路由选项之前,包含了路由器列表中路由器需要处理的信息。第二次在上层协议之前,包含了最后的目的节点需要处理的信息。
-
-
认证包头:
- 该包头有IPsec使用,提供认证,数据完整性以及重放保护。还确保基本IPv6包头中的一些字段的保护,该包头在ipv4和ipv6中是相同的,通常称为IPsec认证包头(AH)。
-
封装有效安全载荷:
- 由IPsec使用,提供认证、数据完整性、重放保护和ipv6数据包的保密。
-
如果IPv6包头或者拓展包头中的next header取值为59,则表示后面没有任何数据,即便payload length表明后面还有数据,路由器也会忽略这些数据。
ipv6编址
-
ipv6地址分类和ipv4不同,ipv4分为单播、组播、广播三种,但是ipv6去掉了广播地址,增加了任播地址。
-
任播地址:一个地址可以标识多个不同的接口或者节点,目的是该地址的数据报文会转发到最近的一个节点上。
-
由于ipv6地址分为128bit,所以ipv6使用的是16进制表示,分为8段,之间使用冒号连接。
- 首选格式是:`x:x:x:x:x:x:x:x `其中x代表了1-4个16进制字符。 - 单播地址:`2001:DB8:0:0:8:800:200C:417A` - 组播地址:`FF01:0:0:0:0:0:0:101` - 环回地址:`0:0:0:0:0:0:0:1`
-
ipv6的单播地址可以分为很多类,去了FF开头的组播地址外,都可以分为单播地址。ipv6单播地址包括:未指定地址、环回地址、全球单播地址、本地链路地址、本地站点地址、本地地址。
-
未指定地址:
0:0:0:0:0:0:0:0/128
-
全球单播地址:改地址不属于任何节点,不能作为目的ip。
-
本地链路地址:
FE80::/10
,本地链路地址仅仅限于本地链路范围内可用,改地址作为源ip或者目的ip均不可路由。节点可以自动生成,用于相邻节点之间使用,可以用于邻居发现,无状态地址配置等应用。 -
本地站点地址:
FEC0::/10
该地址已经停用。 -
唯一本地地址:由于本地站点地址的废除,所以引入了新的本地站点范围地址作为替代。具有全球唯一的前缀,可以进行网络之间的私有连接,不必担心地址冲突,在上层应用将这些地址看作全球单播地址看待。
-
环回地址:ipv6中的环回地址是
0:0:0:0:0:0:0:1/128
,该地址不会分配给任何物理接口,通常用来表示一个虚拟的接口地址(loopback)。 -
ipv6组播地址:第一个字节是FF的ipv6地址属于组播地址,组播地址格式:
|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1 1 1 1 1 1 1 1| flags | scop | group id | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |O|R|P|T|
-
以太网的组播映射关系:ipv6组播对应MAC地址有两部分组成,固定的组播MAC前缀
33:33 + 组播IP地址后32bits
。如组播IP地址:FF02::1
对应MAC地址:33:33:00:00:00:01
。 -
被请求节点组播地址:通过节点的单播/任播地址生成。当一个节点具有了单播/任播地址,就会生成一个被请求节点组播地址,并加入这个组播组。该地址用于邻居发现机制。ipv6中没有广播地址,也不使用ARP,但是还是需要通过IP解析MAC地址。在ipv6中,这个功能通过neighbor solicitation报文实现。当一个节点需要解析某个IP对应的mac的时候,就会发送NS报文,该报文的目的IP就是需要解析IP对应的被请求节点组播地址,该报文会在直连子网上广播到所有节点,只有具有了IP的节点会检查处理。被请求节点组播地址由两部分组成,
FF02:0:0:0:0:1:FF00::/104 前缀 + 单播/任播的后24bits
。 -
基于单播前缀的组播地址:基于单播前缀动态分配组播地址,这样可以去掉组播地址分配协议,简化组播地址分配复杂度。使得网路节点可以自动分配组播地址。
-
链路范围组播地址:link-local范围内使用本地链路组播地址,其他范围内使用基于单播的组播地址。本地链路通过使用interface id来定义自动分配的组播地址。
ARP和ND
概要
- 比较分析ipv4和ipv6两个不同体系对于链路层地址和网络层地址间映射关系的定义和处理。
- ipv4中确定链路层地址和网络层地址关系的是另外的ARP协议,主要的作用就是地址解析和重复地址检测。
- ipv6中基于ICMPv6的邻居发现机制实现该功能,并提供了更加强大的路由发现,地址自动配置、邻居不可达检测、重定向等功能。
- ipv4中的arp协议在ipv6中由ND来实现,但是ND出现的目的并不只是取代arp,而是将地址解析作为主要功能之一。
- arp字节封装在以太网报文中,以太网协议类型为0x0806表示ARP报文。ND本身基于ICMPv6实现,所以以太网协议类型应该是0x86DD即ipv6报文,ipv6下一个报头协议类型为十进制数值58,表示ICMPv6报文,由于其使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第三3层的协议。
- ARP规定了两种报文,ARP请求(ARP Request)和ARP应答(ARP Reply),两种报文格式相同,通过操作字段的值来区分。
- ND由于功能强大,定义了五种报文,分别是邻居请求(Neighbor Solicition)、邻居公告(Neighbor Advertisemen)、路由器公告(Router Solicition)、路由器公告(Router Advertisement)、重定向(Redirect)。这五种报文格式不同,通过ICMP类型和代码来区分。
ARP
-
ARP报文封装:
|0---------------1---------------2---------------3--------------| |0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | HARDWARE TYPE | PROTOCOL TYPE | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | HA LEN | PA LEN | OPERATION | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SENDER HA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SENDER HA | SENDER PA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SENDER PA | TARGET HA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TARGET HA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TARGET PA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 硬件类型字段表示硬件地址的类型,在以太网中一般为1。协议类型表示三层协议地址的类型,ip对应的协议类型为0x0800。
- 硬件地址长度和协议地址长度,在以太网中的环境中分别取值为6和4。操作类型用来区分报文性质,有4个有效值,分别是ARP请求(取值为1)、ARP应答(取值为2)、RARP(取值为3)、RARP应答(取值为4)。
- 发送者的硬件地址,发送者的协议地址,报文接受者的硬件地址,报文接受者的协议地址。
-
ARP报文的所有字段均需要按照实际情况填充,未知的字段用零填充。
ND
- ND报文和ARP最相似的是NS和NA报文,邻居请求报文(NS)用于获取目标节点的链路层地址,并捎带提供字节的链路层地址。当解析对端地址时,为多端发送,寻求验证邻居可达性时,使用单播IP地址,相当于ARP中的ARP请求报文,报文格式下图。
- NS的源IP地址为一个被指定的接口地址,或者未指定地址。目标地址为目标的ip地址或者被请求节点多播地址。跳数限制比为255、认证头可选、校验和为ICMP校验和,保留字段填充为0。
- ICMP部分类型为135,代码为0。目标地址为请求目标地址的IP地址,一定不能使用多播地址。
- 所以一个用于地址解析目的的NS,其IP部分的目的IP为请求节点多播地址,但是其ICMP部分的目标地址字段为请求节点的单播地址,该字段使用单播地址保证了最终发送者最多只会收到一个期望的应答。
-
NS报文格式:
|0---------------1---------------2---------------3--------------| |0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | code | checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + target address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | options ..... +-+-+-+-+-+-+-+-+-+-+
-
邻居公告(NA)用于回应邻居请求,或者在未被请求时主动发送以传播新的信息,相当于ARP的ARP应答报文。
-
NA报文格式:
|0---------------1---------------2---------------3--------------| |0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | code | checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |R|S|O| reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + target address + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | options ..... +-+-+-+-+-+-+-+-+-+-+
-
NA的源IP地址为发送通告的接口的一个地址。
-
如果邻居通告是作为一个邻居请求的应答,则为调用邻居请求的源地址,如果邻居请求的源地址为未指定地址,则公告的目的地址为所有节点多播地址,如果邻居公告不是被请求的,则同样使用所有节点多播地址作为目的地址。
-
ICMP部分类型136,代码0。R标志置一表示发送者是一个路由器,通常用于邻居不可达检测机制,检测路由器是否换成主机。S标志公告是否是对本报文目的地址所发送的请求报文的响应,S标志用于邻居不可达检测的可达性确认,当多播发送时或者非被请求的公告中不能置位。O标志置位标识邻居公告不考虑已有表项,并且覆盖已有的链路层地址。虽然公告会更新没有链路层地址的表项,但是如果O比特没有置位,公告仍然不会更新表项。
-
可能使用的选项:目标链路层地址。就是公告发送者的链路层地址,响应多播请求时必须使用该选项,响应单播请求时可以使用可以忽略。