目录
三、邻居发发现协议(NDP Neighbor Discovery Protocol)
3,重复地址检测(DAD,Duplicate Address Detect)
一、IPv6地址介绍
1,地址格式
- 长度:128bits,16bytes
- 每16bits划分为一段,转为16进制数,以冒号”:”来分隔
- 如果一段中的16位都为0,则可以用::来代替,注意:双冒号只能出现一次(在双冒号处填充0,直至128位地址填满为止。但是,如果同一地址中出现两个冒号对,就无法确定每个零地址块的大小)
2001:0D12:0000:0000:02AA:0987:FE29:9871=2001:0D12::02AA:0987:FE29:9871
2,地址结构
-
Ipv6地址= 前缀 + 接口ID
240e:f0:4:20:ee41:18ff:fe50:905/64
- 接口ID的生成方式:由MAC地址生成、设备随机生成、 手动配置
3,地址分类
单播地址
全球单播地址(Global Unicast Address)
前3个bit固定为001,前缀为2000::/3,相当于IPv4的公网地址
链路本地地址(link-local Address)
前10个bit固定为1111 1110 10,前缀fe80::/10,如:fe80::ee41:18ff:fe50:904/64
此类地址用于同一链路上的节点间的通信,主要用于自动配置地址和邻居节点发现过程。Windows和Linux支持或开启IPv6后,默认会给网卡接口自动配置一个链路本地地址。也就是说,一个接口一定有一个链路本地地址。在同一个交换机下面的机器就能直接通过这个地址通讯啦,不需要再配置别的地址。
唯一本地地址(ULA,Unique Local Address)
前8个bits固定为1111 1101,前缀为fd00::/8,相当于IPv4的私网地址,如:fd00:6868:6868::1/64
环回地址(The Loopback Address)
0:0:0:0:0:0:0:1或::1,等同于IPv4的127.0.0.1
全0地址,是未定义的地址
组播地址
前8bit固定为1111 1111
- FF02::1 表示本地链路的所有节点的组播地址
- FF02::2 表示本地链路上的所有路由器节点的组播地址
- 请求节点组播地址(Solicited-Node组播地址)
FF02:0:0:0:0:1:FFXX:XXXX
主要用途:1、替代IPv4中的ARP
2、重复地址检测
任播地址
任播地址标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。
IPv6中没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。
IPv6任播地址仅可以被分配给路由设备,不能应用于主机。任播地址不能作为IPv6报文的源地址。
netsh interface ipv6 show命令可以查看pc的ipv6地址信息
二、 IPv6报文结构
- Version:版本,对于IPv4,该值是4;对于IPv6则是6。
- Traffic Class:类似于IPv4的ToS字段,用于区分不同的服务类型,只是名字变了,作用没有什么变化。
- Flow Label:用于为不同的流加上不同的标签,为QoS提供了方便。
- Payload Length:类似于IPv4的 Total Length字段,由于IPv6的包头长度固定,因此只要知道负载的长度就可以了。
- Next Header:Pv6报文头部中的Next Header字段表示“承载上一层的协议类型”或者“扩展头部类型”,IPv6的分片用扩展头部来处理的
- Hop Limit:类似于IPv4的TTL字段。
- 包头长度:IPv6的报文头长度固定40字节,所以不需要该字段。
- 标识、标志和分段偏移:IPv6使用PMTUD (路径MTU检测)进行MTU发现,处理分段的方法变啦。
- 包头校验和:数据链路层L2和传输层L4的校验已经足够强壮,因此IPv6取消这个字段会提高路由器的转发效率,在IPv6协议下,传输层L4协议UDP、TCP是强制需要进行校验和的(IPv4是可选的)
- 选项和填充:选项字段如今交给扩展包头处理了、
三、邻居发发现协议(NDP Neighbor Discovery Protocol)
邻居发现协议是IPv6协议体系中一个重要的基础协议。它通过ICMPv6报文实现如下功能:
地址解析,
重复地址检测,
路由发现、前缀发现
地址自动配置
重定向
邻居发现协议定义了5种ICMP消息类型:
Type=133 RS(Router Solicitation,路由器请求)
Type=134 RA(Router Advertisement,路由器公告)
Type=135 NS(Neighbor Solicitation,领居请求)
Type=136 NA(Neighbor Advertisement,邻居公告)
Type=137 Redirect(重定向报文)
- 路由器请求(RS),当接口使能起来,主机发送RS,请求本地链路上的路由器立即发送RA,而不是等到下一次路由器定时发送RA。
- 路由器公告(RA),路由器周期性地或作为对RS报文的响应而发出RA消息,通告自己的存在和一些网络参数。RA中携带前缀和Hop Limit等一些参数。
- 邻居请求(NS),节点发出NS,用于地址解析、邻居不可达检测、重复地址检测。
- 邻居公告(NA),响应NS报文而发出。节点也可以主动发出NA,声明链路层地址的改变。
- 重定向(Redirect),路由器用重定向消息通告主机更好的第一跳路由器地址
1,地址解析
地址解析:通过IPv6地址查找接口MAC地址的功能,与ARP实现的功能一样,在IPv6中用于替代ARP
IPv6中的地址解析与IPv4中ARP协议的区别:
ARP发送的是广播报文;
IPv6地址解析发送的是组播报文;减小了对不相干节点的干扰,而且也不会影响到非IPv6节点
地址解析NS报文
源IP地址:进行地址解析的接口的单播地址
Target Address:被解析的地址
目的IP地址:被解析地址对应的 请求节点组播地址
地址解析NA报文
源IP地址:被解析的单播地址;
目的IP地址:单播地址,即NS的源IP地址;
Target Address:与相应的NS报文相同(必须相同)
Option选项:内容为Target的链路层地址。
2,邻居不可达检测(NUD)
邻居不可达检测(NUD)是IPv6的新特性,用来帮助节点确定邻居(目的节点或路由器)是否可达
在IPv4中,ARP表项在超时后就被清除;而在IPv6中,与ARP对应的邻居缓存表项不会因为超时而被清除,只是在下一次需要向此邻居发送报文时才使用NUD机制检验邻居节点是否可达
Linux查看邻居缓存ip -6 neighbor show
windows查看邻居缓存netsh interface ipv6 show neighbors
邻居状态有五种:
INCOMPLETE 未完成
REACHABLE 可达
STALE 陈旧
DELAY 延迟
PROBE 探查
举个例子:节点A要访问节点B,A的缓存中无B的条目
(1)A先发送NS,并生成缓存条目,状态为 Incomplete;
(2)若B回应NA,则 Incomplete->Reachable,否则如果A发送MAX_MULTICAST_SOLICIT次(缺省为3次) NS后,仍没有收到B回应的NA,地址解析就告失败,Incomplete->Empty,即删除条目;
(3)经过ReachableTime(缺省为30秒),A的条目状态Reachable->Stale;
(4)或者在Reachable状态,收到B的非请求NA,且链路层地址不同,则马上->Stale(不确定更新的链路地址的可达性);
(5)在Stale状态若A要向B发送数据(如:节点欲与对端邻居建立TCP连接),则发送第一个数据包的同时,Stale->Delay;
(6)A在Delay_First_Probe_Time(缺省为5秒)内,收到上层可达性确认,可直接从DELAY状态进入REACHABLE状态;
(6)A在Delay_First_Probe_Time(缺省为5秒)内,没有收到上层可达性确认,则A发送一个单播NS,同时Delay->Probe;
(7)在Probe状态,每隔RetransTimer(缺省为1秒)发送单播NS,发送MAX_UNICAST_SOLICIT次(缺省为3次)后再等RestransTimer(缺省1s),有应答则->Reachable,否则进入Empty,即删除表项;
邻居不可达检测的NS报文
特点:
目的IP地址:单播地址
源IP地址:发起NUD的接口的链路本地地址(必须是链路本地地址)
Target Address:待验证可达性的单播地址
邻居不可达检测的NA报文
源IP地址:被检测的单播地址(发送NA的接口地址)
目的IP地址:发起者的链路本地地址,即NS的源IP地址
Target Address:与相应的NS报文相同(必须相同)
Solicited 标志为1,表示该消息是作为NS的响应而发出的
3,重复地址检测(DAD,Duplicate Address Detect)
IPv6地址生命周期
(1)Tentative (试验)
刚生成的IPv6地址出于Tentative状态,此时IPv6主机发出Neighbor Solicitation消息,检查该地址是否已被使用。 如果IPv6主机收到Neighbor Advertisement响应消息,就将此地址标识为已被重复使用,地址状态变为 Duplicated,不能被应用于接口。
(2)Preferred(首选)
如果确定了该IPv6地址时唯一的,该地址状态就改为Preferred(首选)状态。从现在开始它是一个有效的(Valid)IPv6地址。
对于手工配置的地址和链路本地地址在接口正常的情况下会一直处于Preferred状态,即有效期是无限长。
对于通过路由器公告的前缀等信息自动配置的地址,则会有有效期,有效期的长度信息也包含在路由器公告中。
(3)Deprecated (弃用)
Preferred地址有一定的使用期限,时限过后,状态就变为Deprecated(反对),它还是一个有效的(Valid)IPv6地址。现有的连接可以继续使用该地址,但是新建的连接不能使用该地址。即地址不能主动的发起连接,只能是被动的接受连接
(4)Invalid (无效)
出于Deprecated状态的地址经过一段时间后会变为Invalid(无效)地址,此时该地址不可使用
Link-local地址的preferred lifetime和valid lifetime都是无限期的
重复地址检测之前,节点会加入两个组播组:
所有节点组播组:这样确保能够收到已经使用此地址的节点响应的NA报文,因为该NA报文的目的IP地址是FF02::1
对应试验地址的请求节点组播组:这样确保当两个节点同时要使用一个相同的地址时,在进行重复地址检测时,能够彼此收到对方的NS消息
IPv6重复地址检测技术和IPv4中的免费ARP类似:
节点向试验地址所对应的Solicited-Node组播组发送NS报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。
抓包:在PC A上手动配置与PC B相同的v6地址240e:f1:440::2ab,在PC A上抓包
重复地址检测NS报文
源IPv6地址:未指定地址(::),因为此时接口上的tentative地址尚未生效
目的IPv6地址:被检测地址的 请求节点组播地址
Target Address:被检测的地址
重复地址检测的NA报文
源IPv6地址:被重复的地址;
目的IPv6地址:链路本地范围内所有节点组播地址(FF02::1);
Target Address:同NS的Target Address;
PC B 收到NS报文的处理方法:
- PC B的IP 240e:f1:440::2ab处于试验地址状态,则B放弃使用该地址,并且也不会发送NA报文
- PC B的IP240e:f1:440::2ab 已经是一个正常使用的地址,B会发送NA报文
4,路由器和前缀发现
- 路由器和前缀发现:主机通过接收路由器公告(RA),可以定位邻居路由器、学习前缀和地址自动配置所需参数等。
- 主机接收路由器公告有两种方式:
- 接收路由器定期发出的路由器公告(RA);
- 主机主动发送路由器请求(RS),然后接收路由器响应的路由器公告(RA)。
RS报文实例
当主机接口被使能时,主机不会等到下一次路由器主动发送RA,而是通过发送RS主动地请求路由器发送RA
源IP地址:发送报文所用的接口IP,这里是PC的link local地址
目的IP地址:所有路由器的组播地址
路由器回应RS的RA报文
目的IP地址:单播地址,与RS的源IP相同
常用字段意义:
(1) Flags
M=1,表示可以通过有状态方式(DHCPv6)获取Ipv6地址;
O=1,可以通过有状态方式获取DNS等参数
(2)Router lifetime
与默认路由相关,如果Router Lifetime的值不为0,收到RA报文的主机就会创建或者更新一条缺省路由表项
如果缺省路由器列表中已有此项,并且RA中Router Lifetime的值为0,则主机立即删除该条目。
路由器定期发送的RA报文
路由器定期发送RA报文的时间是随机的,可以防止与同一链路上的其它路由器产生同步,即同一时刻所有路由器同时发送RA消息。
目的IP地址:所有节点的组播地址
5,重定向
路由器发送重定向报文有两个作用:
通知主机去往某一目的地的正确的第一跳路由器地址;
通知主机它要去的目的地其实是它的一个直连可达的邻居(ICMP Target Address与ICMP Destination Address相同)
step 1: Create a new client on the LAN
step 2: Send a ping to the Global-Unicast-Address of the new client
step 3: Verify the DUT sends an ICMPv6 Redirect messsage
step 4. Verify the ICMPv6 Redirect message
step 5: Verify the new client responds to the ping
ICMP重定向报文抓包
源IPv6地址:发送消息接口的link-local地址;
目的IPv6地址:触发重定向报文的源地址;
ICMP Target Address:对于去往ICMP Destination Address的更好的第一跳路由器的地址。
如果ICMP Target Address与ICMP Destination Address相同,表示目的地址其实是一个与主机直连的邻居。
否则,Target Address就表示一个更好的第一跳路由器地址,而且必须是一个link-local的地址。
ICMP Destination Address:被重定向报文的目的地址
四、PMTU
PMTU(Path MTU):路径最大传输单元,指从报文的源节点到目的节点所经过的链路上,所有链路MTU值的最小值
目的:IPv6中间节点不支持对报文进行分段,超大报文的分段只能在源节点进行,因此发送报文的源节点需要知道整条链路的PathMTU值,以便对超大报文进行分段。PMTU发现(Path MTU Discovery)机制的目的就是要找到从源端到目的端的路径上一个合适的MTU值
优势:IPv6协议中要求的最小链路MTU是1280字节,推荐的MTU值为1500字节。如果IPv6节点不使用PMTU发现机制,只能将最小链路MTU值(1280字节)作为所有路径的PathMTU值,这样势必会造成一定的网络资源浪费,进而达不到理想的吞吐量。
五、下一跳判定
1,邻居缓存表
- 定义:近期有流量发送过去的邻居的表项。表项列出邻居的单播地址,并且还包含下列信息:链路层地址、IsRouter flag(标识邻居是一个路由器还是一个主机)
查看命令:netsh interface ipv6 show neighbors
Internet 地址 物理地址 类型
-------------------------------------------- ----------------- -----------
240e:f1:440::1 ec-41-18-50-09-04 可以访问 (路由器)
fe80::ee41:18ff:fe50:904 ec-41-18-50-09-04 停滞 (路由器)
2,目的缓存表
- 定义:近期有流量发送过去的目的地表项,目的地缓存表包含直连可达的和非直连可达的目的地址,它将一个目的IP地址映射到下一跳邻居的IP地址
查看命令:netsh interface ipv6 show destinationcache
PMTU 目标地址 下一个跃点地址
---- --------------------------------------------- -------------------------
1500 240e:f0:4:0:ee41:18ff:fe50:905 fe80::ee41:18ff:fe50:904
1500 240e:f1:440::1 240e:f1:440::1
3,前缀列表
定义:前缀列表是接收到RA消息而创建的,保存了一些on-link的地址前缀。表项具有一个失效时间
查看命令:netsh interface ipv6 show siteprefixes
前缀 生存期 接口
------------------------ ------------ -----------------------------
240e:f1:440::/64 4h 850Mbps
4,缺省路由列表
显示当前PC的路由表项,第一条为缺省路由
查看命令:netsh interface ipv6 show route
发布 类型 跃点数 前缀 索引 网关/接口名称
------- -------- --- ------------------------ --- ------------------------
否 手动 256 ::/0 24 fe80::ee41:18ff:fe50:904
否 手动 256 ::1/128 1 Loopback Pseudo-Interface 1
否 手动 8 240e:f1:440::/64 24 850Mbps
下一跳判定与报文发送流程
六、地址管理和分配
IPv6地址管理分配方式:
- 无状态自动配置(SLAAC):自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息
- 基于状态的DHCPv6:DHCPv6服务器自动分配IPv6地址/PD前缀及其他网络配置参数
- 无状态DHCPv6:主机IPv6地址仍然通过路由通告方式自动生成,DHCPv6服务器只分配除IPv6地址以外的配置参数,包括DNS
- 静态配置:手动配置IPv6地址/前缀及其他网络配置参数
1,无状态自动配置
- 优点:无状态自动配置不需要消耗很多机器资源,也不像传统DHCP一样需要维护一个本地数据库来维护地址分配状态,他只是进行广播前缀。
- 流程:
- 根据接口标识产生链路本地地址,发出邻居请求,对link local地址进行重复地址检测,如地址不冲突,链路本地地址生效,节点具备本地链路通信能力。
- 主机会发送RS报文来请求前缀等息
- 路由器回复RA报文,主机根据RA报文中的前缀信息和接口标识生成IPv6无状态地址和临时地址
- 主机发送NS报文,对生成的地址进行DAD检测
在无状态地址配置中,客户端不会主动续租,而是通过路由器主动发送携带新生命周期的RA报文完成。 PC收到RA之后,会主动更新Prefix的lifetime
2,基于状态的DHCPv6
获取地址的流程:与IPv4中的DHCP流程相似,都是四步报文交互,但是所用的报文不同
DHCPv4报文 | DHCPv6报文 | 说明 |
DHCP DISCOVER | SOLICIT | HCPv6客户端使用Solicit报文来确定DHCPv6服务器的位置 |
DHCP OFFER | ADVERTISE | DHCPv6服务器发送Advertise报文来对Solicit报文进行回应,宣告自己能够提供DHCPv6服务。 |
DHCP REQUEST | REQUEST | DHCPv6客户端发送Request报文来向DHCPv6服务器请求IPv6地址和其它配置信息。 |
DHCP ACK/NAK | REPLY | DHCPv6服务器用来回应客户端的equest、Renew、Rebind报文等报文 |
DHCP REQUEST | RENEW | 在T1时间,DHCPv6客户端向给其提供地址和配置信息的DHCPv6服务器发送Renew报文来延长地址的生存期并更新配置信息。 |
DHCP REQUEST | REBIND | 如果Renew报文没有得到应答,在T2时间,DHCPv6客户端向任意可达的DHCPv6服务器发送Rebind报文来延长地址的生存期并更新配置信息 |
DHCP RELEASE | RELEASE | DHCPv6客户端向为其分配地址的DHCPv6服务器发送Release报文,表明自己不再使用一个或多个获取的地址 |
DHCP DECLINE | DECLINE | DHCPv6客户端向DHCPv6服务器发送Decline报文,声明DHCPv6服务器分配的一个或多个地址在DHCPv6客户端所在链路上已经被使用了 |
DHCP INFORM | INFORMATION-REQUEST | DHCPv6客户端向DHCPv6服务器发送Information-Request报文来请求除IPv6地址以外的网络配置信息。 |
DHCPv6 请求IP地址
DHCPv6请求PD(prefix Delegation)