IPv4的一些问题:
为了解决IPv4地址不够用,推出了NAT、私网地址、子网划分等。
IPv4缺乏端到端通信,比如NAT转换了地址。如果用在FTP服务器上,经过NAT转换,两端IP不一致。
IPv4存在广播,对ARP依赖。
IPv4无法适应物联网技术,传输慢,校验和,分片。因为IPv4的头部长度为20-60字节,不固定,解封以太后,需要进行读取,才能确定IP头部长度。
IPv4组播地址:
- 224.0.0.1 所有主机的地址
- 224.0.0.2 所有组播路由器的地址
- 224.0.0.3 不分配
- 224.0.0.4dvmrp(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器
- 224.0.0.5 ospf(Open Shortest Path First,开放最短路径优先)路由器
- 224.0.0.6 ospf dr(Designated Router,指定路由器)
- 224.0.0.7 st (Shared Tree,共享树)路由器
- 224.0.0.8 st主机
- 224.0.0.9 rip-2路由器
- 224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,增强网关内部路由线路协议)路由器
- 224.0.0.11 活动代理
- 224.0.0.12 dhcp服务器/中继代理
- 224.0.0.13 所有pim (Protocol Independent Multicast,协议无关组播)路由器
IPv6基础知识
IPv4 32位 2^32个地址
IPv6 128位 2^128个地址
IPv6地址格式:IPv6地址长度为128比特,每16个比特分为一段,一共分为8段,每段由4个十六进制数表示,一个十六进制数为4个二进制数。每段用冒号隔开。
IPv6地址包括网络前缀和接口标识两部分。网络前缀为前两段,接口标识为后六段。
IPv6地址压缩简化:每一组中的前导0都可以省略,前导0最多有3个,也就是前3个。地址中包含的连续全为0的组,可以用双冒号表示。
0080 --->80
0000 --->0
0008 --->8
IPv6报文格式
IPv6快的原因:报文长度是固定的;字段少
IPv6固定长度40个字节,共有8个字段
Version:版本号,6
Traffic Class:流分类,主要用于QOS
Flow Label:流标签
Payload Length:标识上层协议数据单元
Next Header:下一个报头
Hop Limit:跳数限制,类似TTL
Source Address:源IP地址
Destination Address:目的IP地址
IPv6扩展报头:IPv6不同于IPv4扩展,扩展IPv4报头长度。而IPv6报头依然是固定的40字节,IPv6的扩展使用Next Header字段指明了下一个扩展报文的类型。并且扩展报头是可选的,只有当需要扩展时,才会添加扩展报头。(TLV架构)
IPv6扩展报文的种类:
报头类型为逐跳选项报头时,Next Header字段为0,用来表示巨型载荷的。比如一个载荷长度最多表示65535,如果有一个载荷长度超过65535,就使用该报头类型,用来表示一个巨型载荷的。放在Next Header字段中。
IPv6地址分类
单播
组播
任播
单播地址:
未指定地址:::/128,没有地址,意为IPv4中的0.0.0.0
环回地址:::1/128,IPv4位127.0.0.0/8
链路本地地址:FE80::/10,只要两台路由器连上线,就会有该地址,就可以使用该地址通信。但华为设备中,需要手动开启该功能或者配置单播地址之后,才可以。该地址不可被路由,即使宣告进路由协议也没用。只能在该广播域中使用。运行IPv6的路由器不转发目的地址为链路本地地址的IPv6报文。
全球单播地址:2000::/3,公网地址。一般是2000和3000开头的都是公网地址,但大多数都用2000开头的。
唯一本地地址:FC00::/7,私网地址。一般私网地址只存在于纯内网中使用,不想与其他公网地址通信时使用。
可聚合全球单播地址:64位代表64位网段,62位代表2^2=4个64位的网段。
链路本地地址:FE80::/10。固定的前10位+54位的0+64位的接口ID。
运行IPv6的路由器不转发目的地址为链路本地地址的IPv6报文。
接口ID使用EUI-64算法进行计算
EUI-64:通过把设备的MAC地址提取出来,在MAC地址的中间插入FFFE,即前24位和后24位的中间插入(MAC地址是48位),插入之后,在MAC地址的第7个比特位取反,得到的数值,再去还原成IPv6地址。
注:MAC地址的表示是16进制,一个16进制是4个2进制(比特位),而并非8个。
举例:
MAC地址:00e0-fc7e-5f6d
进行EUI-64算法:
1、在MAC地址的中间插入FFFE:00e0fcfffe7e
5f6d
2、在第7个比特位取反:先把前两个数字转换成2进制:0000 0000--->取反:0000 0010,然后再还原成16进制:02
3、把还原的数换成IPv6地址:02e0fcfffe7e5f6d--->02e0:0fcf:fe7e:5f6d——后64位接口ID
组播地址
FF开头的就是组播地址
地址范围:FF00::/8
FF01表示设备内部通信的地址
FF02表示链路上通信的地址 (类似于广播域)
FF02::5 所有OSPF路由器的组播地址
FF02::6 所有OSPF DR路由器的组播地址
被请求节点组播组:FF02::1:FF00:0/104
被请求节点组播地址通过节点的单播或任播地址生成。当一个节点有了单播或任播地址后,就会对应生成一个被请求节点组播地址,并加入这个组播组。
该地址主要用于邻居发现机制和地址重复检测功能。 类似于ARP
被请求节点组播地址固定前缀为:FF02::1:FF00:0/104和对应的IPv6地址的最后24位组成。有效范围为本地链路范围,即IPv4的广播。
组播地址的MAC地址映射:在发送组播IPv6的时候,仍需要封装以太,而目的MAC地址必须是组播MAC地址,并且与组播IPv6地址对应。
3333是专门为组播MAC预留的,在组播IPv6地址的最后48位中,前16位固定为33-33,而后32位,则从组播IPv6地址的后32位映射过来,就得到了组播MAC地址。
IPv6基础协议
ICMPv6
邻居发现协议:NDP
NDP使用ICMPv6的相关报文:
RS:路由器请求报文
RA:路由器通告报文
NS:邻居请求报文
NA:邻居通告报文
地址解析报文
地址解析用到了NS和NA报文,在设备配置IPv6地址后,会主动发送两个NS报文(类似于免费ARP),一个是链路本地地址的被请求节点组播地址,另一个是单播地址的被请求节点组播地址。
R1:2001::1 64
R2:2001::2 64
R1去访问R2时,要请求R2的MAC地址,R1发送NS报文,源地址为R1的IPv6地址,目的地址为R2的被请求节点组播组地址。源MAC为R1的MAC地址,目的MAC为2001::2对应的被请求组播组地址,通过映射得到的3333开头的组播MAC地址。然后发送出去。
R2收到后,回复NA报文,源地址为R2,目的地址为R1
邻居状态变化
重复地址检测DAD
类似于免费ARP。
使用NS和NA报文完成
地址在通过DAD检测前称为“tentative地址”,也就是测试地址。未通过前地址暂时不能使用。
节点向该测试地址所在的组播组地址发送一个NS,如果收到了NA,代表有其他节点回应,该地址已经被使用了,不能继续使用。
接口在使用任何一个单播IPv6地址前都需要进行DAD,包括链路本地地址。
IPv6无状态地址自动配置-SLAAC
- PC机生成链路本地地址后,先进行DAD检测。
- PC机使用链路本地地址向所有路由器发送RS报文(源地址为PC机链路本地地址,目的地址为FF02::2,所有路由器组播地址)
- 然后路由器收到后回复RA报文,该报文携带了网络前缀
- PC机收到网络前缀后,根据EUI-64算法生成IPv6单播地址
- 然后发送DAD检测等等
RA:路由器通告,路由器收到主机发送的RS回复的,只回复网络前缀。然后主机根据EUI-64计算。
RS:路由器请求,主机发送的。用来获取IPv6单播地址的。
在存在以下情况时,PC机会忽略RA发送的网络前缀:
- RA报文选下中的“auto”未置位
- 前缀与已有的地址前缀重复,包括链路本地地址
- RA报文中的优选地址时间大于有效生存时间
- 前缀长度与接口ID长度的和不够128位
RA消息中的flags字段
Cur Hop Limit:PC如果要用RA携带的网络前缀,PC机发送的IPv6报文跳数必须为64。
M位:默认为0,表示主机是无状态地址分配的。为1,表示有状态,PC机需要使用DHCPv6服务器的地址。ipv6 ndautoconfig managed-address-flag 可设置m位为1
O位:表示是否还有其他消息需要传达,如果有,则值为1。没有,值为0。这些消息代表,DNS等。因为通过无状态或有状态只能分配网络前缀,DNS等等无法分配。 有O位,必定有M位
Router Lifetime:单位是秒,表示PC机可以用多久的时间,把这台路由器当做网关设备。
地址生存时间
优选地址可以发送和接收消息
反对地址不能发送消息,但可以接受消息
但一台设备可以配置多个地址,A不能发送,但B地址可以发送,所以无需考虑这点。
重定向报文
当网关路由器知道更好的转发路径时,会以重定向报文的方式告知主机
PMTU
防止数据包过大,中间设备支持的MTU值太小,导致的数据包传送不过去。
源节点的数据包发送过去之后,不支持太大MTU的路由器设备会返回一个错误消息,告知源节点MTU太大,并告诉源节点自己所支持的MTU最大为多少,然后发送出去,源节点再进行切片。以此类推。
PMTU最小为1280bytes(IPv6要求链路层所支持的MTU最小为1280)。