- 作者: 雪山肥鱼
- 时间:20210724 18:08
- 目的:IPV6 的基础概念
# ipv4 存在的问题
# ipv6 的特点
## ipv6的报头改进
# ipv6的编制
# ipv6 地址空间
## 广播 vs 组播
## 单播地址
## unique local address
## link local address
## interface id
# 组播地址
## 组播地址 被请求节点的组播地址 - solicited-node
# stateless 无状态获取地址
# icmpv6
## icmpv6 概述
## PMTU
## ipv6 邻居发现协议(NDP)
## 邻居状态跟踪
## DAD 概述
## 无状态自动配置
## 地址分配总结
## ipv6 地址 前缀 公告时间
## icmpv6 重定向
# DHCP - DP
ipv4 存在的问题
- 地址耗尽
- internet 路由表增大
- 缺乏真正的端到端模型
缺乏端到端,指的是 ipv4 的扩展基于NAT. 私有ip的布局,是被包裹在NAT 中的。除了静态映射NAT,外部是无法直接访问私网IP的。不能做到真正意义上的端到端。
ipv6特点
- 128bits 16个字节 地址方案(ipv4 32bit 4个字节)
- 多等级层次,有助于路由聚合,即路由汇总
- 无状态/有状态 自动配置地址,允许ipv6网络中的节点,加入更加便捷
- 重新编制机制,更加透明
- 无需NAT
- 无ARP,利用 icmpv6 替代 ARP
-
包头比ipv4 更有效率,无option字段,增加扩展部分.
Next header 与 ipv4 中的option 类似。可能有0-多个 报头。
IPV6包头改进
- 取消IP的校验
- 2 4层的校验已经足够见状了,因此ipv6 取消了 ip 3层校验
- 取消中间节点的分片共鞥你
- PMTU机制发现路径MTU
- 定义了最长的ipv6 报文疮毒
- 安全支持, 提供IPSec 完美支持
- 增加流标签
- 提高QOS效率
next header 存的是协议号,后面挂着这个协议号的包
- 扩展报头只有目标节点查看,其他节点不查看和处理报头
- 要按顺序查看扩展报头的内容
ipv6 的编址
- ipv6 地址为 128位
- 使用冒号分隔16进制格式,分成8段
2001:0da8 : 0207 : 0000 : 0000 : 0000 : 0000 : 8207 - ipv6 有多种呈现方式
缩写:
2001:da8:207::8207
IPV6 地址空间
ipv6 没有定义广播地址!
广播 vs 组播
- 广播域中的每个节点都会收到包
- 节点收到包后,识别FFFF是广播的, 随后要做帧校验,看看有没有损坏。
- 看帧头中放的type 是什么协议,就知道上层是什么包,如果是IP包,就交给ip协议栈处理
- IP协议栈发现目的地址是 FFFF 广播的,不确定自己要不要,同样做校验和,没有虽坏,再看下ip头里的协议字段是什么。
- 再把ip头剥掉,读取数据发现不是我要的。丢掉
整套分析流程的复杂性导致广播有较大的危害性。
而组播的地址224.0.0.0到239.255.255.255 且与 网卡有map关系。那么 网卡在收到包是,在二层判断一下,是不是本组里要的。如果不是 直接丢弃,提高效率。
广播为人诟病,但ipv4 离不开广播,因为需要ARP 获取 二层的 mac地址。
单播地址
-
Aggregatable global unicast address
相当于IPV4 全局单播地址
前缀的 前48位交给运营商,后16位专属子网自己规划.
后64位标识接口ID.
前缀与接口ID两者组成可聚合全球单播地址。- 范围:2000:: -》 3FFFF:....:FFFF
由此可看出,可聚合全球单薄地址占IPV6总地址空间的8分之一
- 范围:2000:: -》 3FFFF:....:FFFF
- Unique local address(私有ip,公网不可出现)
- link-local address (一段链路上)
Unique local Address
ULA 是 IPV6私有地址,只能够在内网中使用,该地址空间在ipv6公网不可路由,不能直接访问公网
地址空间位 FC00::/7
FC00/7 被分为 两个 /8的块,其中 FC00:/8 暂未定义, FD00::/8的定义如下。其实也就是第一个字节最后一位可以是0 可以是1,那么就分成了两块。
Link Local address
- 链路本地地址,有效范围为本地链路地址
- 以FE80::/10为前缀,此外第11 - 64位为0, 外加一个64位接口标识
- 用于自动地址配置(无状态),邻居发现,路由发现等
地址举例:fe80::1234:1234:1234:1234 -
在一条链路上,必须知道对方节点的链路本地地址,如果不知道,将是不能通信的,所以一条链路中的IPV6节点要通信,必须拥有链路本地地址,并且这个链路本地地址只在一条链路中有效,也不能被路由,而不同链路的链路本地地址是可以重复的。
应用场景如下:
LLA 地址唯一
接口ID
- 接口ID我i64位, 用于标识链路上的接口地址,在每条链路上接口ID必须唯一
- 接口ID配置主要有以下几种方式:
- MAC地址转换
- 手工配置接口ID
- 随机生成
- 接口ID的作用
- 用于构成linklocal地址
- 可在无状态配置环境中用于构成全局单播piv6地址
组播地址
用来标识一组接口,发送给多播地址的数据流同时传输到多个目的。
范围:FF00::/8
常见的IPV6组播地址:
- FF02::1 链路上的所有节点
- FF02::2 链路上的所有路由器
- FF02::9 链路上的所有RIP路由器
- FF02::5 链路上的所有OSPF路由器
- FF02::6 链路上的所有 OSPF DR路由器
最后32位为Group ID
组播地址的mac映射
要想加入这个组播的网卡,才会接受信息。也就是mac必须与相关组播产生一定关系才能加入这个组。
33-33 是固定的。
组播地址 - 被请求节点组播地址 solicited-node
- 主要用于重复地址检查(DAD) 和 替代ipv4的ARP
ARP 广播
IPV6 中依靠icmpv6, 用 NS/NA, NS请求某个ipv6全局单播地址对应的MAC,消息发送的就不是广播了,而是发送到 Solicited-node 被请求节点组播地址. 而这个Solicited-node的地址 与 要被请求的ipv6地址的mac 是有对应关系的。 - 由前缀FF02::1:FF00:0/104 和 ipv6单播地址的最后24位组成
- Solicited-node 地址受限范围为本地链路范围
- 一个ipv6 单播地址对应一个 Solicited-node 地址
前104bits 后24位直接从 单播地址的后24位拷贝下来。
stateless 无状态自动获取地址
ipv6 地址配置方式:
路由器上直接配一个静态地址
linklocal 地址是自动配置的
-
无状态配置地址
和路由器交互,得到ipv6 prefix。同样路由器需要增加 ipv6 的相关配置
no ipv6 nd supress-ra, 让路由器发RA(icmpv6 路由通告)消息
有状态配置地址:dhcp 申请地址。
通过dhcp申请地址,需要对 作为dhcpserver 的 路由器进行设置,同时主机自己也需要设置,把自己设置成dhcp client.
ICMPv6
ICMPv6 概述
- icmpv6 是 IPV6的基础协议之一
- ipv6 报头的 “Next Header” 字段中的协议号是58
-
ICMP报文有两种,差错消息和信息消息
type + code 构成了icmpv6 的消息类型
了解就好:
PMTU
PMTU: 路径最小 MTU
原理就是尝试找到沿途最小的MTU值,最后用路径上最小的包进行传输。这样沿途就不必再分包,减小压力,提高效率。
IPV6 邻居发现协议(NDP)
利用icmpv6 实现的 邻居发现功能。即Neighbor Discovery Protocol
用ICMPv6 实现地址解析
ipv4 是通过arp 来获取目的的mac地址
报文结构:
源mac:
目的mac:FFFF
源ip+源目的
目的IP+目的mac
ipv6流程:
-
背景
-
A 给B 发送 NS 消息,请求B的MAC地址
发送的NS 携带的信元有:
- 源mac 地址
- 目的mac地址:3333固定 + 目的mac地址的后32位
- 源ip
- 目的NS ip 是一个组播地址: FF02::1:FF00:B (个人觉得这个地址才是对的,图片中有误)前104位固定,后24位为目的的interfaceid 取 24位。
节点B 会 监听 NS地址,也就是 FF02::1:0:B
3 B 给 A 的 NA 消息
很明显 无论是 2层,还是 data段 都放了 B 的 MAC 地址。
上述NS 是单个节点即单播的的NS,如果抓包中有 ff02::1,那么就是群发的NA
IPV6 中无 ARP 表(ip 和 mac 的映射表), 维护的是 ipv6 的邻居表
邻居状态跟踪
- A 发送NS, 并生成邻居缓存条目,此时邻居的状态位 incomplete
- 如果B 回复了NA, 则邻居从incomplete -> Reachable. 如果没回,则进入 empty(一段时间后会删掉这个条目)。
- reachable 保持一定时间(比如30s) 会切换到 stale状态(老旧的),或者收到B 刷新了新的mac地址的 NA,也会切换到stale状态。
- 如果B的状态为stale, 此时A向B发送数据,数据发出后,B在A中的邻居表状态从stale -> delay. A等待B的回复
- 如果在 Delay_first_probe_time(默认5s)内,有NA 或者 B的消息抵达,则从 delay -> reachable
- 5s 后 进入 probe状态,每个1s 发送单播的 NS, 默认发送3此,如果有NA,则切换到Reachable,如果没有 则 Empty。删除条目。
DAD 概述
duplicate address detection 地址重复检测机制
当一个ipv6接口激活后,或者当一个接口获得了ipv6地址(无论是有状态还是无状态自动配置)都会启动ipv6地址的dad机制,以确保该地址在链路上的唯一
DAD机制使用icmpv6 的 NS 和 NA消息实现。
对于ipv6来说,一个网卡会有多个ipv6的地址,每一个ipv6地址都要通过DAD检测,否则这个地址不可用。
- ipv6地址在通过DAD之前成为 tentative地址,该地址还暂时不能进行正常的单播通讯,除非经过DAD检测
- 节点向一个自己将使用的tentative地址所对应的 solicited-node 组播地址发送一个NS, 如果收到其他站点站点的 NA,就证明该地址被使用。则不能使用该tentative地址通讯。
DAD 过程:
R1 在线,已经使用了ip地址。
注意源地址 :: 因为现在用的地址还不能使用,是tentative的。
目的地址是 tentative地址即将使用的NS。
data数据里存即将使用的地址。
首先R1看目的mac,也是自己所监听的,目的地址也是R1监听的NS。发现与自己所监听的相同,且内部ip也相同。则R2的tentative地址不能使用。回复一个 NA。
回复的目的地址是 FF02::1, 意思是向链路所有的节点宣告自己的ip地址和mac。
同理 link local address 也要做 DAD检测。
无状态自动配置
ipv6 地址的配置
- 手工配置
- 自动配置
- 状态化配置(stateful)
DHCPv6 ,架设dhcp6 server - 无状态化配置(stateless)
通过icmpv6的 RS RA 两种消息,让节点与路由器交互,得到ipv6前缀。
- 状态化配置(stateful)
所以IPV6 特点:
- 即插即用,ipv6 无需手工配置
- 无需部署额外应用服务器
- 主机网络均可支持。
以上配置都刷在路由器上
RA周期性发送。
配置相关流程:
- 主机网卡激活,随机生成网卡 link local address
- 对link-local地址进行DAD
- DAD通过后,主机发送RS消息尝试发现ipv6 路由器
- IPV6 路由器收到RS消息后,以一个RA消息做回应,在该RA消息中,包含路由器的MAC地址,IPV6单播前缀等信息。(RA消息不一定要以RS消息为触发,即使没有收到RS消息,路由器也可以发送RA)
- 主机使用接收到的IPV6单播前缀信息,加上自己的64bit接口ID, 构成ipv6单播地址
- 主机对该单播地址进行DAD,DAD通过后该ipv6地址即启用。
RA 带过来的 信息如下:
一条RA可以包含多个前缀信息
- Cur hop limit : 64 前缀64
- Managed address configuration
0 前缀用于 无状态,不通过dhcp
1 通过dhcp,有状态的地址协议 - Other configuarion
是否使用dhcp V6来配置除了ipv6地址意外其他的配置信息,如DNS域名等其他参数。
默认为0 使用任何方式来排至
设置为1 使用dhcpv6 来获取除了ipv6 意外的的其他配置信息。
Prefix information
- On - Link flgas
- 表示RA消息中的该前缀是分配给本地链路地址的,主机收到前缀后,主机是本地可达的。因此, 向包含这个指定前缀的地址发送数据的节点认为目的地址是本地链路可达的。
- Autonomous addr-config flag(A)
主机能否用前缀做无状态的自动配置
1 可以 2 不可以用作无状态配置
比如路由器上配置了3个前缀,只允许其中2个作为无状态地址配置,那么其中一个可以将这个标识为置为0.
地址分配小节
- ipv6 地址分配 手工配置
- ipv6 地址分配 自动配置
- 有状态: 通过 DPCH DNS 等,优点可控。缺点:部署额外服务器,跨网段还要支持dhcp的中继。
- 无状态:
即插即用,RS RA 消息得到ipv6前缀。
IPV6 前缀公告时间
前缀都有一个valid perferd 时间
valid time 中的depreated time 只能被动接受消息,不能组活动发消息了。
RA 会定期发送的,RS 主动发送请求
可以利用上述性质,设置有效时间等,进行ipv6地址切换。
ICMPv6 重定向
- R3 要发包给 R2, 但是根据现在R3的下一跳地址,只能通过R1,再将包转发给R2.
- 但是R1 通过路由查找,发现 R3 可以直接发给R2.
-
R1 会给R3 回复一个 icmpv6 类型是137的重定向包
修改后
使用重定向 下一条必须是link local address, 不可为单播地址
DHCP - DP
R1 - 总公司路由器
R2 - 分公司
主机 - 分公司内网主机
R1 通过 DHCP 下发地址前缀,让R2 给自己内网的主机使用。
- R2 自己的接口通过 无状态 向R1 拿到自己的接口地址
- 同时 R2 自己配置 一个 dhcp client,向R1 dhcp server 要一个 有状态的 地址 prefix 给变量 test。 但是 R2 自己并不使用
- test 全局有效,主机通过 与R2 进行无状态的 地址配置,把前缀放到RA中,即可获得统一的地址前缀。