1.IPv6包的结构
IPv6报头 | 扩展报头 | 上层PDU |
| < ------- 有效负载 ------ > | |
< ---------------------------IPv6包--------------------------- > |
2.IPv6报头
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
版本 | 传输类型 | 流标签 | |||||||||||||||||||||||||||||
有效负载长度 | 下一报头 | 跳限制 | |||||||||||||||||||||||||||||
源地址 | |||||||||||||||||||||||||||||||
目标地址 |
3.下一报头Next Header字段的值
6 TCP
7 UDP
41 封装的IPv6报头
58 ICMPv6
135 移动头部
4.ICMPv6
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
类型 | 代码 | 校验和 | |||||||||||||||||||||||||||||
报文主体 |
错误报文: 类型 0-127
信息报文: 类型 128-255
5.邻节点发现ND
ND取代了IPv4中的ARP,ICMP,还提供了额外的功能
节点使用ND:
*解析IPv6数据包发往的邻节点的链路层地址
*确定邻节点链路层地址发生改变的时间
*确定邻节点的可达性
主机使用ND:
*发现邻节点路由器
*自动配置地址、地址前缀、路由及其他配置参数
路由器使用ND
*通告自己的存在、主机配置参数、路由及链路前缀
*提醒主机用于向特定目标转发数据包更好的下一跳地址
邻居请求和邻居公告
主机连接到一条链路上后,当它需要向同一链路上的其它主机发送报文时,除了要获得对方的IPv6地址外,还要获得对方的链路层地址。这个工作通过邻机请求(Neighbor Solicitation)消息和邻机公告(Neighbor Advertisement)消息完成。例如,如果主机A想获得主机B(IPv6地址为fe80::c033:6382)的链路层地址,则在链路上发送一个邻居请求消息,其中包含了B的IPv6地址,还有A的IP地址和链路层地址。实际上邻居请求消息中的目的地址是一个由主机B的IPv6地址生成的特殊组播地址(ff02::1:ff33:6382),所以主机B会接收这个消息,而链路上的其它主机不会接收。主机B收到邻机请求消息后,向主机A返回邻机公告消息,其中包含了B的链路层地址。主机A收到邻机公告消息后,将主机B放入它的邻机缓存中,以后主机A要向主机B发送消息就直接从邻机缓存中读取主机B的链路层地址。
另外,当一个主机连接到一条链路时,通常会主动发送一个邻机公告消息,通告自己的存在。该消息的目的地址是一个组播地址(ff02::1),链路上的其它节点都会接收这个消息。
路由器请求和路由器公告
主机向本链路外的主机发送的报文需要经过本链路上的路由器。为了发现链路上存在的路由器,主机可以发送路由器请求(RS:Router Solicitation)消息,这个消息的目的地址是一个组播地址(ff02::2),链路上的所有路由器都会接收这个消息。当路由器收到RS消息后,就会向主机发送路由器公告(RA:Router Advertisement)消息,其中包含了路由器的IPv6地址、子网地址前缀等信息。
路由器也会经常主动发送RA消息,这时RA消息的目的地址是一个组播地址(ff02::1),链路上的所有节点都会接收这个消息。
6.地址自动配置
在IPv6中,为了简化对地址的配置和管理,提供了两种可以让主机自动配置IPv6地址的方法,称为有状态地址配置和无状态地址自动配置。
有状态地址自动配置
使用动态主机配置协议,例如DHCPv6。它需要在网络中安装DHCPv6服务器,并在主机上运行DHCPv6客户程序。当主机需要配置地址时,由DHCPv6客户程序向DHCPv6服务器发送请求,服务器收到请求后给主机分配一个地址,然后返回应答,主机收到应答后就获得了地址。
无状态地址自动配置
当主机收到RA消息后,将子网前缀和本机的网络接口标识结合在一起,就生成了一个地址。例如RA消息中提供的子网前缀是3ffe:3216:2101:2106::/64,网络接口的48位链路层地址是02:E0:4C:30:0A:D5,则首先将链路层地址根据EUI64编码规则变换成64位的接口标识02:e0:4c:ff:fe:30:0a:d5,然后将接口标识附加到子网前缀后,就构成了一个新的网络地址3ffe:3216:2101:2106:02e0:4cff:fe30:0ad5。
重复地址检测
当主机配置了一个新的地址后,有可能该地址和同一链路上其它节点正在使用的地址重复,虽然这种可能性极小,但主机在使用自动配置的地址之前通常还需要检测一下地址是否重复。检测地址是否重复的一种方法是发送邻居请求消息,如果有节点已经使用了这个地址,那么该节点收到邻居请求消息后就会发送邻居公告消息。相反,如果没有任何节点发送邻居公告消息,则表明这个地址还没有被使用。