IPv6-基础

Pv6与IPv4的区别

Pv6报文与IPv4报文差别就两个地方:

一个是数据链路层(以太网协议)中协议类型,IPv4是0x0800,IPv6是0x86DD

另一个是IPv6 Header是40字节,IPv4只有20字节。

  • Version一个是4,一个是6

  • IHL(Internet Header Length)在IPv6中去除了,因为IPv6 Header不支持Option,所以长度是固定的40字节,因此也没必要表明Header的长度。实际上IPv4 option也很少使用。

  • Type of Service,在IPv6中改名成为了Traffic Class。不过功能保留了,还是用来标识流量做QoS用。

  • Total Length,在IPv6中改名成为了Payload Length。并且,IPv4的Total Length是要包含IPv4 Header的,而IPv6 Payload Length直接是IP payload的长度。这样在IPv6包有效性校验的时候,不必考虑Total Length必须要大于IHL,能够提升一丢丢的性能。

  • Flow Label,IPv6中新增的字段,用来标识一个TCP连接或者一个会话。通过Flow Label可以不看其他的Header,就标识出流量,对于QoS的实现有帮助。

  • Identification, Flags, and Fragment Offset,这些字段在IPv6中去除了。这些是用来实现IP报文分片的,也就是说IPv6不支持分片。

    IPv6的数据只在源端分片,目的端重组,中间路由器收到超过它MTU的数据会发送ICMPv6告诉源主机它的MTU大小,并把数据抛弃. ipv6包发向一个目的地址的第一个包,如果在路由过程中被某个路由器卡住,那个路由器是会向源IP发icmpv6报文告诉源ip的主机,包太大了,同时会附上一个MTU,源主机再调整包大小,重发,然后后面的包就都不会超过这个大小,也就是说,第1个包可能会重发。 再如果过了上面被卡的路由器,报文继续往下走,又遇到一个路由器,MTU更小,同样,也会向源主机发个icmpv6的报文,告诉源主机,包大了,要调后重发,就这样直到数据包到达目的地址。 
  • TTL在IPv6中改名为Hop Limit。功能是一样的,改名之后更贴近实际的作用。

  • Protocol Field在IPv6中改名为Next Header。

  • Checksum在IPv6中移除了。因为更高层的协议自己有错误检测,而更底层的协议通常有CRC校验也能发现错误,所以IPv6放弃了自己的Checksum,这也是能提升一丢丢性能的改动。

  • Source Address,Destination Address,从IPv4的32bit,改成了IPv6的128bit。

IPv6 地址表示方式

IPv6地址由3种格式。首选格式、压缩格式和内嵌IPv4地址的IPv6地址格式

1. 首选格式:

IPv6的128位地址是按照每16位划分为一段,每段被转换为一个4位十六进制数,并用冒号隔开。这种表示方法就是首选格式,在首选格式后面加上前缀长度就是一个完整的IPv6地址格式:2001:0410:0000:0001:0000:0000:0000:45ff / 64。

2. 压缩格式:

简化表示:8段16进制数:

为进一步简化,每一段地址起始的0可以不用写(写出来也合法)。任一段,如果少于4个字符,则认为前面用0补齐至4个字符。如果一段全是0,可以用单个0来表示。因此上面的地址可以表示为:2001:db8:0:0:0:52:0:1

为了进一步简化,任何全0组成的1个或者多个连续地址段,可以用双冒号 “::” 表示。但是在IPv6地址中,不能出现两个双冒号。双冒号应当用于尽可能缩短地址。因此上面的地址可以简化成:2001:db8::52:0:1
 

一个或多个连续的16比特为0字符时,为了缩短地址长度,用::(两个冒号)表示,但一个IPv6地址中只允许一个::(如果出现超过一个的::,就无法判断每个::到底省略了多少个全0段),所以2001:0410:0000:0001:0000:0000:0000:45ff又可以表示为:2001:410:0:1::45ff。

在某些情况下(例如表示一个包含地址的URL时),IPv6地址中的冒号分隔符可能与其它分隔符混淆,例如IP地址和端口号之间使用的冒号。在这种情况下,用括号字符[和]包围IPv6地址。例如URL:http://[2001:0db8:85a3::7344]:443/ 此外的一些规则如下:

a.  前导的零必须压缩(例如,2001:0db8::0022变成2001:db8::22)

b.  ::只能用于影响最大的地方(压缩最多的零),但并不是针对16位的块,如果多个块中包含等长度的零,则顺序靠前的将被替换为::

c  .a到f的十六进制数字应该用小写表示。

3. 内嵌IPv4地址的IPv6地址格式分为如下两种:

IPv4兼容的IPv6地址: 0:0:0:0:0:0:192.168.1.2或者::192.168.1.2

IPv4映射的IPv6地址: 0:0:0:0:0:ffff:192.168.1.2或者::ffff:192.168.1.2

此外,48位MAC地址转换64位IPv6网络ID的方式如下:

一、将48位的MAC地址从中间分开,插入一个固定数值FFFE
0050:3EE4:4C00-->0050:3EFF:FEE4:4C00
二、将首字节第7个比特位取反,如果原来是0,就变为1,如果原来是1,就变为0
0050:3EFF:FEE4:4C00-->0250:3EFF:FEE4:4C00

IPv6地址分类

IPv4地址分为单播地址、组播地址和广播地址。IPv6中去掉了广播地址,增加了任播地址,也就是说,IPv6地址被分为单播地址、组播地址和任播地址。

单播地址用于标识一个接口,发往该目的地址的报文会被送到被标识的接口。

组播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口。

任播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口中最近的一个接口上。这里关于最近的理解,可以理解为从下标数起,最小的那个。任播地址与单播地址使用同一个地址空间,也就是说,由路由器决定该数据包是做任播转发还是单播转发。

单播地址可分为下面几类:

1. 未指定地址: ::/128,即地址全为0。

2. 环回地址 : ::1/128,相当与IPv4中的127.0.0.1。

3. 全球单播地址,类似于IPv4中的公网地址。

4. 内嵌IPv4地址的IPv6地址 如 :::ffff:192.168.10.1。(::ffff:c6a8:0a0a)当需要将IPv4单播地址与IPv6全球单播地址建立联系的时候一般使用这种地址,分为两种。一种是IPv4兼容IPv6地址,另一种是IPv4映射IPv6地址。

     IPv4兼容IPv6地址构成形式是96位0加上32位IPv4地址,如 ::192.168.1.1,这种地址最初用于IPv4和IPv6之间的过渡计划,但现在已经不再需要。

     IPv4映射IPv6地址构成形式是80位0加上16位1,再加上IPv4地址,如::ffff:192.168.1.1。

5. 本地链路地址,前缀固定fe80::/64,如 fe80::e0:f726:4e68。凡是源地址或目的地址包含由本地链路地址的报文,路由器不应当转发它。这样的报文只能在LAN中互通。

6. 本地站点地址,前缀fec0::/10,紧接着54位子网ID,作用相当于IPv4中的私网地址,如fec0::e0:f726:4e68。只能在本站内使用,不能在公网上使用。

组播地址

最重要的字段要属于最后的组ID(Group-ID)字段了。该字段长度为112位,用以标识组播组,我们知道112位最多可以生成2112个组ID。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位组ID,将剩余的80位都置0。

任播地址:

这是IPv6特有的地址类型,它用来标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。适合于“One-to-One-of-Many”(一对组中的一个)的通讯场合。接收方只需要是一组接口中的一个即可,如移动用户上网就需要因地理位置的不同,而接入离用户最近的一个接收站,这样才可以使移动用户在地理位置上不受太多的限制。

任播地址从单播地址空间中进行分配,使用单播地址的任何格式。因而,从语法上,任播地址与单播地址没有区别。被分配具有任播地址的节点必须得到明确的配置,从而知道它是一个任播地址。目前,任播地址仅被用做目标地址,且仅分配给路由器。

IPv6地址解析原理:

IPv6的地址解析包括两个过程:一、解析目的IP对应的链路层地址,二、邻居可达性状态的维护过程。

在IPv4中使用的是ARP协议,在IPv6中使用的是ND(Neighbor discover)协议中的NS和NA报文来实现的。

采用ND协议的优势在于增加了地址解析协议与底层链路的独立性。对每一种链路层系诶都是用相同的地址解析协议,无须再为每一种链路层协议定义一个新的地址解析协议。

减小报文的传播范围。在IPv4中,ARP使用的是广播地址,必须泛滥到二层网络的每台主机。IPv6的地址解析利用三层的组播寻址限制了地址的传播范围,通过将地址解析请求发送到特定解析地址所属的被请求节点组播组(FF02::1:FF00:0/104+IPv6地址后24位组成),减小了报文的传播范围,节省了网络的带宽。


在IPv6中,ND协议通过在节点之间交互NS和NA报文完成IPv6地址到链路层地址的解析,解析后用得到的链路层地址和IPv6地址等信息来建立相应的邻居缓存表项。

NS报文的主要功能字段包括Target Address和Option字段。

TargetAddress包含待解析的IPv6地址。

NA报文的Option字段只使用链路层地址选项(Link layer Address Option)。链路层地址选项包括类型、长度和地址三个部分。

当类型为1时,表示源链路层地址,在NS、RS、Redirect报文中使用;当类型为2时,表明链路层地址为目标链路层地址,在NA报文中使用。


IPv6地址解析过程:假如网络中有主机A和主机B。A的链路层地址为MAC1,IPv6地址为IP1;B的链路层地址为MAC2,IPv6地址为IP2(假设为2001::1)。则A查询B的链路层地址的过程如下:

1)节点A发送一个NS报文到链路上,目的IPv6地址为B对应的被请去节点组播地址(FF02::1:FF00:1),目标地址为IP2,选项字段中携带MAC1;

2)节点B接收到该DS报文后,根据NS报文中的源IPv6地址和源链路层地址选项更新自己的邻居缓存表项,并发送一个NA报文来应答NS报文,报文Option字段中的链路层地址为自己的链路层地址MAC2;

3)节点A收到NA报文后,根据报文中携带的节点B的链路层创建一个到目标节点B的邻居缓存表项。

查看邻居缓存

ip -6 neigh show

查看路由

ip -6 route show

route -A 'inet6'

route -6

添加IPV6地址

ip -6 addr add <ipv6address>/<prefixlength> dev <interface>

ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0

ifconfig <interface> inet6 add <ipv6address>/<prefixlength>

ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64

添加默认路由

ip -6 route add <ipv6network>/<prefixlength> via <ipv6address>

ip -6 route add default via 2001:0db8:0:f101::1

route -A inet6 add <ipv6network>/<prefixlength> gw

route -A inet6 add default gw 2001:0db8:0:f101::1

NS报文:

 地址ff02::1::ff00:1是1::1被请求节点组播地址。Link-layer包含了自己的链路层地址。

NA报文:

 Flags标志位字段中三个标志位都置位了,router字段表示发送者是router、solicited字段表示此报文是对NS的回应、override字段表示本次地址解析结果覆盖以前的结果。NA报文以单播形式发送。

原文地址:https://www.cnblogs.com/liuhongru/p/11525824.html