当前位置: 首页 > news >正文

NDP(Neighbor Discovery Protocol)简介

定义

邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由设备发现(Router Discovery),它定义了使用ICMPv6报文实现路由设备发现、重复地址检测、地址解析、邻居不可达检测NUD(Neighbor Unreachability Detection)等功能。

目的

在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IPv6地址)。但是仅有IPv6地址是不够的,因为IPv6数据报文必须封装成帧才能通过物理网络发送,因此发送方还必须有接收方的物理地址(MAC地址),所以需要一个从IPv6地址到物理地址的映射,保证数据报文的传送能够顺利进行。

ND原理描述

IPv6地址解析

在IPv4中,当主机需要和目标主机通信时,必须先通过ARP协议获得目的主机的链路层地址。在IPv6中,同样需要从IP地址解析到链路层地址的功能。邻居发现协议实现了这个功能。

ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。ND本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于ND协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议。在三层完成地址解析,主要带来以下几个好处:

  • 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。

  • 可以使用三层的安全机制避免地址解析攻击。

  • 使用组播方式发送请求报文,减少了二层网络的性能压力。

地址解析过程中使用了两种ICMPv6报文:邻居请求报文NS(Neighbor Solicitation)和邻居通告报文NA(Neighbor Advertisement)。

  • NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
  • NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。

图1 IPv6地址解析过程示意图

Host A在向Host B发送报文之前它必须要解析出Host B的链路层地址,所以首先Host A会发送一个NS报文,其中源地址为Host A的IPv6地址,目的地址为Host B的被请求节点组播地址。同时需要指出的是,在NS报文的Options字段中还携带了Host A的链路层地址。

当Host B接收到了NS报文之后,就会回应NA报文,其中源地址为Host B的IPv6地址,目的地址为Host A的IPv6地址,Host B的链路层地址被放在Options字段中。这样就完成了一个地址解析的过程。

查看邻居状态

通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。 因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。

RFC中定义了5种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、探查(Probe)。

图2 邻居状态迁移示例

下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。

  1. A先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
  2. 若B回复NA报文,则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。
  3. 经过邻居可达时间,邻居状态由Reachable变为Stale,即不确定邻居节点的可达性。
  4. 如果在Reachable状态,A收到B的非请求NA报文,且报文中携带的B的链路层地址和表项中不同,则邻居状态马上变为Stale。
  5. 在STALE状态到达老化时间后进入Delay状态。
  6. 在经过一段固定时间(5秒)后,邻居状态由Delay变为Probe,其间若有NA应答,则邻居状态由Delay变为Reachable。
  7. 在Probe状态,A每隔一定时间间隔(1秒)发送单播NS,发送固定次数(3次)后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。

http://www.lryc.cn/news/424736.html

相关文章:

  • 为何要隐藏源 IP 地址?
  • 目前最流行的前端构建工具,你知道几个?
  • C++函数模板温习总结
  • 【网络】套接字(socket)编程——TCP版
  • 水凝胶生物打印是什么?如何指导Organoids培养?有啥好处?
  • 从springBoot框架服务器上下载文件 自定义一个启动器
  • 某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]
  • pythonselenium自动化测试实战项目(完整、全面)
  • 如何选择合适的虚拟机软件?对比Parallels Desktop 和VMware Fusion 使用虚拟机畅玩黑神话悟空
  • ESP32FreeRTOS开发笔记:2.定义、多任务与优先级调度
  • 【Python-办公自动化】1秒比较出2张表格之间的不同并标黄加粗
  • Linux下查看各进程的swap
  • 最后一个单词的长度 简单字符串问题
  • Autodesk Mudbox 2024:重塑创意边界的3D数字绘画与雕刻利器
  • 【python下用sqlite3, 多线程下报错,原因和解决 】
  • 学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信
  • 【DataKit系列】数据迁移-实例搭建步骤(二)
  • 发送jsonp请求(前后端如何实现)
  • Leetcode—1239. 串联字符串的最大长度【中等】(unordered_set)
  • Spring Boot 3.x Rest API统一异常处理最佳实践
  • 线程的进阶学习
  • 13.1 Python 正则表达式基础
  • 贪心算法介绍(Greedy Algorithm)
  • 谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发
  • 爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍
  • 【安卓】WebView的用法与HTTP访问网络
  • Mysql中文存入乱码???
  • 安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现
  • BGP的反射器(四)
  • proxy负载均衡