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地址是由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模式下