IPv6 — 基于邻居发现协议的通信方式
目录
前文列表
《IPv6 — 网际协议第 6 版》
《IPv6 — 地址格式与寻址模式》
《IPv6 — 协议头》
IPv6 的通信方式
在 IPv4 中,主机之间的通信是建立在 IP 协议和 ARP 协议之上的,主机通过 ARP 广播得知 IP 地址所对应的主机网卡的 MAC 地址,进而在子网中进行数据报文的传送。但 IPv6 是没有广播寻址模式的,所以启用 IPv6 的主机并不是必须要通过 DHCP 自动获取或手动配置 IP 地址的,主机可以自动配置自己的 IP 地址。在 IPv6 中 ARP 已被 ICMPv6 的邻居发现协议替代。
NDP(Neighbor Discovery Protocol,邻居发现协议)
IPv6 引入了相邻节点搜索协议,该协议使用消息传递作为处理相邻节点间的交互的方式。相邻节点是指在同一链路上的 IPv6 节点。例如,通过发出与相邻节点搜索相关的消息,节点可以获知相邻节点的链路本地地址。相邻节点搜索控制 IPv6 本地链路上的以下主要活动:
- 路由器搜索-帮助主机查找本地链路上的路由器。
- 地址自动配置-使节点能够为其接口自动配置 IPv6 地址。
- 前缀搜索-使节点能够搜索已分配给链路的已知子网前缀。节点使用前缀来区分位于本地链路上的目标和那些只能通过路由器来访问的目标。
- 地址解析-帮助节点确定相邻节点的链路本地地址(如果只给定目标的 IP 地址)。
- 确定下一个跃点-使用某种算法来确定本地链路之外的包接受者的跃点的 IP 地址。下一个跃点可以是路由器或目标节点。
- 相邻节点无法访问检测-帮助节点确定相邻节点是否不再可以访问。对于路由器和主机,可以重复进行地址解析。
- 重复地址检测-使节点能够确定其要使用的地址是否尚未被使用。
- 重定向-使路由器能够通知主机要用于到达特定目标的较好的第一个跃点节点。
相邻节点搜索使用下列类型的 ICMP 消息在链路上的节点之间进行通信:
- 相邻节点请求
- 相邻节点通告
- 路由器请求
- 路由器通告
- 重定向
IPv6 主机能够使用唯一的链路本地地址来自动配置自身的 IPv6 地址,一旦主机获得了 IPv6 地址,它就加入了多个组播组。与该段相关的所有通信仅在那些组播地址上发生。
- 邻居请求:通过 DHCP 自动获取或手动配置 IPv6 地址之后,主机向其所有 IPv6 地址的 FF02 :: 1/16 多播地址发送邻居请求消息,以此来确定没有 IPv6 地址冲突。
- DAD(重复地址检测):当主机不侦听来自段中关于其邻居请求消息的任何内容时,假定段上没有重复地址。
- 邻居通告:在将地址分配给其接口并使其启动和运行后,主机再次发出邻居通告消息,通知该段上的所有其他主机,它已分配这些 IPv6 地址其接口,其他的主机就不要再继续重复分配了。
一旦主机完成了其 IPv6 地址的配置,它会执行以下操作:
- 路由器请求:主机在其段上发送路由器请求 FF02 :: 2/16 组播数据包,以了解此段上所有存在的路由器。它帮助主机将路由器配置为其默认网关。如果其默认网关路由器关闭,主机可以切换到新的路由器,并使其成为默认网关。
- 路由器通告:当路由器接收到路由器请求消息时,它回应主机,通告它在该链路上的存在。
- 重定向:路由器收到了主机发出的路由器请求,但它知道自己并不是该主机的最佳网关。在这种情况下,路由器会响应一个重定向消息,告诉主机有一个更好的 “下一跳” 路由器可用。
NDP 替代了 IPv4 的 ARP(Address Resolution Protocol,地址解析协议)。ARP 报文封装在 L2 报文中,可视为 2.5 层协议。而 NDP 基于 ICMPv6(Internet Control Message Protocol,网络控制消息协议)实现,ICMPv6 报文(作为 IPv6 扩展头部)封装在 L3 报文中,可视为 3 层协议。NDP 在 L3 实现,优点是:可利用 L3 安全特性;可对不同介质的 L2 使用同一种地址解析协议;可使用组播替代广播,减轻 L2 网络压力。
NDP 定义了 5 种 ICMPv6 报文,分别是 NS(Neighbor Solicitation,邻居请求)、NA(Neighbor Advertisement,邻居通告)、RS(Router Solicitation,路由器请求)、RA(Router Advertisement,路由器通告)和 Redirect(重定向)。
前面已经提到,主机如何由 MAC 地址转换得到接口 ID(MAC-to-EUI-64),以及如何由接口 ID 构成链路本地地址(fe80:: + 接口 ID)。主机应进行重复地址检测,确认同一链路上没有其他接口使用同一地址,再将这个地址分配给接口。
这看起来似乎有些多余,由 MAC 地址转换得到的接口 ID 应是全球唯一的,构成的链路本地地址也应是全球唯一的。实际上,并不是所有类型的 L2 地址(链路层地址)都可提取出全球唯一的标识,重复地址检测是必要的。
假设主机 1 构成的链路本地地址为 IP A。主机 1 大喊一声:谁在用 IP A,答应我一声。如果等了一阵子,主机 1 没听到回应,就表示没人在用,可以将 IP A 分配给接口;相反,如果主机 1 听到回应,只能停止 Stateless 自动配置,转为手工配置。
无论哪种单播地址,在将 IP 占为己有之前,主机应将其标记为 Tentative(临时)状态,重复地址检测通过后再标记为 Valid(合法)状态。如果主机正在请求某个 IP(Tentative 状态),收到其他主机对同一 IP 的请求(NS),或已使用同一 IP 的通告(NA),主机应放弃这个 IP。极端情况是,每个请求主机都收到其他主机的请求而同时放弃这个 IP。
假设主机 1 请求 IP 为 IP A=fe80::1,主机 1 发送 NS 报文向其他节点询问,源地址为 ::(即未指定地址,请求 IP 还是 Tentative 状态,主机 1 不能用来做源地址),目的地址为 IP A 对应的 Solicited-Node 组播地址 FF02::1:FF00:1(固定前缀为 FF02::1:FF00::,低 48 位和 IP A 相同)。ICMP 报文类型为 135,Option 包含目标地址为 IP A(Target Address=FE80::1,注意区分目标地址和目的地址,这里是 ICMP 报文中的 Target Address,不是 IP 报文中的 Destination Address)。
加入同一 Solicited-Node 组的节点(即 IP 低 48 位和 IP A 相同的节点),比如说主机 2,收到 NS 报文后应查看 Option 包含的目标地址(IP A),如果主机 2 也在请求 IP A(Tentative 状态),应放弃 IP A,且不返回任何报文,如果主机 2 已在使用 IP A(Valid 状态),应发送 NA 报文向所有节点通告:源地址为 IP A,目的地址为组播地址 ff02::1,即同一链路上的所有节点。ICMP 报文类型为 136,Option 包含目标地址为 IP A。
主机如果想和同一链路的其他节点通信,需先获得对方的本地链路地址,进行地址解析,以获得对方的链路层地址(L2)。地址解析和重复地址检测过程有些相似,不同的是,NS 报文中询问的目标地址是别人的地址(而不是自己的地址),收到 NS 报文的节点应查看 Option 包含的目标地址,如果和自身地址相同,应返回NA报文通告自己的链路层地址。
NS 和 NA 报文都包含发送方的 IP 地址和链路层地址,通过上述过程双方均获得对方 IP 地址和链路层地址的绑定关系,并记录到邻居表中并进行维护。邻居状态包括 Empty、Incomplete、Reachable、Stale、Delay 和 Probe。简单的说,重复地址检测 NS 报文询问目标是自己的地址,不希望收到 NA 报文;地址解析 NS 报文询问目标是别人的地址,希望收到 NA 报文。
经过以上步骤,接口 ID 有了,就差前缀了。前缀从哪儿来呢,从路由器来。即使主机不主动找路由器,路由器也会周期性发送 RA 报文,向链路上所有节点通告前缀,这称为 Unsolicited RA。如果主机不想等,也可主动发送 RS 报文,催促路由器发送 RA 报文,这称为 Solicited RA。即使发送 RS 报文前就收到 RA 报文,主机也应至少发送一次 RS 报文,因为 Solicited RA 可能比 Unsolicited RA 报文包含更丰富的信息。
为了避免造成网络拥塞,主机不会在获得链路本地地址后立即发送 RS 报文,而是延迟一段随机时间后再发送,在大面积故障恢复(如停电结束)后链路不会同时涌入大量 RS 报文。同样道理,路由器的周期性 RA 报文也不是严格按照周期发送的,避免同一链路上的多个路由器同时发送 RA 报文。
假设主机链路本地地址为 IP A,路由器链路本地地址为 IP B。主机向同一链路所有路由器发送 RS 报文,请求路由器发送 RA 报文:源地址为 IP A,目的地址为 ff02::2,即同一链路所有路由器的组播地址,ICMP 报文类型为 133。
路由器收到 RS 报文后,向同一链路所有节点发送 RA 报文:源地址为 IP B,目的地址为 IPA(如果是 Unsolicited 通告则目的地址为 ff02::1,即同一链路所有节点的组播地址),ICMP 报文类型为 134。
RA 报文除了包含前缀(Prefix),还包含 MTU(最大传输单元)、Hop Limit(最大跳数)、Route(路由)、Router Lifetime(路由器生存期)、ReachableTime(可达性确认时间)和 RetransTimer(NS 重发时间间隔)等。路由器还会告诉主机使用 Stateless 还是 DHCPv6 获得全球唯一地址,以及如果使用 Stateless,上述其他信息是否通过 DHCPv6 获得。
经过第二步,接口 ID 有了,前缀也有了,主机将前缀和接口 ID 组合,就获得全球唯一地址。全球唯一地址是单播地址,主机应先进行重复地址检测,再将这个地址分配给接口。实际上,不管地址是通过 Stateless 配置的,还是通过 DHCPv6 配置的,甚至是手工配置的,都应进行重复地址检测。(某些厂家只检测链路本地地址,不检测全球唯一地址,是基于两者由相同接口 ID 构成的前提。实际上,这个前提并不成立,同一接口的多个单播地址不一定使用相同的接口 ID 构成)。
IPv6 地址自动配置
IPv6 的一个主要特征就是允许主机自动配置接口。通过相邻节点搜索,主机可以在本地链路上查找 IPv6 路由器并请求站点前缀。在自动配置过程中,主机将执行以下操作:
- 为每个接口创建链路本地地址,该操作不要求链路上有路由器。
- 检验地址在链路上是否唯一,该操作不要求链路上有路由器。
- 确定全局地址是应通过无状态机制、有状态机制还是这两种机制来获取。(要求链路上有路由器。)
无状态自动配置概述
无状态自动配置不需要手动配置主机,只需对路由器进行很少的配置(如果需要的话),而且不需要其他服务器。无状态机制允许主机生成其本身的地址。无状态机制使用本地信息以及由路由器通告的非本地信息来生成地址。
可以为接口实现临时地址,临时地址也是自动配置的。可以为主机上的一个或多个接口启用临时地址标记。但是,与自动配置的标准 IPv6 地址不同,临时地址由站点前缀和一个随机生成的 64 位数字组成。这个随机数将成为 IPv6 地址的接口 ID 部分。临时地址作为接口 ID 时,不会生成链路本地地址。
路由器将通告链路上已指定的所有前缀。IPv6 主机使用相邻节点搜索从本地路由器获取子网前缀。主机通过合并子网前缀和从接口的 MAC 地址生成的接口 ID 来自动生成 IPv6 地址。如果没有路由器,主机可以只生成链路本地地址。链路本地地址只能用于和同一链路上的节点进行通信。
IPv6 — 基于邻居发现协议的通信方式的更多相关文章
- “大地主”IPV6的邻居发现BD
引入 因为当初设计IPv4的时候,没有考虑到网络发展的速度这么快,到今现在IPv4有很多不足,32位的 IPv4地址不够用,现在128位的IPv6能完全够用,据说可以地球上每一粒沙子都分配一个地址,而 ...
- IPv6邻居发现协议
IPv6邻居发现协议 邻居发现协议NDP 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议.邻居发现协议替代了IPv4的ARP(Add ...
- H3C IPv6邻居发现协议
- CISCO实验记录三:CDP邻居发现
一.CDP邻居发现要求 1.识别二层连接 2.识别CDP邻居 二.CDP邻居发现操作 1.CDP邻居发现 #interface gigabitEthernet 0/0/0 //启动端口 #no shu ...
- 蓝牙—服务发现协议(SDP)
服务搜索协议(SDP)提供了应用发现可用服务以及确定可用服务特点的方法.SDP发现协议提供下面的能力 <1>为客户提供搜索所需要服务的能力. <2>允许基于服务类型搜索服务 & ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(7)-SDP服务发现协议
SDP的全称是Service Discovery Protocol,中文是服务发现协议.SDP(服务发现协议)是蓝牙协议体系中的核心协议,是蓝牙系统重要组成部分,是所有用户模式的基础.在蓝牙系统中.客 ...
- Netty中解码基于分隔符的协议和基于长度的协议
在使用Netty的过程中,你将会遇到需要解码器的基于分隔符和帧长度的协议.本节将解释Netty所提供的用于处理这些场景的实现. 基于分隔符的协议 基于分隔符的(delimited)消息协议使用定义的字 ...
- 简单服务发现协议(SSDP)编程指导
本文主要讲解如何使用ssdp进行编程,不涉及过多关于ssdp的理论知识 1. 前言 网上对ssdp理论介绍的一大把,缺乏从编程角度的一个指导,这里不会长篇大论ssdp理论,只是根据实际编码经验对用 ...
- EIGRP和OSPF__邻居发现
散知识点 1.当配置通配符时,它们的取值总是块尺寸减去1:/28的块尺寸为16,因此当我们添加网络声明时,使用了此子网号和一个在需配置的八位位组中添加值为15的通配符. 邻居发现 1.在EIGRP路由 ...
- 基于TCP/IP协议的C++网络编程(API函数版)
源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...
随机推荐
- #模拟#U137456 数字
题目 牛牛和他的小伙伴们高高兴兴的吃完了蛋糕,吃完蛋糕之后就到了牛牛和他的小伙伴们最喜欢的环节了--猜数 字, 这次是牛牛的生日,大家决定让牛牛来制定规则,由于牛牛的生日是4月7日,所以牛牛特别喜欢数 ...
- 开发人员使用HANA交付业务的学习路径
本文于2019年7月22日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 入门 编程规范. 开发环境使用方法. 基本语法,与其它同类软件的 ...
- 修复HTTP动词篡改导致的认证旁路问题的方法
本文于2016年4月完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 诡异的问题 分析AppScan扫描报告的时候,发现报告里提示" ...
- js获取select标签的 value 和 text
<select name="" id="test"> <option value="a1">yi</optio ...
- 批处理 if的知识点
正文 批处理的if不同于我们在一些常规语言中的if,比如说c或者c# 或者 java等. 如果我们判断两个字符是否相等,我们使用 'a'=='a' 来判断. 但是如果是不相等却不能这样. gtr 大于 ...
- flask售后评分系统
做软件行业的公司,一般都有专业的售前售后团队,还有客服团队,客服处理用户反馈的问题,会形成工单,然后工单会有一大堆工单流程,涉及工单的内部人员,可能会有赔付啥的,当然,这是有专业的售前.售后.客服团队 ...
- 初探Mysql架构和InnoDB存储引擎
前言 mysql相信大家都不陌生了,分享之前我们先思考几个面试题: 1.undo log和redo log了解过吗?它们的作⽤分别是什么? 2.redo log是如何保证事务不丢失的? 3.mysql ...
- threading的定时器模块,python,每间隔一段时间执行一次任务
工作中常有一些定时任务要处理,比如使用百度的接口,它的access_token是一个更新一次的,每次使用时总是请求会很慢,所以我们把它保存起来,用定时器模块,定时在过期之前请求一次,或者定时数据同步, ...
- 【2021.6.26 NOI模拟】Problem B. 简单题 another solution
Problem Description Input 从文件 b.in 中读入数据. 一个正整数 n. Output 输出到文件 b.out 中. 一个整数表示答案. Sample Data Input ...
- 鸿蒙HarmonyOS实战-ArkUI动画(弹簧曲线动画)
前言 弹簧曲线动画是一种模拟弹簧运动的动画效果,通过改变弹簧的拉伸或压缩来表现不同的运动状态.以下是制作弹簧曲线动画的步骤: 创建一个弹簧的模型,可以使用圆形或者曲线来代表弹簧的形状. 将弹簧固定在一 ...