一、地址种类

1、单播

2、任意播

3、组播

常见地址:这几个很重要

::/128   位指定地址

::/0       任意地址

::1/128  环回地址

FF00:/8   组播地址

FE80::/10链路本地单播地址

2XXX:: 3XXX:: 全球单播地址,前三位是001

全球单播地址:前64位为网络位,后64位为主机位。前64位中,前48位是全球路由选择前缀,后16位是子网位。这一点和ipv4不一样,ipv4中,子网位是从主机位中分出来的。

本地链路单播地址:他唯一性的仅仅作用在所在链路中,并且相同的地址也可能存在于另一条链路上,因此这个地址离开链路是没有用的。本地链路地址都是以FE80开头的。

任意播地址:他定义的是一种服务,而不是一种主机。比如说三台服务器,他们跑一个相同的服务器,他们拥有一个相同的任意播地址。连在同一个路由器上。路由器可以根据每条链路的度量值(我个人认为这个应该是可以手工指定的)决定把数据包发给哪个服务器。当外面有客户端请求服务的时候,路由器会根据度量值来决定把数据发给哪个服务器。当该服务器down掉,或者网络down掉,就自动切换的别的服务器。这算是一种高可用吧。直接在网络上就能取代keepalivecorosyncheartbeat等。(个人认为啊)

组播地址:直接记几个重要的吧

FF02::1 所有节点

FF02::2 所有路由器

FF02::5 ospfv3

FF02::6 ospfv3

FF02::9 ripng

FF02::A eigrp

FF02::C DHCP中继

注:在IPV6中没有广播,但是组播就能代替广播的作用,::1,发给所有节点,::2发给所有路由器。

二、IPV6包头

1:、版本号:4位,0110 代表6

2、流量分类:类似于v4中的TOS 区分不服

3、流标签:(个人理解)这是v6很大的一点改变。网络中的流量阻塞,很大程度上,是因为路由器不停的查看包头,找到目的IP,然后根据目的地址去查路由表,然后递归的转发。过程繁琐。流标签就是优化了这方面的东西。个人理解的流:具有相同的目的地址和源地址,并且有相同的目的端口号和源端口号(TCP/UDP)。他们就可以认为是一个流。路由器只需要确定他们是不是属于一个流,然后只用确定这个流的第一个包怎么发,后面的直接发就好。但是同时也有一个问题就是,路由器需要查4层(TCP/UDP)的头部,这个过程稍微有点繁琐。

4、有效载荷长度:20位。这样比IPV4可以发送更大的包。

5、下一报头:跟在IPV6包头后面的包不一定是4层的头,可能是IPV6的扩展头

6、限制条数:TTL

7、源和目的地址

三、下一报头

这里概括的说。

1、逐跳可选项:包经过的每一个节点都检查处理的信息,例如警告超过最大有效负载

2、路由选择:列出数据包经过的节点列表,用来提供源路由选择的功能。

3、分段:这个很重要,IPV6中,分段是又源主机自己处理的,而不是由路由器来处理的。

4、封装安全有效负载(ESP):用于有效负载的加密封装

5、认证头(AH):用于数据包在源和目的地址中的加密

注:45本身在IPV4中是没有的。学ipsec的时候,也有这两个字段。

注:3需要补充一下。IPV6中,主机主动的去发现MTU,主机不断的增加自己发包的大小。当超过MTU后,路由器会把包丢弃,然后回复一个MTU超出的回复。然后主机就获得了MTU

四、NDP(邻居发现协议):最重要的来了

NDP的主要作用

1、路由器发现

2、前缀发现:IPV6的前64

3、参数发现:MTU

4、地址自动配置: EUI64

5、地址解析:IPV6中没有ARP

6、下一跳确定: 主机可以确定网关

7、地址冲突检测

8、重定向

注:NDP一般是在链路本地有效的。所以NDP一般使用链路本地地址(FE80::,用这个作为目的地址的前提是你得知道目的地址的FE80),或者组播地址(FF02::,当自己不知道目的的本地链路地址)。将包的TTL设置为255,节点收到NDP消息,TTL254的时候,直接将包丢弃。只作用在本地么,而且防止外部的***

五、NDP的四种包

1、路由器通告 RA :路由器发出。通告链路细节:链路前缀,MTU等。周期性的发送(缺省为600s),也用在回应RS

2、路由器请求 RS :由主机发出,发给路由器。用于请求路由器发送RA

3、邻居请求 NS:由主机发出,发给主机。用于解析另外一个主机,也由来地址冲突检测。(类似于ARP)

4、邻居通告 NA :主机发出,发给主机。用来回应NS。如果节点的地址改变,也用来通告自己的信息。(类似于无故ARP

六、路由器发现:(使用NDP)

当一台主机连接到一个新的链路。首先是要获得IPV6地址吧。可以自动配置地址。但是前提是知道前64位的前缀(使用EUI64的方法)。这时候就可以发送一个RS(路由器请求),请求路由器回复一个RA,以获得链路的参数。RS的目的地址为FF00::2,源地址为::(未分配地址)。

当路由器收到RS以后,延迟5s,然后回复RA,如果收到的RS源地址为本地链路地址(FE80::),则以单播的方式回复本地链路地址。如果收到的地址是未指定地址(::),则回复的目的地址为所有节点的组播地址(FF02::1)。

当一台主机收到RA后,就把就会把该路由器添加为默认的网关。如果收到多个路由器地址,要么选择一个作为网关,要么使用轮训的发包。在这里,重定向这个功能是很重要的。

七、地址冲突检测

获得新地址的主机不会使用这个地址,在没有地址检测之前,地址是不可用的。

节点会发送一个把目标地址字段设置为该地址的邻居请求消息来验证。邻居请求消息的源地址为未指定地址,目的地址为被请求的多播地址。这个地址有点讲究

104位为FF02::1FF 再加上EUI出来的最后24位。挺扯淡的。大概知道吧

八、地址解析

DNS先解析域名为IP地址

1、如果待解析地址和源在同一链路上(交换环境中)。

IPV6中没有ARP用来解析其他主机的硬件地址。实际也不需要。主机只需要发送一个FF00::1(到所有节点)的NS(邻居请求),就可以解析硬件地址了。和arp感觉差不多。

当邻居收到以后,回复一个NA,宣告自身。

这个过程也可以用来检测IP地址冲突。还是和arp一样

   2、如果待见习地址和源不在同一链路上(不在同一交换环境)

路由器收到RS,然后发现前缀和本链路不一样。路由器根据自己的路由表去找吧