IPV6 basis

The difference between IPv4 and Pv6

Pv6 packets and IPv4 packets difference is two places:

A data link layer (Ethernet protocol) type protocol, IPv4 is 0x0800, IPv6 is 0x86DD

Another is the IPv6 Header is 40 bytes, IPv4 only 20 bytes.

  • Version 4 is a, is a 6

  • IHL (Internet Header Length) In IPv6 removed because IPv6 Header does not support Option, it is a fixed length of 40 bytes, and therefore did not need to show the length of the Header. Actually IPv4 option is also rarely used.

  • Type of Service, renamed in IPv6 to become a Traffic Class. But retains the function, or to identify traffic with QoS do.

  • Total Length, renamed in IPv6 to become the Payload Length. And, Total Length IPv4 is to contain IPv4 Header, and direct IPv6 Payload Length is the length of IP payload. In this way IPv6 packet validity check when regardless of Total Length must be greater than IHL, can enhance a Diudiu performance.

  • Flow Label, IPv6 in the new field is used to identify a connection or a TCP session. Can not look the other Header by Flow Label, will identify traffic for QoS implementation help.

  • Identification, Flags, and Fragment Offset, these fields are removed in IPv6. These are used for IP packet fragmentation, that does not support IPv6 fragmentation.

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

  • Protocol Field was renamed in IPv6 Next Header.

  • Checksum Removed in IPv6. Because they have a higher-level protocol error detection, while lower-level protocols usually CRC error checking can be found, so IPv6 abandoned his Checksum, this is a Diudiu changes can improve performance.

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

IPv6 地址表示方式

IPv6地址是由bit组成,它的表示方法是为了让人更好的记住和书写这些地址。从最标准的角度来看,一个IPv6地址是这样:

0010 0000 0000 0001 0000 1101 1011 1000 
0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0101 0010 
0000 0000 0000 0000 0000 0000 0000 0001 

为了简化,第一步是用16进制表示地址,因此上面的地址可以表示为8段16进制数:

2001:0db8:0000:0000:0000:0052:0000:0001 

这已经是一个完全合法的IPv6地址了。但是在实际应用中,要记住这么一串地址基本不可能,尤其某些场合还不能复制黏贴。不得不说,IPv6地址太长也是阻碍IPv6发展的另一大因素。

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

2001:db8:0:0:0:52:0:1 

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

2001:db8::52:0:1 

这就是一个常见IPv6地址的形态,虽然还是很长,但是相比较之前的形态已经简化了很多。

DHCPv6

DHCPv6除了工作模式与DHCP类似以外,与DHCP也不兼容,它的协议内容也进行了重新定义。

因为IPv6中没有广播的概念,所以不像DHCP基于广播地址255.255.255.255来发现DHCP Server,DHCPv6中,有两个保留的组播地址,用来发现网络中的DHCP Server:

  • All_DHCP_Relay_Agents_and_Servers (ff02::1:2)
    • DHCPv6 client使用这个地址将DHCP请求发送给所有的DHCPv6 relay(中继)agent和DHCPv6 server,这样可以发现网络中的DHCPv6 Server
  • All_DHCP_Servers (ff05::1:3)
    • DHCPv6 relay agent通过这个地址将DHCP请求转发给所有的DHCPv6 server

DHCPv6仍然是基于UDP协议,但是使用的是UDP的547(Server监听端口)和546(Client监听端口)。

IPv6协议下,每个网卡都默认带一个link-local地址,这个地址是fe80::/10的前缀加上(一般情况下)网卡的MAC地址生成[RFC4291]。IPv6的link-local用来在一个二层链路中唯一标识一块网卡,并且可以在有限场景下在一个二层链路中用来通信。

在DHCP(IPv4)协议下,DHCP Client在发起请求的时候,因为还没有IP地址,所以源IP只能是Unspecified Address(0.0.0.0)。而DHCPv6 Client在发起请求的时候,网卡已经有IPv6地址了,所以源IPv6地址就是网卡的link-local地址,目的地址是DHCPv6保留的组播地址ff02::1:2

DHCPv6 Server在收到请求之后,将IPv6地址在单播回给Client网卡的link-local地址。其中IPv6地址包含在Advertise和Reply中,这个过程与DHCP类似。

两个协议,三种模式

IPv6的动态地址配置主要依赖两个协议,一个是DHCPv6(RFC8415),另一个是IPv6 Stateless Address Autoconfiguration(RFC4862)。IPv6的动态地址配置方式客观的说是合理的,并且一定程度结合了IPv4动态地址配置的经验。

实际中,经常将DHCP Server配置在路由器上,或者路由器作为一个DHCP relay agent。另一方面,如果没有路由器,网络只是一个二层网络,作用有限。因此,这两个设备本身可以只是一个设备,并且它们之中,路由器占主导地位。基于这个背景,IPv6的动态地址配置有三种模式:

  • SLAAC,Stateless Auto Address Configuration
  • Stateless DHCPv6
  • Stateful DHCPv6

这里的Stateful,指的就是DHCP Server管理的IP地址,因为这些地址存在一个分配关系,需要一个程序去管理这个状态。Stateless Address是指这个地址就是分配给某一个确定的主机使用,没有其他状态。

SLAAC

SLAAC基于协议RFC4861和RFC4862。在SLAAC的世界里,没有DHCPv6。SLAAC协议由路由器来通告配置IPv6地址所需要的信息。具体工作流程是这样:支持IPv6的网卡启动的时候会发送一条RS(Router Solicitation)消息,源IP是网卡的link-local地址,目的IP是ff02::2。ff02::2也是保留的组播地址,用来表示所有的路由器。这条消息用来查找当前网络中的路由器。

路由器收到这条消息之后,会回传一条RA(Router Advertisement)。一般情况下,RA的源IP地址是Router的link-local地址,目的地址是ff02::1。ff02::1也是一个保留的组播地址,用来表示所有的主机。也就是说任意网卡发起的RS消息,都会引起路由器将RA消息在整个网络中发送给所有的主机。除此之外,就算没有任何RS消息,路由器也应当定期向所有主机发送RA。

RA可以发送给网络中所有主机的基础就是,不像DHCP消息,RA是无状态的,任何主机接收到了RA消息之后,都能根据其中的信息完成IP地址配置。RA的options中通常包括:

MTU
主机可以根据这个MTU值配置自己的MTU
路由器的MAC地址
0或者N个prefix(网段)

如果RA中一个prefix的auto标志位是1,那相当于告诉网卡,可以自己从这个prefix中生成一个IPv6的地址。网卡只需要使用一个局域网中唯一的标识符,再加上这个prefix,就能生成一个IPv6地址。网卡在局域网中的天然唯一标识符就是MAC地址,因此一般情况下,SLAAC协议中,网卡是通过RA中的prefix和自身的MAC地址,再根据EUI-64格式生成一个IPv6地址。SLAAC协议的基础就是IPv6地址长度足够大,能支持这样的配置。

RA消息还能带来一个潜在的配置,主机会将IPv6的默认网关,指向RA的源IP地址,也就是Router的link-local地址。生成的默认路由是有时效的,时间是Router Lifetime。所以需要路由器定时发布RA(类似于心跳),更新主机的默认路由。这个机制讲道理是合理的,默认路由只有在路由器还活着的时候才有意义。但是这个机制增加了管理的复杂度,尤其在SDN场景,虚拟路由器下定时发布RA。

SLAAC协议有两个问题,一个是IPv6的地址不可控了,一般情况下与主机的MAC地址相关;另一个是RA格式比较简单,能传递的配置有限,一些复杂的主机配置无法通过RA传递。

但是好处是简单,只用路由器,不需要DHCPv6的介入,就可以完成简单的IP地址配置;另外无状态地址能简化管理,只需要一些简单的程序就能完成Prefix分发,不需要集中的管理地址,处理多节点数据同步,这有点像分布式架构。SLAAC的配置过程如下如所示:

Stateless DHCPv6

Stateless DHCPv6就是结合了SLAAC和DHCPv6。其中IPv6地址配置通过SLAAC下发,其他配置通过DHCPv6下发。这样能弥补SLAAC模式下,RA所能传递配置有限的问题。

Stateful DHCPv6

这里就是纯纯的DHCPv6了,但是前面说过,DHCPv6不支持子网掩码长度,路由,和默认路由。这样就导致通过DHCPv6获得的IPv6地址,因为没有掩码长度,地址的掩码都是128位。而路由和默认网关,还是需要依赖RA。因为在IPv6中,动态配置路由和默认网关的唯一方式就是使用Router Advertisement消息。所以,就算使用了DHCPv6,也不能完全摆脱RA消息。只是说DHCPv6下,IPv6地址变得可控了。所以,在IPv6动态地址配置中,Router Advertisement是必不可少的,因为它控制了主机路由和默认路由。同时Router Advertisement还控制了IPv6的动态地址配置模式。在RA的数据中,有两个标志位M(Managed)和O(Other)。

  • 当M=0,O=0时,IPv6地址工作在SLAAC模式下
  • 当M=0,O=1时,IPv6地址工作在Stateless DHCPv6模式下
  • 当M=1时,IPv6地址工作在Stateful DHCPv6模式下

文章来源:https://zhuanlan.zhihu.com/p/79405231

https://zhuanlan.zhihu.com/p/78674906

Guess you like

Origin www.cnblogs.com/mrwuzs/p/11495931.html