目录
- ???? 1. IPV6协议
- ???? 1.1 主要变化
- ???? 1.2 IPv6地址
- ???? 1.2.1 表示方法
- ???? 1.2.2 分类
- ???? 1.3 IPv6数据报的首部
- ???? 1.3.1 基本首部
- ???? 1.3.2 扩展首部
- ???? 1.3.2.1 逐跳选项
- ???? 1.3.2.2 路由扩展选项
- ???? 1.3.2.3 分片扩展选项
- ???? 1.4 从IPv4向IPv6过渡
- ???? 1.4.1 使用双协议栈
- ???? 1.4.2 使用隧道技术
- ???? 2. ICMPv6协议
- ???? 2.1 概述
- ???? 2.2 封装
- ???? 2.3 分类
- ???? 2.4 格式
- ???? 2.4.1 差错报文(类型:0-127)
- ???? 2.4.1.1 目的不可达
- ???? 2.4.1.2 分组超大消息
- ???? 2.4.1.3 超时
- ???? 2.4.1.4 参数错误
- ???? 2.4.2 信息报文(类型:128-255)
- ???? 2.4.2.1 回送请求/响应
- ???? 2.4.3 不发送ICMPv6消息的情况
- ???? 3. 实验:IPv6配置
???? 1. IPV6协议
???? 1.1 主要变化
-
更大的地址空间:IPv6将IPv4的
32
比特地址空间增大到了128
比特,在采用合理编址方法的情况下,在可预见的未来是不会用完的。 - 扩展的地址层次结构:可划分为更多的层次,这样可以更好地反映出因特网的拓扑结构,使得对寻址和路由层次的设计更具有灵活性。
- 灵活的首部格式:与IPv4首部并不兼容。IPv6定义了许多可选的的扩展首部,不仅可提供比IPv4更多的功能,而且还可以提高路由器的处理效率,因为路由器对逐跳扩展首部外的其他扩展首部都不进行处理。
- 改进的选项:IPv6允许分组包含有选项的控制信息,因而可以包含一些新的选项。然而IPv4规定的选项却是固定不变的。
- 允许协议继续扩充:这一点很重要,因为技术总是在不断地发展,而新的应用也会层出不穷。然而IPv4的功能却是固定不变的。
- 支持即插即用(即自动配置):IPv6支持主机或路由器自动配置IPv6地址及其他网络配置参数。因此IPv6不需要使用DHCP。
- 支持资源的预分配:IPv6能为实时音视频等要求保证一定带宽和时延的应用,提供更好的服务质量保证。
-
最小的MTU变为
1280
字节
???? 1.2 IPv6地址
IPv6 将实现 IPv6 的主机和路由器均称为结点。
一个结点就可能有多个与链路相连的接口。
- IPv6 地址是分配给结点上面的接口的。
- 每个IPv6接口都必须有至少一个本地链路单播地址,一个接口可以分配多个任意类型的地址。
???? 1.2.1 表示方法
IPv6 地址是一个 128
位的二进制数。
- 在IPv6地址的冒号十六进制记法的基础上,再使用**“左侧零”省略和“连续零”压缩**,可使IPv6地址的表示更加简洁。
- “左侧零”省略是指两个冒号间的十六进制数中最前面的一串0可以省略不写。
- “连续零”压缩是指一连串连续的0可以用一对冒号取代。
- 在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义。
- 例: 2001:0000:0000:abcd:0000:0000:0000:1234 → 2001:0:0:abcd::1234 \text{2001:0000:0000:abcd:0000:0000:0000:1234} → \text{2001:0:0:abcd::1234} 2001:0000:0000:abcd:0000:0000:0000:1234→2001:0:0:abcd::1234
- 冒号十六进制记法还可结合点分十进制的后缀。这在IPv4向IPv6过渡阶段非常有用。
- CIDR的斜线表示法在IPv6中仍然可用。
- 例: 2001:0db8:0000:cd30:0000:0000:0000:0000/60 → 2001:db8:0:cd30::/60 \text{2001:0db8:0000:cd30:0000:0000:0000:0000/60} → \text{2001:db8:0:cd30::/60} 2001:0db8:0000:cd30:0000:0000:0000:0000/60→2001:db8:0:cd30::/60
???? 1.2.2 分类
IPv6数据报的目的地址有三种基本类型:
- 单播地址 (unicast address):传统的点对点通信。
- 多播地址 (multicast address):一点对多点的通信。数据报发送到一组计算机中的每一个。IPv6没有采用广播的术语,而将广播看作多播的一个特例。
- 任播地址 (anycast address):这是 IPv6 增加的一种类型。任播的目的站是一组计算机,但数据报在交付时只交付离发送方最近(由路由协议度量)的一个计算机。
[RFC 4291]对IPv6地址进行了分类:
-
未指明地址
- 128个比特为“全0”的地址,可缩写为两个冒号“
::/128
”。 - 该地址不能用作目的地址,只能用于还没有配置到一个标准IPv6地址的主机用作源地址。
- 未指明地址仅有一个。
- 128个比特为“全0”的地址,可缩写为两个冒号“
-
环回地址
-
最低比特为
1
,其余127个比特为“全0”,即0:0:0:0:0:0:0:1
,可缩写为::1/128
。 - 该地址的作用与IPv4的环回地址相同。
- IPv6的环回地址只有一个。
-
最低比特为
-
多播地址(组播地址)
-
最高
8
比特为“全1”的地址,可记为FF00::/8
。- 标志位字段:最高位保留,设为
0
;T
位为1
表示是熟知组播地址;T
位为0
表示是临时组播地址;P
标志表示组播地址的生成方式;R
标志用于构成组播RP
地址 - 范围:用来限制组播组的范围。
1 接口本地范围 2 链路本地范围 4 管理本地范围 5 站点本地范围 8 机构本地范围 E 全球范围 0 、 3 、 F 保留 6 、 7 、 9 、 A 、 B 、 C 、 D 未分配 \begin{array}{|c|c|} \hline 1 & 接口本地范围 \\ \hline 2 & 链路本地范围 \\ \hline 4 & 管理本地范围 \\ \hline 5 & 站点本地范围 \\ \hline 8 & 机构本地范围 \\ \hline E & 全球范围 \\ \hline 0、3、F & 保留 \\ \hline 6、7、9、A、B、C、D & 未分配 \\ \hline \end{array} 12458E0、3、F6、7、9、A、B、C、D接口本地范围链路本地范围管理本地范围站点本地范围机构本地范围全球范围保留未分配 - 组标识符:指定范围内的组播标识符,分为永久分配和临时分配两种。
- 标志位字段:最高位保留,设为
-
IPv6多播地址的功能与IPv4多播地址相同。
-
这类地址占IPv6地址空间的
1/256
。
-
-
本地链路单播地址
-
最高
10
比特为1111111010
的地址,可记为FE80::/10
。
- 即使用户网络没有连接到因特网,但仍然可以使用TCP/IP协议。连接在这种网络上的主机都可以使用本地链路单播地址进行通信,但不能和因特网上的其他主机通信。
- 这类地址占IPv6地址空间的
1/1024
。
-
最高
-
全球单播地址
- 全球单播地址是使用得最多的一类地址。
- IPv6全球单播地址采用三级结构,这是为了使路由器可以更快地查找路由。
- 全球路由选择前缀:分配给公司和机构,用于因特网中路由器的路由选择,相当于IPv4分类地址中的网络号。
- 子网标识符:用于各公司和机构构建自己的子网。
- 接口标识符:用于指明主机或路由器的单个网络接口,相当于IPv4分类地址中的主机号,不需要使用ARP。
- IPv4地址也可以表示为全局IPv6地址:
子网路由任播地址:
- 一个任播地址可以被分配给一组接口,且通常这组接口属于不同节点
- 发往一个任播地址的分组会被路由协议转发给离发送方最近的接口
- 任播接口的地址结构无法与单播地址相区分,包含在单播地址空间(包括本地链路单播地址和全球单播地址)中。
- 当一个单播地址分配给多个接口时,它就是一个任播地址
- 被分配了任播地址的一组主机往往分散在不同网络中,这些网络的最长共同前缀构成一个拓扑区域。
???? 1.3 IPv6数据报的首部
???? 1.3.1 基本首部
注意:所有的扩展首部并不属于IPv6数据报的首部,它们与其后面的数据部分合起来构成有效载荷(payload,也称为净负荷)。
IPv4 vs IPv6:
IPv6将IPv4数据报首部中不必要的功能取消了,这使得IPv6数据报基本首部中的字段数量减少到只有8个。
但由于IPv6地址的长度扩展到了128比特,因此使得IPv6数据报基本首部的长度反而增大到了40字节,比IPv4数据报首部固定部分的长度(20字节)增大了20字节。
- 取消了首部长度字段,因为IPv6数据报的首部长度是固定的
40
字节。 - 取消了区分服务(服务类型)字段,因为IPv6数据报首部中的通信量类和流标号字段实现了区分服务字段的功能。
- 取消了总长度字段,改用有效载荷长度字段。这是因为IPv6数据报的首部长度是固定的40字节,只有其后面的有效载荷长度是可变的。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在IPv6数据报的分片扩展首部中。
- 把生存时间TTL字段改称为跳数限制字段,这样名称与作用更加一致。
- 取消了协议字段,改用下一个首部字段。
- 取消了首部检验和字段,这样可以加快路由器处理IPv6数据报的速度。
- 取消了选项字段,改用扩展首部来实现选项功能。
-
版本字段:长度为
4
比特,用来表示IP协议的版本。对于IPv6该字段的值是6
。 -
通信量类字段(traffic class):长度为
8
比特,该字段用来区分不同的IPv6数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。 -
流标号字段(flow label):长度为
20
比特。- IPv6提出了流的抽象概念。
- “流”就是因特网上从特定源点到特定终点(单播或多播)的一系列IPv6数据报(如实时音视频数据的传送),而在这个“流”所经过的路径上的所有路由器都保证指明的服务质量。
- 所有属于同一个流的IPv6数据报都具有同样的流标号。换句话说,流标号用于资源分配。
- 流标号对于实时音视频数据的传送特别有用,但对于传统的非实时数据,流标号则没有用处,把流标号字段的值置为0即可。
-
有效载荷长度字段(playload length):长度为
16
比特,它指明IPv6数据报基本首部后面的有效载荷(包括扩展首部和数据部分)的字节数量。- 该字段以字节为单位,最大取值为
65535
,因此IPv6数据报基本首部后面的有效载荷的最大长度为65535字节。
- 该字段以字节为单位,最大取值为
-
下一个首部字段:长度为
8
比特。该字段相当于IPv4数据报首部中的协议字段或可选字段。-
当IPv6数据报没有扩展首部时,该字段的作用与IPv4的协议字段一样,它的值指出了IPv6数据报基本首部后面的数据是何种协议数据单元PDU。
- 若为
6
,则有效载荷部分是TCP报文段;若为17
,则有效载荷部分是UDP用户数据报。
- 若为
-
当IPv6数据报基本首部后面带有扩展首部时,该字段的值就标识后面第一个扩展首部的类型。
-
当IPv6数据报没有扩展首部时,该字段的作用与IPv4的协议字段一样,它的值指出了IPv6数据报基本首部后面的数据是何种协议数据单元PDU。
-
跳数限制字段:长度为8比特。该字段用来防止IPv6数据报在因特网中永久兜圈。
- 源点在每个IPv6数据报发出时即设定某个跳数限制(最大
255
跳)。 - 每个路由器在转发IPv6数据报时,要先把跳数限制字段中的值减
1
。当跳数限制的值为0
时,就把这个IPv6数据报丢弃(即不转发)。- 该字段的作用与IPv4数据报首部中的生存时间TTL字段完全一样。IPv6将名称改为跳数限制后,可使名称与作用更加一致。
- 源点在每个IPv6数据报发出时即设定某个跳数限制(最大
-
源地址字段和目的地址字段:长度都为
128
比特。分别用来填写IPv6数据报的发送端的IPv6地址和接收端的IPv6地址。
???? 1.3.2 扩展首部
IPv4数据报如果在其首部中使用了选项字段,则在数据报的整个传送路径中的全部路由器,都要对选项字段进行检查,这就降低了路由器处理数据报的速度。
实际上,在路径中的路由器对很多选项是不需要检查的。因此,为了提高路由器对数据包的处理效率,IPv6把原来IPv4首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(除逐跳选项扩展首部)。
在[RFC 2460]中定义了以下六种扩展首部:
扩展首部类型 | 扩展首部协议号 |
---|---|
逐跳选项(Hop-by-Hop Options) | 0 |
路由选择(Routing) | 43 |
分片(Fragment) | 44 |
目的选项(Destination Options) | 60 |
认证(Authentication) | 51 |
封装安全有效载荷(Encapsulating Security Payload) | 50 |
无下一扩展首部 | 59 |
- 每一个扩展首部都由若干个字段组成,它们的长度也各不相同。
- 所有扩展首部中的第一个字段都是8比特的下一个首部字段。该字段的值指出在该扩展首部后面是何种扩展首部。
- 当使用多个扩展首部时,应按以上的先后顺序出现。
- 扩展首部的长度应是
8
字节的整数倍,以此保证后续首部能在8字节边界处对齐。 -
逐跳选项扩展首部和目的选项扩展首部的选项字段长度可变,可包含多个选项数据。这些选项数据以TLV方式(Type-Length-Value)编码.
-
选项类型字段:
8
位- 其中高
两
位指明了不能识别选项类型时应采用的处理方式(00:跳过;01:丢弃;10:丢弃且报告) - 第
3
高位指明该选项数据在传输过程中是否发生变化 - 后
5
位是类型代码
- 其中高
- 选项数据长度:选项数据字段的长度,以字节为单位
- 选项数据:与选项类型有关
-
选项类型字段:
???? 1.3.2.1 逐跳选项
- 逐跳选项用于在分组中携带需要被传输路径上所有节点处理的信息
- 它必须是第一个扩展首部
- 下一首部字段(8位):指明紧跟在逐跳选项扩展首部后的下一个首部类型
- 扩展首部长度字段(8位) :以
8
字节位单位,不包含第一个8字节 - 选项数据字段:包含多个以TLV方式编码的选项
???? 1.3.2.2 路由扩展选项
- 用于列出分组传输过程中需要访问的节点地址
- 路由类型(8位):进一步区分路由扩展首部的类型,两种,0/2
- 剩余段数(8位):指明路由地址列表尚未被访问的地址数
- 指定路由类型数据:依赖于具体的路由类型
???? 1.3.2.3 分片扩展选项
- 路由器发现分组长度大于要转发网络的最大传输分组时,丢弃分组并向源主机发送ICMP分组超大信息,由源主机对IP分组进行分片
- 保留(8位):置为
0
- 片偏移(13位):指明数据第一个字节对于原始未分片分组数据的偏移值,8字节为单位
- 保留(2位):置为
0
- M标志字段(1位):
1
表示有更多分片,0
表示是最后一个分片 - 标识符:每个未分片分组的唯一标识符,用于重组时区分分片属于的分组
???? 1.4 从IPv4向IPv6过渡
因特网上使用IPv4的路由器的数量太大,要让所有路由器都改用IPv6并不能一蹴而就。因此,从IPv4转变到IPv6只能采用逐步演进的办法。
另外,新部署的IPv6系统必须能够向后兼容,也就是IPv6系统必须能够接收和转发IPv4数据报,并且能够为IPv4数据报选择路由。
下面介绍两种由IPv4向IPv6过渡的策略:
???? 1.4.1 使用双协议栈
- 双协议栈(Dual Stack)是指在完全过渡到IPv6之前,使一部分主机或路由器装有IPv4和IPv6两套协议栈。
- 双协议栈主机或路由器既可以和IPv6系统通信,又可以和IPv4系统通信。
- 双协议栈主机或路由器记为IPv6/IPv4,表明它具有一个IPv6地址和一个IPv4地址。
- 双协议栈主机在与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址。
- 双协议栈主机在与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址。
- 若DNS返回的是IPv4地址,则双协议栈的源主机就使用IPv4地址;
- 若DNS返回的是IPv6地址,则双协议栈的源主机就使用IPv6地址。
???? 1.4.2 使用隧道技术
隧道技术(Tunneling)的核心思想是:
- 当IPv6数据报要进入IPv4网络时,将IPv6数据报重新封装成IPv4数据报,即整个IPv6数据报成为IPv4数据报的数据载荷。
- 封装有IPv6数据报的IPv4数据报在IPv4网络中传输。
- 当IPv4数据报要离开IPv4网络时,再将其数据载荷(即原来的IPv6数据报)取出并转发到IPv6网络。
注:要使双协议栈路由器R4知道IPv4数据报的数据载荷是IPv6数据报,则IPv4数据报首部中协议字段的值必须设置为41
。
???? 2. ICMPv6协议
???? 2.1 概述
由于IPv6与IPv4一样,都不确保数据报的可靠交付,因此IPv6也需要使用网际控制报文协议ICMP
来向发送IPv6数据报的源主机反馈一些差错信息,相应的ICMP版本为ICMPv6
。
ICMPv6比ICMPv4要复杂得多,它合并了原来的地址解析协议ARP和网际组管理协议IGMP的功能。因此与IPv6配套使用的网际层协议就只有ICMPv6这一个协议。
???? 2.2 封装
ICMPv6报文需要封装成IPv6数据报进行发送:
???? 2.3 分类
ICMPv6报文可被用来报告差错、获取信息、探测邻站或管理多播通信。
在对ICMPv6报文进行分类时,不同的RFC文档使用了不同的策略:
- 在[RFC 2463]中定义了六种类型的ICMPv6报文
- 在[RFC 2461]中定义了五种类型的ICMPv6报文
- 在[RFC 2710]中定义了三种类型的ICMPv6报文
常用的几种ICMPv6报文:
ICMP报文种类 | 类型的值 | ICMP报文的类型 |
---|---|---|
差错报告报文 | 1 | 目的站不可达 |
2 | 分组太长 | |
3 | 时间超过 | |
4 | 参数问题 | |
回送请求与回答报文 | 128 | 回送请求 |
129 | 回送回答 | |
多播听众(MLD)发现报文 (替代原来的IGMP协议) |
130 | 多播听众查询 |
131 | 多播听众报告 | |
132 | 多播听众完成 | |
邻站(ND)发现报文 (替代原来的ARP协议) |
133 | 路由器询问 |
134 | 路由器通告 | |
135 | 邻站询问 | |
136 | 邻站通告 | |
137 | 改变路由 |
???? 2.4 格式
ICMPv6的消息格式与ICMPv4类似,
- 类型:区分不同的ICMP消息类别
- 代码:用于进一步区分同一消息类别下的不同情形
- 校验和:用于从类型字段开始的ICMP报文进行检验
ICMP 报文分为两种:
???? 2.4.1 差错报文(类型:0-127)
???? 2.4.1.1 目的不可达
当路由器无法继续转发分组,或目的主机无法将分组交付给承载数据的处理协议时,将向源端发送目的不可达报文(destination unreachable message)。类型字段为1
代码(Code) | 含义 | 例子 |
---|---|---|
0 | 无法去往目的地址的路由 | 源主机路由表中无默认路由表项 |
1 | 与目的地址的通信被管理性禁止 | 防火墙过滤 |
2 | 超出原地址的范围 | 分组源地址是链路本地地址,而目的地址是全球地址 |
3 | 地址不可达 | 无法解析IP地址对应的链路;链路问题;目的站点不在线 |
4 | 端口不可达 | 目的端口未打开 |
5 | 源地址不在目的站点的入站/出站策略范围 | |
6 | 拒绝路由到目的地址 | 路由器被配置为拒绝为特定的地址块服务 |
???? 2.4.1.2 分组超大消息
当路由器转发的分组长度大于链路MTU时,路由器将向源主机发送分组超大消息。
- 类型:2
- 代码:0
- MTU:下一跳链路最大传输单元字节数。
???? 2.4.1.3 超时
超时报文(time exceeded message)用于向源端报告分组无法按期到达目的主机,包括:
- 路由器转发分组时对其 TTL 字段值减 1,结果为 0(代码为0):
- 丢弃分组,并向源主机发送 ICMP 超时报文。
- 目的主机重组分片超时(
60s
)(代码为1):- 放弃重组,并向源主机发送 ICMP 超时报文。
- 只有在接收到第一个分片的情况下才发送超时报文.
超时报文的格式:与目的不可达报文相同。类型为3,代码为0或1.
???? 2.4.1.4 参数错误
路由器或主机处理 IP 分组时,若发现首部或者扩展首部参数错误而无法继续处理,将丢弃分组,并向源主机发送参数错误报文(parameter problem message)。
- 类型:4
- 指针:指向源IP分组中的错误参数位置
代码(Code) | 含义 |
---|---|
0 | 错误的首部字段 |
1 | 不能识别的扩展首部类型 |
2 | 不能识别的IPv6选项 |
???? 2.4.2 信息报文(类型:128-255)
???? 2.4.2.1 回送请求/响应
回送请求/回送响应报文(Echo request/Echo reply message)常用于测试目的地址是否可达及其相关状态。
- 类型:128/129
- 代码:0
???? 2.4.3 不发送ICMPv6消息的情况
- ICMPv6分组错误
- ICMPv6重定向消息
- 目的地址是组播地址、链路组播地址、链路多播地址等的分组(两个例外:超大错误消息;参数错误消息)
???? 3. 实验:IPv6配置
题目:本实验模拟企业网络场景,公司局域网内,IT部门的两台PC机想使用ipv6地址实现互通,我们在网络中用环回口loopback0模拟这两个PC机。
设备 | 接口 | IP地址 |
---|---|---|
R1 | f0/0 | 2001:9267:12::1/64 |
loopback 0 | 2001:9267:1:1::1/64 | |
R2 | f0/0 | 2001:9267:12::2/64 |
loopback 0 | 2001:9267:2:2::2/64 |
配置R1:
(1)开启路由器的IPv6路由功能
R1(config)#ipv6 unicast-routing
(2)给端口f0/0配置IPv6地址
R1(config)#interface f0/0
R1(config-if)#ipv6 address 2001:9267:12::1/64
R1(config-if)#no shutdown
(3)配置环回口
R1(config)#interface loopback 0
R1(config-if)#ipv6 address 2001:9267:1:1::1/64
R1(config-if)#no shutdown
(4)开启端口的rip协议
R1(config)#interface f0/0
R1(config-if)#ipv6 rip process1 enable
R1(config)#interface loopback0
R1(config-if)#ipv6 rip process1 enable
配置R2:
(1)开启路由器的IPv6路由功能
R2(config)#ipv6 unicast-routing
(2)给端口f0/0配置IPv6地址
R2(config)#interface f0/0
R2(config-if)#ipv6 address 2001:9267:12::2/64
R2(config-if)#no shutdown
(3)配置环回口
R2(config)#interface loopback 0
R2(config-if)#ipv6 address 2001:9267:2:2::2/64
R2(config-if)#no shutdown
(4)开启端口的rip协议
R2(config)#interface f0/0
R2(config-if)#ipv6 rip process1 enable
R2(config)#interface loopback 0
R2(config-if)#ipv6 rip process1 enable
测试链路连通性:
R1#ping 2001:9267:2:2::2 source 2001:9267:1:1::1