ipv6 基础学习(一)

IPv6

为什么要有IPV6?

IPv4地址空间有限:IPv4使用32位地址,最多可提供约43亿个地址。随着互联网设备数量的爆炸式增长,这些地址已经几乎耗尽。

IPv6地址空间庞大:IPv6使用128位地址,可以提供大约3.4×10^38个地址,理论上可以为地球上的每一粒沙子分配一个地址。

IPv6 特点

1. 地址空间扩展

IPv4使用32位地址,最多能提供约43亿个唯一的IP地址。随着互联网设备的爆炸性增长(如智能手机、物联网设备等),IPv4地址已经耗尽。而IPv6使用128位地址,能够提供约340万亿亿亿亿(3.4×10^38)个唯一地址,足以满足未来的需求。

2. 简化的网络配置

IPv6支持无状态地址自动配置( Stateless Address Autoconfiguration,SLAAC),允许设备在没有DHCP服务器的情况下自动获得IP地址。这样,网络配置和管理变得更加简单和自动化。

3. 增强的安全性

IPv6在设计时就考虑了安全性,IPsec(用于加密和验证IP包的协议)在IPv6中是强制的,而在IPv4中是可选的。这为IPv6网络提供了更强的安全保证。

4. 更高效的路由

IPv6的地址分配是基于分层结构的,使得路由表的大小大大减少,提高了路由效率。此外,IPv6还支持更高效的多播路由。

5. 改进的移动性支持

IPv6改进了对移动设备的支持,例如移动IPv6(MIPv6),使得设备在不同网络之间移动时能够保持其连接不变。

6. 消除网络地址转换(NAT)

由于IPv4地址短缺,NAT被广泛用于共享一个公共IPv4地址。然而,NAT增加了网络复杂性和管理开销,并且破坏了端到端连接的互联网模型。IPv6提供了足够的地址空间,使得每个设备都可以拥有一个唯一的全球可路由地址,消除了对NAT的需求。

7. 简化的报头结构

IPv6的报头结构被简化,某些字段被删除或变为可选,提高了路由器处理包的效率。尽管IPv6地址比IPv4长,但简化的报头结构在某些情况下可以提高网络性能。

8. 更好的扩展性

IPv6为未来的协议扩展提供了更好的支持。通过扩展头的使用,IPv6能够更灵活地添加新功能和服务,而不影响现有的协议结构。

IPv6地址

IPv6 地址是一种用于标识网络设备的 128 位地址,设计用于替代现有的 IPv4 地址系统。IPv6 地址由 8 组 4 个十六进制数字组成,每组之间用冒号(:)分隔。以下是一些关于 IPv6 地址的重要信息:

IPv6 地址格式

典型的 IPv6 地址示例:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

每个 IPv6 地址由 8 组 16 位组成,总共 128 位。

缩写规则

  1. 前导零压缩

    • 在每组中的前导零可以省略。例如,0db8 可以写成 db8

    原始地址:

    2001:0db8:0000:0000:0000:ff00:0042:8329
    

    可以缩写为:

    2001:db8:0:0:0:ff00:42:8329
    
  2. 连续零压缩

    • 一段连续的零可以用双冒号(::)代替。这种压缩在一个地址中只能出现一次。

    原始地址:

    2001:0db8:0000:0000:0000:ff00:0042:8329
    

    可以进一步缩写为:

    2001:db8::ff00:42:8329
    

IPv6 地址类型

一、单播地址(Unicast Address)

用于标识单个网络接口。

  1. 全局单播地址(Global Unicast Address)
    • 可在整个互联网范围内使用的唯一地址。
    • 2000::/3 开头。
    • 例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. 链路本地地址(Link-Local Address)
    • 用于单个链路上的通信,不会路由到互联网。
    • fe80::/10 开头。
    • 自动配置,用于邻居发现和路由器发现。
    • 例如:fe80::1a2b:3c4d:5e6f:7g8h
  3. 站点本地地址(Site-Local Address)
    • 类似于 IPv4 的私有地址,范围为 fec0::/10
    • 这种地址类型在最新的规范中已被弃用,推荐使用唯一本地地址(ULA)。
  4. 唯一本地地址(Unique Local Address,ULA)
    • 用于本地通信,不会在全局互联网路由。
    • fc00::/7 开头(通常是 fd00::/8)。
    • 例如:fd12:3456:789a:1::1
二、多播地址(Multicast Address)
  1. IPv6多播地址用于将数据包发送到一个特定的组,而不是单个设备或所有设备。多播地址的范围可以是链路本地、站点本地、组织本地或全球。IPv6多播地址的前缀是ff00::/8,其中的每一位和字段都有特定的意义。

    IPv6多播地址格式

    IPv6多播地址的格式如下:

    |11111111|flgs|scop| group ID |
    +--------+----+----+----------+
    |   8    | 4  | 4  |    112   |
    
    字段详细说明
    1. 11111111 (8 bits)
      • 固定前缀,表示这是一个多播地址。
    2. flgs (4 bits)
      • 标志位,用于定义多播地址的属性。常见的值包括:
        • 0: 常规多播地址。
        • 1: 永久多播地址。
        • 其他值根据特定用途定义。
    3. scop (4 bits)
      • 作用范围(scope),定义了多播地址的有效范围。常见的值包括:
        • 1:接口本地(Interface-local)
        • 2:链路本地(Link-local)
        • 5:站点本地(Site-local)
        • 8:组织本地(Organization-local)
        • E:全球(Global)
    4. group ID (112 bits)
      • 标识多播组的具体标识符。
    常见的IPv6多播地址
    • ff02::1
      • 所有节点的链路本地多播地址。发送到该地址的数据包将被链路本地范围内的所有设备接收。
    • ff02::2
      • 所有路由器的链路本地多播地址。发送到该地址的数据包将被链路本地范围内的所有路由器接收。(RS 中的目的地址
    • ff05::2
      • 所有路由器的站点本地多播地址。发送到该地址的数据包将被站点本地范围内的所有路由器接收。
    • ff02::1:ffXX
      • Solicited-node多播地址。用于邻居发现协议(NDP)中的地址解析过程。 (NS 中的目的地址
三、任播地址(Anycast Address)

用于标识一组接口,但数据包只传送到距离最近的一个接口。

  • 没有特定的前缀,可以从单播地址中分配。
  • 常用于负载均衡和服务冗余。
四、特殊的 IPv6 地址
  1. 未指定地址(Unspecified Address)
    • 表示没有指定的地址。
    • :: 表示,相当于所有 128 位都是零。
  2. 环回地址(Loopback Address)
    • 用于设备自身通信。
    • ::1 表示。
五、 IPv6 地址范围和前缀总结
地址类型前缀示例
全局单播2000::/32001:0db8:85a3::8a2e:0370:7334
链路本地fe80::/10fe80::1a2b:3c4d:5e6f:7g8h
唯一本地fc00::/7fd12:3456:789a:1::1
多播地址ff00::/8ff02::1
未指定地址::/128::
环回地址::1/128::1

这种分层和详细的分类方式可以帮助更好地理解和记忆IPv6地址类型及其用途。

IPv6 地址分配

IPv6 地址的分配由 IANA(Internet Assigned Numbers Authority)和各个区域性互联网注册机构(RIRs)负责。IANA 分配给 RIRs 大块的地址空间,然后由 RIRs 进一步分配给 ISP 和最终用户。

IPv6 实现

ICMPv6

互联网控制消息协议第六版Internet Control Message Protocol Version 6

在 RFC 4443 中被定义;

用于报告IPv6节点数据包处理过程中的错误消息和完成一些网络诊断功能(如ping和traceroute等)

除了ICMPv4原有的功能,ICMPv6还承担了IPv4其他协议所实现的功能或IPv6所需的新功能,例如邻居发现协议(同时取代了ARP/RARP,SEND作为其安全扩展)、多播管理(取代了IGMP)

ICMPv6的功能

ICMPv6提供以下主要功能:

  1. 错误报告:当路由器或主机在处理IPv6数据包时遇到问题时,ICMPv6会发送错误消息。
  2. 信息查询:用于主机和路由器之间的信息交换,如邻居发现(Neighbor Discovery)和路由器通告(Router Advertisement)。
  3. 组播监听:管理组播组成员资格。
ICMPv6消息类型

ICMPv6消息分为两类:错误消息和信息消息。

错误消息
  1. 目的不可达(Destination Unreachable)
    • 类型:1
    • 用于通知发送方目标地址不可达。
    • 子类型包括:没有路由到目标地址、通信管理被禁止、地址不可达、端口不可达等。
  2. 分片超出(Packet Too Big)
    • 类型:2
    • 当数据包大小超过路径MTU(最大传输单元)时,通知发送方分片超出。
  3. 超时(Time Exceeded)
    • 类型:3
    • 用于通知发送方数据包在传输过程中因跳数限制或传输时间过长而被丢弃。
  4. 参数问题(Parameter Problem)
    • 类型:4
    • 用于通知发送方数据包中的某些参数有问题,如报头字段无效。
信息消息
  1. 回显请求(Echo Request)和回显应答(Echo Reply)
    • 类型:128(回显请求),129(回显应答)
    • 用于诊断网络连接情况,类似于IPv4中的Ping。
  2. 邻居发现协议(Neighbor Discovery Protocol, NDP)
    • 邻居请求(Neighbor Solicitation)
      • 类型:135
      • 用于查询邻居节点的链路层地址。
    • 邻居通告(Neighbor Advertisement)
      • 类型:136
      • 用于响应邻居请求或通告地址变化。
    • 路由器请求(Router Solicitation)
      • 类型:133
      • 主机请求路由器发送路由器通告消息。
    • 路由器通告(Router Advertisement)
      • 类型:134
      • 路由器向本地链路上的所有节点通告其存在及配置信息。
    • 重定向消息(Redirect Message)
      • 类型:137
      • 路由器通知主机有更好的下一跳地址。
  3. 组播监听(Multicast Listener Discovery, MLD)
    • 组播监听器查询(Multicast Listener Query)
      • 类型:130
    • 组播监听器报告(Multicast Listener Report)
      • 类型:131
    • 组播监听器终止(Multicast Listener Done)
      • 类型:132
ICMPv6消息格式

ICMPv6消息的基本格式如下:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Message Body                          +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type:消息类型,指示消息的用途。

Code:消息子类型,进一步指示消息的具体含义。

Checksum:校验和,用于检测消息在传输过程中是否被损坏。

Message Body:消息的具体内容,根据消息类型和子类型不同而变化。

ND 协议

说明

用于IPv6网络中的路由器向本地链路上的所有节点广播配置信息。RA报文在无状态地址自动配置(SLAAC)和邻居发现协议(NDP)中起着至关重要的作用。

示例

image-20240721185835629

Router Solicitation(RS,路由器请求)

报文是IPv6中的一种ICMPv6消息,用于主机请求本地链路上的路由器发送Router Advertisement(RA,路由器通告)报文。RS报文通常在主机启动或网络接口启用时发送,以快速获取路由信息和网络配置。

RS 报文格式

RS报文的格式如下:

diff复制代码+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Reserved                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明
  • Type(类型): 133

    • 表示这是一个Router Solicitation消息。
  • Code(代码): 0

    • 必须设置为0。
  • Checksum(校验和): 16位

    • 用于检测报文在传输过程中是否被损坏。
  • Reserved(保留位): 32位

    • 保留用于将来使用,应设置为0。
  • Options(选项): 可变长度

    • 包含源链路层地址等选项。每个选项有一个通用格式:

      diff复制代码+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |     Type      |    Length     |       Option Data ...
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
    • Type: 选项类型。

    • Length: 选项长度(以8字节为单位)。

    • Option Data: 选项的具体数据。

常见的RS报文选项
  1. 源链路层地址(Source Link-Layer Address
    • Type: 1
    • Length: 1(8字节)
    • Option Data: 包含发送RS报文的主机的MAC地址。
示例RS报文

假设有一个RS报文,其中包含了源链路层地址选项:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     133       |      0        |          0x1234               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            0                                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

image-20240721183549136

选项部分的示例
  1. 源链路层地址(Source Link-Layer Address)

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |      1        |      1        |  00:11:22:33:44:55            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
RS 报文的工作流程
  1. 主机发送RS报文
    • 当主机启动或网络接口启用时,主机会发送RS报文到本地链路上的所有路由器。
  2. 路由器接收RS报文
    • 本地链路上的路由器接收到RS报文后,会发送RA报文,提供网络配置和路由信息。
  3. 主机接收RA报文
    • 主机接收RA报文后,根据RA报文中的信息进行网络配置,包括IPv6地址配置、默认路由器、MTU等。
RA(Router Advertisement,路由器通告)
报文格式
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Prf|Resvd|       Router Lifetime         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Reachable Time                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Retrans Timer                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type(类型): 134

  • 表示这是一个Router Advertisement消息。

Code(代码): 0

  • 必须设置为0。

Checksum(校验和):

  • 用于检测报文在传输过程中是否被损坏。值会根据报文内容计算。

Cur Hop Limit(当前跳数限制): 64

  • 建议主机在发送数据包时使用的默认跳数限制。默认值为64。

M(管理地址配置标志): 0

  • 如果设置为1,表示主机应使用DHCPv6获取地址。默认值为0(未使用DHCPv6获取地址)。

O(其他配置标志): 0

  • 如果设置为1,表示主机应使用DHCPv6获取其他配置信息。默认值为0(未使用DHCPv6获取其他信息)。

H(家庭代理标志): 0

  • 用于家庭代理配置(RFC 6275)。默认值为0(未使用)。

Prf(路由器优先级): 00

  • 路由器优先级。默认值为00(Medium)。

Resvd(保留位): 000000

  • 保留用于将来使用,应设置为0。

Router Lifetime(路由器寿命): 1800

  • 表示该路由器作为默认路由器的有效时间(以秒为单位)。默认值为1800秒(30分钟)。

Reachable Time(可达时间): 0

  • 表示邻居保持可达状态的时间(以毫秒为单位)。默认值为0(使用默认值)。

Retrans Timer(重传计时器): 0

  • 邻居请求消息的重传时间(以毫秒为单位)。默认值为0(使用默认值)。
RA 报文示例

image-20240721181549064

flag 示例

image-20240721181807949

Neighbor Solicitation(NS,邻居请求)

是IPv6中的一种ICMPv6消息,用于邻居发现协议(NDP)。NS报文用于解决IPv6地址到链路层地址的映射问题,类似于IPv4中的ARP请求。

NS 报文格式

NS报文的格式如下:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Reserved                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                       Target Address                          +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详细说明
  • Type(类型): 135
    • 表示这是一个Neighbor Solicitation消息。
  • Code(代码): 0
    • 必须设置为0。
  • Checksum(校验和): 16位
    • 用于检测报文在传输过程中是否被损坏。
  • Reserved(保留位): 32位
    • 保留用于将来使用,应设置为0。
  • Target Address(目标地址): 128位
    • 目标节点的IPv6地址。
  • Options(选项): 可变长度
    • 通常包含源链路层地址选项,用于提供发送NS报文的节点的链路层地址。
常见的NS报文选项
  1. 源链路层地址(Source Link-Layer Address)
    • Type: 1
    • Length: 1(8字节)
    • Option Data: 包含发送NS报文的节点的链路层地址(MAC地址)。
选项部分的示例
diff复制代码+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      1        |      1        |       Source Link-Layer Address
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
示例NS报文

假设有一个NS报文,其中包含了源链路层地址选项:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     135       |      0        |          0x1234               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            0                                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                   2001:0db8::1 (Target Address)               +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      1        |      1        |  00:11:22:33:44:55            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

image-20240721185519697

NS 报文的工作流程
  1. 发送NS报文
    • 当一个节点需要解析另一个节点的链路层地址时,它会发送一个NS报文。NS报文的目标地址是要解析的IPv6地址,目的地址是目标地址的Solicited-Node多播地址。
  2. 接收NS报文
    • 目标节点接收到NS报文后,会检查报文中的目标地址是否匹配。如果匹配,目标节点会发送一个Neighbor Advertisement(NA)报文作为响应。
  3. 发送NA报文
    • 目标节点发送NA报文,其中包含目标节点的链路层地址信息。源节点接收到NA报文后,可以更新其邻居缓存表,将IPv6地址与链路层地址对应起来。
NS 报文示例

假设有以下网络场景:节点A(IPv6地址为 2001:db8::a,链路层地址为 00:11:22:33:44:55)想要解析节点B(IPv6地址为 2001:db8::b)的链路层地址。

节点A发送NS报文
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     135       |      0        |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            0                                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                   2001:db8::b (Target Address)                +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      1        |      1        |  00:11:22:33:44:55            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
节点B接收并响应NA报文

假设节点B的链路层地址为 66:77:88:99:aa:bb,它会发送以下NA报文:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     136       |      0        |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O|        Reserved         |       Target Address          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                                                               |
+                   2001:db8::b (Target Address)                +
|                                                               |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      2        |      1        |  66:77:88:99:aa:bb            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Neighbor Advertisement(NA,邻居通告)

报文是IPv6中的一种ICMPv6消息,用于邻居发现协议(NDP)。NA报文主要用于以下两种情况:

  1. 响应Neighbor Solicitation(NS,邻居请求)报文:当节点A发送NS报文请求节点B的链路层地址时,节点B通过NA报文回应。
  2. 通告自身的链路层地址:节点在网络上宣布自己的链路层地址(MAC地址),类似于免费ARP
NA 报文格式

NA报文的格式如下:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O|        Reserved         |       Target Address          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详细说明
  • Type(类型): 136

    • 表示这是一个Neighbor Advertisement消息。
  • Code(代码): 0

    • 必须设置为0。
  • Checksum(校验和): 16位

    • 用于检测报文在传输过程中是否被损坏。
  • R(Router): 1位

    • 表示发送者是否是一个路由器。设置为1表示发送者是一个路由器。
  • S(Solicited): 1位

    • 表示这是对一个NS报文的回应。设置为1表示这是对NS报文的回应;设置为0表示这是一个主动通告消息。
  • O(Override): 1位

    • 表示是否覆盖邻居缓存中的现有条目。设置为1表示覆盖。
  • Reserved(保留位): 29位

    • 保留用于将来使用,应设置为0。
  • Target Address(目标地址): 128位

    • 目标节点的IPv6地址,这也是发送NA报文的节点的IPv6地址。
  • Options(选项): 可变长度

    • 通常包含源链路层地址等选项。每个选项有一个通用格式:

      diff复制代码+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |     Type      |    Length     |       Option Data ...
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
    • Type: 选项类型。

    • Length: 选项长度(以8字节为单位)。

    • Option Data: 选项的具体数据。

常见的NA报文选项
  1. 源链路层地址(Source Link-Layer Address)
    • Type: 1
    • Length: 1(8字节)
    • Option Data: 包含发送NA报文的节点的链路层地址(MAC地址)。
示例NA报文

假设节点A(IPv6地址为 2001:db8::a,链路层地址为 00:11:22:33:44:55)要响应节点B(IPv6地址为 2001:db8::b)的NS报文:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     136       |      0        |          0x1234               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | 1 | 0 |        0          |       2001:db8::a             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      1        |      1        |  00:11:22:33:44:55            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

image-20240721191117465

解释
  • Type: 136(表示这是一个NA报文)。
  • Code: 0(代码字段为0)。
  • Checksum: 0x1234(校验和)。
  • R: 1(节点A是路由器)。
  • S: 1(这是对NS报文的回应)。
  • O: 0(不覆盖现有条目)。
  • Target Address: 2001:db8::a(发送NA报文的节点的地址)。
  • Options: 包含源链路层地址 00:11:22:33:44:55
NA 报文的工作流程
  1. 响应NS报文
    • 当一个节点(如节点B)接收到NS报文时,如果NS报文的目标地址与其自身的地址匹配,节点B会发送一个NA报文来响应请求。NA报文中包含目标地址(节点B的地址)及其链路层地址。
  2. 主动通告
    • 节点也可以主动发送NA报文,通告自己的链路层地址,这在网络拓扑变化时非常有用,确保其他节点了解其链路层地址。
  3. 更新邻居缓存
    • 接收到NA报文的节点会更新其邻居缓存,将IPv6地址和链路层地址的映射关系保存起来,以便后续通信使用。
NA 报文的作用
  • 地址解析: 通过NA报文,节点可以快速获取目标节点的链路层地址,实现IPv6地址到链路层地址的映射。
  • 邻居可达性检测: NA报文用于检测节点的可达性,确保网络通信的稳定性和可靠性。
重定向

Redirect 报文是IPv6中的一种ICMPv6消息,用于邻居发现协议(NDP)。它用于向源节点通知某个数据包的更优转发路径,通常是更接近目标的路由器。这在网络拓扑发生变化时非常有用,能够帮助主机更新其路由信息,从而优化数据包的传输路径。

Redirect 报文格式

Redirect报文的格式如下:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Reserved      |        Target Address                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Redirected Header Address                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Options ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详细说明
  • Type(类型): 137
    • 表示这是一个Redirect消息。
  • Code(代码): 0
    • 必须设置为0。
  • Checksum(校验和): 16位
    • 用于检测报文在传输过程中是否被损坏。
  • Reserved(保留位): 24位
    • 保留用于将来使用,应设置为0。
  • Target Address(目标地址): 128位
    • 数据包原本要发送到的目标IPv6地址。
  • Redirected Header Address(重定向报头地址): 128位
    • 指出重定向后的新路由器的IPv6地址,通常是当前路由器的地址,这个字段用于指出从源主机到目标地址的最佳路径。
  • Options(选项): 可变长度
    • 通常包含源链路层地址等选项,用于提供发送Redirect报文的路由器的链路层地址。
常见的Redirect报文选项
  1. 源链路层地址(Source Link-Layer Address)
    • Type: 1
    • Length: 1(8字节)
    • Option Data: 包含发送Redirect报文的路由器的链路层地址(MAC地址)。
示例Redirect报文

**假设节点A(IPv6地址为 2001:db8::a)通过路由器R(IPv6地址为 2001:db8::r)发送数据包到节点B(IPv6地址为 2001:db8::b),但路由器R发现直接将数据包发送到节点B的路径更优,因此R发送了一个Redirect报文给节点A。假设R的链路层地址为 00:11:22:33:44:55,**示例Redirect报文如下:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     137       |      0        |          0x1234               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            0                                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   2001:db8::b (Target Address)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   2001:db8::r (Redirected Header Address)      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      1        |      1        |  00:11:22:33:44:55            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
解释
  • Type: 137(表示这是一个Redirect报文)。
  • Code: 0(代码字段为0)。
  • Checksum: 0x1234(校验和)。
  • Reserved: 0(保留位)。
  • Target Address: 2001:db8::b(原始目标地址)。
  • Redirected Header Address: 2001:db8::r(重定向后的新路由器地址)。
  • Options: 包含源链路层地址 00:11:22:33:44:55
Redirect 报文的工作流程
  1. 检测更优路径
    • 路由器在转发数据包时,如果发现有更直接的路径到达目标地址,它会生成Redirect报文。
  2. 发送Redirect报文
    • 路由器将Redirect报文发送到原始数据包的源节点,告知源节点一个更优的路径。
  3. 更新路由
    • 源节点接收到Redirect报文后,会更新其路由信息,直接将数据包发送到重定向的目标地址,而不是通过原始的路由器。
  4. 优化数据传输
    • 更新后的路由信息有助于优化数据包的传输路径,提高网络性能和效率。
使用场景
  • 网络拓扑变化: 当网络拓扑发生变化时,路由器可以通过Redirect报文通知主机更新其路由信息。
  • 路径优化: 在某些情况下,数据包可以通过更短的路径到达目标地址,Redirect报文可以帮助源节点优化路径选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381203.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫自己做的

1.urllib 1.1基本使用 1.2 下载(图片,页面,视频) 1.3 get 1.3.1 quote 中文变成对应uncode编码 当url 的wd中文时 quote是将中文变成对应uncode编码 然后拼接成完整的url 1.3.2urlencode方法 wd有多个参数 1.3.3ajas get实例 …

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。(add /commit /版本撤销回退/分支管理) Git是一个分布式 的版本控制系统。 分支…

动漫风格动漫404网站维护HTML源码

源码介绍 动漫风格动漫404网站维护HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 效果预览 源码下载 动漫风格动漫404网站维护HTML源码

【存储学习笔记】1:机械硬盘(Hard Drive Disk)结构和寻址方式

目录 HDD的结构HDD的寻址方式CHS寻址(不适用于等密度结构磁盘)LBA寻址(目前普遍使用的线性寻址方式) HDD的寻址速度 HDD的结构 盘面(Platter):单面或者双面覆盖着用于记录数据的磁性物质&#x…

Gateway源码分析:路由Route、断言Predicate、Filter

文章目录 源码总流程图说明GateWayAutoConfigurationDispatcherHandlergetHandler()handleRequestWith()RouteToRequestUrlFilterReactiveLoadBalancerClientFilterNettyRoutingFilter 补充知识适配器模式 详细流程图 源码总流程图 在线总流程图 说明 Gateway的版本使用的是…

配置单区域OSPF

目录 引言 一、搭建基础网络 1.1 配置网络拓扑图如下 1.2 IP地址表 二、测试每个网段都能单独连通 2.1 PC0 ping通Router1所有接口 2.2 PC1 ping通Router1所有接口 2.3 PC2 ping通Router2所有接口 2.4 PC3 ping通Router2所有接口 2.5 PC4 ping通Router3所有接口 2.…

【Gitlab】记一次升级 Gitlab 后 API 失效的问题

背景 前段时间,因内部使用的 Gitlab 版本存在漏洞,需要进行升级,于是乎,将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后,今天,突然发现这个接口获取不到…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

在树莓派4B上部署yolov8环境完成高帧率检测任务

目录 前言 在树莓派上安装Pytorch 在树莓派上安装Ultralytics环境 在树莓派上初步测试模型 在树莓派上安装NCNN 用NCNN模型实现高帧率检测 前言 在我前面的文章里讲了如何用yolov8从0开始训练自己的模型,现在这篇文章将教大家如何在树莓派上部署yolov8的环境…

【BUG】已解决:TypeError: Descriptors cannot not be created directly.

已解决:TypeError: Descriptors cannot not be created directly. 目录 已解决:TypeError: Descriptors cannot not be created directly. 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来…

适用于618/7xx芯片平台 AT开发 远程FOTA升级指南教程

简介 AT版本的远程升级主要是对AT固件版本进行升级,实际方式为通过合宙官方IOT平台升级或者使用自己搭建的服务器进行升级服务。 该文档教程流程适用于 618/716S/718P 芯片平台的Cat.1模块 合宙IOT平台配置 升级日志 —— 如何查看 升级日志 —— 响应码列表 响应…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决:ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市…

Unity-URP-SSAO记录

勾选After Opacity Unity-URP管线,本来又一个“bug”, 网上查不到很多关于ssao的资料 以为会不会又是一个极度少人用的东西 而且几乎都是要第三方替代 也完全没有SSAO大概的消耗是多少,完全是黑盒(因为用的人少,研究的人少,优…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时,每个小部件都被视为具有四个同心矩形的框:边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式: 边距超出边框。边框绘制在边…

1.Fabric框架

要了解Fabric,首先要知道Hyperledger开源项目。 2015年12月,由开源世界的旗舰组织Linux基金会牵头,30家初始企业成员共同宣布Hyperledger联合项目成立。Hyperledger 超级账本,是首个面向企业应用场景的分布式账本平台&#xff0c…

【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)

写在前面 内容如何选择 本翻译只翻译本人认为精华的部分,本人认为的Spark的一些核心理念,编程思想。一些特别基础的操作包括但不限于搭建环境就不在此赘述了。 配套版本 本系列基于Spark 3.3.1,Scala 2.12.10,进行翻译总结 原…

nginx通过nginx_upstream_check_module实现后端健康检查

1、简介说明 nginx是常用的反向代理和负载均衡服务,具有强大并发能力、稳定性、丰富的功能集、低资源的消耗。 nginx自身是没有针对后端节点健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏:http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串,如下所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的…

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式(Lazy Loading) 一、单例模式 1.1 基本概念 一个类只能生成一个实例,且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…