ipv4的地址池有限,并且公网ip已经枯竭。ipv6应运而生,区别于只有32位的ipv4,ipv6一共有128位,“地球上的每一粒沙子都能得到ipv6地址”。相应的,在总结ipv4地址枯竭,报头不合理,路由表繁重,查表效率低,容易发生arp广播泛滥。而ipv6拥有几乎无限的地址,地址层次化分配,即插即用(自动配置很快),简化的报文头部,同时安全特性更好,保证端到端通信完整性,对移动性支持更好,有增强的QoS、
特性。
几乎无限的地址空间:地址长度为128bit(16字节),海量的地址空间
层次化的地址结构:相较于IPv4地址,IPv6地址的分配更加规范,利于路由聚合(缩减IPv6路由表规模)、路由表快速查询
即插即用:IPv6支持无状态地址自动配置(SLAAC),终端接入 更简单。
简化的报文头部:简化报文头,提高效率;通过扩展包头支持新应用,利于路由器等网络设备的转发处理,降低投资成本。(换言之就是不再像ipv4报文一样把包括option扩展内容在的地方全塞一个地方,导致报文的长度常常是变化的,20-60bytes)
安全特性:IPsec、真实源地址认证等保证端到端安全;避免NAT破坏端到端通信的完整性。(因为地址特别多所以所有人都能分到一个ipv6地址,无需内网地址转公网地址之类的操作了)
移动性:对移动网络实时通信有较大改进,整个移动网络性能有比较大的提升。
增强的QoS特性:额外定义了流标签字段,可为应用持续或者终端所用,针对特殊的服务和数据流,分配特定的资源。
基本报头
IPv6报头由一个IPv6基本包头(必须存在)和多个扩展报头(可以没有)组成
基本报头提供报文转发的基本信息,会被转发路径上的所有设备解析
先理解下ip报头(headers)的作用
当主机发送一个IP数据包时,基本结构通常是:
Ip报头+IP负载
其中报头携带控制信息,告诉网络设备数据包从哪里来、要去哪里,以及应该如何处理。
而IP载荷(Payload)则携带TCP/UDP报文等

我们观察保留和变化的字段。4位的Version是共有的用于指示版本的(毕竟两种技术都还在一起使用)
v4的4位IHL用于指示报头长度,v6舍弃了这个东西,因为v6的报头长度是稳定的
ToS共占八位,服务质量相关信息,现在主要使用DSCP/ECN,在v6被traffice class代替。
Total Length十六位,整个IP数据包长度。v6使用Payload Length指示负载长度。Indentification16位,标识数据包,用于分片重组(因为v4有很多数据包需要分片传输),Flags控制是否允许分片、是否还有后续分片。Fragment Offset标识分片在元数据中的位置,这俩在v6消失了。TTL限制数据包经过路由器的次数,在v6由Hop Limit代替。Protocol有8位,指示承载的上层协议。我有点忘记这是啥了。啊指的是IP载荷应该交给哪个上层协议处理,指的就是我们IP段会承载的上层的协议,比如TCP啊UDP之类的这些应用层的东西。其实还有同层的比如说ICMP这些,他们也有对应的Protocol值会考,比如ICMP的Protocol值为1,TCP的Protocol值为6,UDP的Protocol值为17.
Header Checksum用来检查v4报头是否出错,Options长度可变为可选控制信息,Padding同样可变,填充,使报头长度满足4Byte对齐。
接下来解析IPv6的报头,IPv6基本报头固定为40Byte,只有8个字段。
Version位数为4,值为6,Traffic Class位数为8,区分流量类别与服务质量
Flow label位数为20,标识数据流,Payload length位数为16,基本报头之后的载荷长度,Nest Header位数为8,指示后续协议或扩展报头类型。Hop Limit位数8,限制数据包转发跳数,Source Address为128位,指示源IPv6地址,Destination Address位数为128,目的IPv6地址
值得注意的变化:
1、Traffice Class取代ToS
IPv4的ToS字段在IPv6中对应Traffic Class,主要用于服务质量控制,例如区分不同类别的网络流量和拥塞通知。
2、Flow Label(流标签)是新增字段
这是IPv6非常有代表性的新增字段,长度为20bit,它可以为属于同一数据流的数据包提供一个标识,让支持该功能的网络设备能识别同一流。例如持续的视频传输,发送端可以给这条流的数据包设置相同的非零Flow Label。需要注意的是,流标签并不保证数据包一定得到优先转发,也不等于自动为流预留带宽。
3、Payload Length与IPv4 Total Length不一样
v4的Total Length是报头加上载荷,而v6的Payload Length则是扩展报头加上上层载荷
v6的Payload Length不包括40Byte的基本报头。
例如,没有扩展报头的情况下,一个IPv6数据包总长1500Byte:
$ Payload Length = 1500-40 =1460Byte $
4、Next Header取代Protocol
IPv4的Protocol一般用来指示上层协议。IPv6的Next Header功能,它可以指向上层协议,也可以指向IPv6扩展报头。

可以理解成IPv6采用了一种更灵活的链式报头结构,不需要把所有控制功能放到基本报头中。
核心变化不妨总结为:v6固定报头长度,删去IHL。简化分片处理,不允许中间路由器对数据包进行分片,发送端根据路径MTU选择合适的数据包大小,必要时由源端使用Fragment扩展报头分片,这减少了中间路由器的处理负担。取消IP报头校验和,因此路由器转发时不必因为Hop Limit变化而重新计算它。
最需要记住的区别
| 比较项目 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit | 128 bit |
| 基本报头长度 | 20~60 Byte | 固定 40 Byte |
| 报头长度字段 | IHL | 无 |
| 数据长度字段 | Total Length | Payload Length |
| 转发寿命 | TTL | Hop Limit |
| 上层协议指示 | Protocol | Next Header |
| 路由器分片 | 满足条件时支持 | 不支持 |
| 报头校验和 | 有 | 无 |
| 可选功能 | Options | 扩展报头 |
| 数据流标识 | 无独立 Flow Label | Flow Label |
讲完了基本报头的概念,同时还有相应的扩展报头

扩展报头有名为Next Header的字段以标识自己,Extension Header Length和Extension Header Data加起来为变长,Length本身占8bit,用来表示扩展报头的长度,不包含Next Header字段256应该是够用的?Data长度可变。

IPv6报文处理机制:

中间的路由器只处理基本报头,逐跳选项报头(我们可以注意这里的Next Header就像节点一样在链式转发),直到最后的终点路由器再处理全部信息。
IPv6地址的总长度
IPv6的长度为128bit。一般用冒号分割为8段,每一段16bit,每一段内用十六进制表示。
例如:

2001:0DB8:0000:0000:0008:0800:200C:417A
坦白讲我对ipv6的地址表示相当的恐惧,太长太复杂了,也可能是我纯粹不习惯十六进制。
IPv6地址中的字母大小写不敏感,例如A等同于a。
与IPv4地址类似,IPv6也用“IPv6地址/掩码长度”的方式来表示IPv6地址。
例如2001:0DB8:2345:CD30:1230:4567:89AB:CDEF
子网号:2001:0DB8:2345:CD30::/64
接下来将是最恐怖最麻烦的地方,IPv6地址缩写规范

首0可以省略,长0用::表示,只能有一个::
IPv6地址分类:
这块其实我没有太看懂。根据IPv6地址前缀,可将IPv6地址分为单播地址、组播地址和任播地址。

汗颜,其实我也不记得v4的地址分类了。
IPv6的单播地址结构:
正如IPv4,一个IPv6单播地址可以分为如下两部分:
网络前缀(Network Prefix): n bit,相当于IPv4地址中的网络ID。
接口标识(Interface Identify):(128-n)bit,相当于IPv4地址中的主机ID。
常见的IPv6单播地址如全球单播地址、链路本地地址等,要求网络前缀和接口标识必须为64bit。
IPv6单播地址接口标识:
接口标识可通过三种方式生成:
手工配置、系统自动生成、通过IEEE EUI-64规范生成
其中EUI-64规范最为常用,此规范将接口的MAC地址转换为IPv6接口标识

我们知道MAC地址是48位的,而假若网络前缀已固定,我们要生成的就只剩下64位的接口标识
具体方法是将以48位的MAC地址当作模板,在中间插入固定的序列FFFE,同时将MAC地址原本的第七位取反,得到64位的EUI-64位(十六进制0
IPv6常见单播地址 -GUA
GUA(Global Unicast Address,全球单播地址),也被称为可聚合全球单播地址。该类地址全球唯一,用于需要有互联网访问需求的主机,相当于IPv4的公网

这大概就是一堆2001开头的原因了
常见单播 ULA
ULA(Unique Local Address,唯一本地地址)是IPv6私网地址,只能够在内网中使用。该地址空间在IPv6公网中不可被路由,因此不能直接访问公网。

开头的7bit是确定的,唯一本地地址使用FC00::/7地址块,目前仅使用了FD00::/8地址段。FC00::/8预留为以后拓展用。ULA虽然只在有限范围内有效,但也具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低),只能在私网使用是为了隔离吗?
LLA:
LLA(Link-Local Address,链路本地地址)是IPv6中另一种应用范围受限制的地址类型。LLA的有效范围是本地链路,前缀为FE80::/10。

这个我们可以打开网络设置查看一下,基本上每台电脑都能看到。原因在接下来就会说。
LLA用于一条单一链路层面的通信,例如IPv6地址无状态自动配置、IPv6邻居发现等(好像叫NDP?因为IPv6没有广播,所以想要找人的时候通过邻居发现,这个后面应该会讲)。
源或目的IPv6地址为链路本地地址的数据包将不会被转发到始发的链路之外,换句话说,链路本地地址的有效范围为本地链路。每一个IPv6接口都必须具备一个链路本地地址(这就是我们总是看到它的原因了)。华为设备支持自动生成和手工指定两种配置方式。
IPv6组播地址
IPv6组播地址标识多个接口,一般用于“一对多”的通信场景。
IPv6组播地址只可以作为IPv6报文的目的地址。

Flags:用来表示永久或临时组播组
Scope:用来表示组播的范围
Group ID:组播组ID
被请求组节点组播地址
当一个节点具有了单播或任播(多个服务器具有同样的任播地址,但是报文只会给其中一个),就会对应生成一个被请求节点组播地址,并且加入这个组播组。该地址主要用于邻居发现机制和地址重复检测功能。被请求节点组播地址的有效范围为本地链路范围

好诡异的东西,看起来就是说,拿前面固定的104bit来确定一个组播组

任播比较简单,没啥好说的