ICT应用解决方案04-IPv6与NDP
ICT应用解决方案04-IPv6与NDP
0 前言
- 在IPv4中,ICMP允许主机或设备报告差错情况。ICMP报文作为IP报文的数据部分,再封装上IP报文首部,组成完整的IP报文发送出去。常用的Ping、Tracert等命令都是基于ICMP实现的
- IPv6定义了ICMPv6(Internet Control Message Protocol for IPv6),除了提供类似ICMP的功能外,还有诸多扩展。邻居发现协议(Neighbor Discovery Protocol,以下简称NDP)便是基于ICMPv6实现的,作为IPv6的关键协议,NDP提供了如前缀发现、重复地址检测、地址解析、重定向等功能
1 ICMP回顾
Internet控制消息协议ICMP(Internet Control Message Protocol)是IP协议的辅助协议
ICMP协议用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用
1.1 ICMP工具
- 差错检测: ping
- 错误报告: Tracert
2 ICMPv6
2.1 ICMPv6概述
- 在IPv6报文头部中,NextHeader字段值为58则对应为ICMPv6报文
- ICMPv6报文用于通告相关信息或错误
- ICMPv6报文被广泛应用于其它协议中,包括NDP、PathMTU发现机制等
- ICMPv6控制着IPv6中的地址自动配置、地址解析、地址冲突检测、路由选择、
以及差错控制等关键环节
2.2 ICMPv6报文格式
2.3 ICMP报文类型
ICMPv6报文分为两类:差错报文和信息报文
- 差错报文
- 差错报文(ErrorMessages),也称为差错消息,Type字段最高bit为0,也就是ICMPv6Type=[0,127]
- 差错消息用于报告在转发IPv6数据包过程中出现的错误,如常见的目的不可达、超时等等
- 信息报文
- 信息报文(InformationMessages),也称为信息消息,Type字段最高bit为1,也就是ICMPv6Type=[128,255]
- 信息报文可以用来实现同一链路上节点间的通信和子网内的组播成员管理等
通常可以把差错报文分为4种:
-
目的不可达(type=1): IPv6转发过程中, 当设备发现目的地址不可达的时候, 向报文的源节点发送ICMP报文不可达的报错信息, 同时会携带错误信息
code 含义 0 没有到达目标设备的路由 1 与目标通信被策略管理禁止 3 ip地址不可达 4 目的端口不可达 -
数据包过大错误报文(type=2): IPv6传输过程中, 报文大小超过将接口MTU值
code 含义 code=0 数据包过大错误 -
时间超时错误报文: ipv6报文收发的过程中, 当设备收到Hop limit字段=0时, 或者将hop limit字段减到0时, 会向源节点返回一个时间超时错误报文
code 含义 0 传输过程中超过了跳数限制 1 分片重组超时 -
ICMPv6信息报文: 诊断功能和附加主机功能
- 请求echo-request(type=128, code=0)
- 响应echo-replay(type=129, code=0)
2.3.1 ICMPv6差错报文应用 - Path MTU发现
- 在IPv6中,中间转发设备不对IPv6报文进行分片,报文的分片将在源节点进行
- PMTU(PathMTU)就是路径上的最小接口MTU
- PMTUD(PathMTU发现机制)的主要目的是发现路径上的MTU,当数据包被从源转发到目的地的过程中避免分段
- 依赖PMTUD,数据的发送方可以使用所发现到的最优PMTU与目的地节点进行通信,这样可以避免数据包在从源传输到目的的过程之中,被中途的路由器分片而导致性能的下降
2.3.2 ICMPv6差错报文应用 - Ping
Ping基于ICMPv6信息报文实现
- EchoRequest:用于发送到目标节点,以使目标节点立即发回一个Echo Reply应答报文. EchoRequest报文的Type字段值为128,Code字段的值为0
- EchoReply:当收到一个EchoRequest报文时,ICMPv6会用EchoReply报文响应。EchoReply报文的Type字段的值为129,Code字段的值为0
2.4 ICMPv6其它常用的报文
- 邻居发现(RFC2461和RFC4861)
- Type=133路由器请求(Router Solicitation)
- Type=134路由器公告(Router Advertisement)
- Type=135邻居请求(Neighbor Solicitation)
- Type=136邻居公告(Neighbor Advertisement)
- Type=137重定向(Redirect)
- 组播侦听者发现协议(RFC2710和RFC3810)
- Type=130查询消息
- Type=131报告消息
- Type=132离开消息
- Type=143 MLDv2报告消息
3 NDP
3.1 NDP概述
RFC2461定义了IPv6邻居发现协议NDP。NDP是IPv6中非常核心的组件。其主
要功能如下
功能 | 含义 |
---|---|
路由器发现 | 发现链路上的路由器,获得路由器通告的信息 |
无状态自动配置 | 通过路由器通告的地址前缀,终端自动生成IPv6地址 |
重复地址检测(免费ARP) | 获得地址后,进行地址重复检测,确保地址不存在冲突 |
地址解析 | 请求目的网络地址对应的数据链路层地址,类似IPv4的ARP |
邻居状态跟踪 | 通过NDP发现链路上的邻居并跟踪邻居状态 |
前缀重编址 | 路由器对所通告的地址前缀进行灵活设置,实现网络重编址 |
重定向 | 告知其他设备,到达目标网络的更优下一跳 |
DHCP分配IP地址发方式为有状态配置
3.2 NDP报文类型及功能
NDP使用以下几种ICMPv6报文
-
RS(Router Solicitation):路由器请求报文, type=133,code=0;
-
M字段:
-
0: 无状态路由信息
-
1: 有状态DHCPv6
-
-
O字段:
- 0: 其他信息不需要用DHCPv6分配(DNS)
- 1: 需要DHCPv6分配其他信息
-
-
RA(Router Advertisement):路由器通告报文,type=134,code=0;
-
NS(Neighbor Solicitation):邻居请求报文,type=135,code=0;
-
NA(Neighbor Advertisement):邻居通告报文,type=136,code=0;
-
重定向:type=137,code=0
3.3 路由器发现流程
主机请求触发
当主机启动时,主机会向本地链路范围内所有的路由器发送RS报文,触发路由器响应RA报文。主机发现本地链路上的路由器后,自动配置缺省路由器,建立缺省路由表、前缀列表和设置其它的配置参数
注: 如果你使用ensp进行验证, 会发现RS报文的目的地址是FF02::1(组播地址, 所有设备), 但这是eNSP的bug, RS报文的目的地址本就应该是FF01::2(组播地址, 所有路由器)
路由器周期性发送
路由器周期性的发送RA报文,RA发送间隔是一个有范围的随机值,缺省的最大时间间隔是600秒,最小时间间隔是200秒
对于定期发送的RA报文,其地址有如下要求:
- Source Address:必须是发送接口的链路本地地址
- Destination Address:FF02::1(组播地址, 所有设备)
告诉所有设备, R1能分配前缀为2001:0DB8::/64
注: 华为设备默认抑制RA消息, 需要关闭RA抑制的话需要配置
接口视图配置:
undo ipv6 nd ra hlat
3.3.1 无状态路由协议自动获取IPv6地址步骤
Server
ipv6
int g0/0/1
ipv6 enable
ipv6 address 2023:6:6::1 64 #分配出的ipv6地址前缀
undo ipv6 nd ra hlat
qu
Client
ipv6
int g0/0/1
ipv6 enable
ipv6 address anto gload #全局获取ipv6地址
qu
3.4 地址解析
IPv6地址解析通过ICMPv6(NS和NA报文)来实现
在三层完成地址解析,主要带来以下几个好处
- 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议
- 可以使用三层的安全机制避免地址解析攻击。
- 使用组播方式发送请求报文,减少了二层网络的性能压力
PC1想要获取PC2的mac地址, PC1发送的NS报文需要包含源地址(自己的ip)、被请求节点组播地址(FF02: : 1: FE84: EFDC)、源mac(自己的mac)、目的mac(3333-ff00-0001)、NDP封装{target address(PC2的ip地址)、mac(自己的mac地址)}
PC2收到PC1的NS报文, 需要回复一个NA报文, 包括源地址(自己的ip)、目的地址(PC1的ip)、源mac(自己的mac)、目的mac(PC1的mac)、NDP封装{target address(自己的ip地址)、mac(自己的mac地址)}
3.5 IPv6邻居状态表
IPv6邻居状态表中缓存了IPv6地址与MAC地址的映射,可以通过display ipv6 neighbors命令来查看IPv6邻居状态表
3.6 IPv6邻居状态
IPv6节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。5种邻居状态分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、探查(Probe)
状态 | 含义 |
---|---|
Incomplete | 邻居不可达。正在进行地址解析,邻居的链路层地址未探测到,如果解析成功,则进入Reachable状态 |
Reachable | 邻居可达。表示在规定时间(邻居可达时间,缺省情况下是30秒)内邻居可达。如果超过规定时间,该表项没有被使用,则表项进入Stale状态 |
Stale | 邻居是否可达未知。表明该表项在规定时间(邻居可达时间,缺省情况下是30秒)内没有被使用。此时除非有发送到邻居的报文,否则不对邻居是否可达进行探测 |
Delay | 邻居是否可达未知。已向邻居发送报文,如果在指定时间内没有收到响应,则进入Probe状态 |
Probe | 邻居是否可达未知。已向邻居发送NS报文,探测邻居是否可达。在规定时间内收到NA报文回复,则进入Reachable状态;否则进入Incomplete状态 |
3.7 邻居状态机
3.8 重复地址检测
-
重复地址检测(Duplicate Address Detect,DAD)是指接口在使用某个IPv6地址之前,需要先探测是否有其它的节点使用了该地址,从而确保网络中没有两个相同的单播地址
-
接口在启用任何一个单播IPv6地址前都需要先进行DAD,包括Link-Local地址
-
一个地址在通过重复地址检测之前称为“tentative地址”,即“试验地址(未正式启用)”。此时该接口不能使用这个试验地址进行单播通讯
-
若2个节点配置相同地址,同时作重复地址检测时,当一方(试验地址)收到对方发出的DAD NS报文,则接收方将不启用该地址
试验地址收到NS报文: 自己不使用
已使用地址收到NS报文: 回包让对方不使用
3.9 ICMPv6重定向
重定向是指网关设备发现报文从其它网关设备转发更优,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备
- PC1希望发送报文到服务器,于是根据配置的默认网关地址向网关R2发送报文
- 网关R2收到报文后,检查报文信息,发现报文应该转发到与PC1在同一网段的另一个网关设备R1,此转发路径是更优的路径,于是R2会向PC1发送一个重定向消息,通知PC1去往服务器的报文应直接发给R1
- PC1收到重定向消息后,会向R1发送报文,R1再将该报文转发至服务器
本文来自博客园,作者:Qurare,严禁转载至CSDN平台, 其他转载请注明原文链接:https://www.cnblogs.com/konjac-wjh/p/17471918.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现