背景

大概2018年时曾经突击学习过一段时间IPV6
当时没太有写文档的习惯,导致这边没有成型的记录了.
今天又有项目要求使用IPV6, 想了想就将之前学习的部分
还有想继续学习提高的部分进行一下总结. 
因为自己不是科班网工出身,总结的可能有所偏颇.

第一部分IPV6与IPV4的区别

IPV6和IPV4都属于TCP/IP协议簇中的成员.
区别在于IPV4成型较早, 并且没有考虑到万物互连的场景所以空间有限.
IPV6是为了解决IPV4存在的固有问题. 以及进行优化传输层的安全等设置.

IPV4大概有42亿个地址空间.
IPV6是2的128次方 是 42亿*42亿*42亿*42亿的地址数量. 
IPV6的地址空间大概是 340兆兆兆个.
其实 兆单位的含义是 "万亿"

第一部分IPV6与IPV4的区别

IPV4 采用 ARP协议发现同一个子网内部的其他机器.
IPV6 采用 ND协议进行同样处理 neighbour discovery 协议.

IPV4 使用 127.0.0.1 表示自己的位置. 
IPV6 可以使用 ::1来表示自己.
IPV6增加了FE80::XXXX 还有FEC0::XXXX等的地址进行表示自身.
其中后面64卫一般是通过MAC地址进行换算得来. 

在大部分路由器下都可以实现 MAC地址与IPV6地址的解析
能够实现再当前LAN内 实现IPV6的互通. 

如果汇聚层或者是核心层不支持IPV6的话. 可能跨了汇聚交换机就无法连通地址了. 

IPV6本地地址的换算

IEEE EUI-64 地址代表网络接口寻址的新标准。
公司 ID 仍然是 24 位长度,但扩展 ID 是 40 位,
从而为网络适配器制造商创建了更大的地址空间。
EUI-64 地址使用 U/L 和 I/G 位的方式与 IEEE 802 地址相同。

要获取用于 IPv6 单播地址的 64 位接口标识,
EUI-64 地址中的 U/L 位将进行求反:
如果是 1,则被设置为 0;如果是 0,则被设置为 1

IPV6本地地址的换算

主机 A 的以太网 MAC 地址是 00-AA-00-3F-2A-1C。
首先,通过在第三个和第四个字节之间插入 FF-FE 将其转换为 EUI-64 格式,
其结果是 00-AA-00-FF-FE-3F-2A-1C。

然后,对 U/L 位(第一个字节中的第七位)求反。
第一个字节的二进制形式为 00000000。将第七位求反后,
变为 00000010 (0x02)。
最后的结果是 02-AA-00-FF-FE-3F-2A-1C,
当转换为冒号十六进制符号时,
成为接口标识 2AA:FF:FE3F:2A1C。
应于 MAC 地址 00-AA-00-3F-2A-1C 的网络适配器的链接本地地址是:
FE80::2AA:FF:FE3F:2A1C。

一个简单的判断自己网络是否支持IPV6的方法

ping -6 240c::6666
如果通了 说明在自己所在的网络环境是IPV6联通的
如果不通 说明网络环境不支持IPV6
注意: 240c::6666 是中国境内政府机关定义的一个DNS

第二部分 IPV6地址的划分

  • 如图所示,地址分为三大类:组播、单播、任意播

image


单播地址

单播地址:
用来唯一标识一个接口,类似于IPv4中的单播地址。
发送到单播地址的数据报文将被传送给此地址所标识的一个接口。

一、全局单播地址:
等同于IPv4中的公网地址,可以在IPv6 Internet上进行全局路由和访问。
这种地址类型允许路由前缀的聚合,从而限制了全球路由表项的数量。

二、本地单播地址:
链路本地地址和唯一本地地址都属于本地单播地址,
在IPv6中,本地单播地址就是指本地网络使用的单播地址,
也就是IPV4地址中局域网专用地址。每个接口上至少要有一个链路本地单播地址,
另外还可分配任何类型(单播、任播和组播)或范围的IPv6地址。

组播地址

组播地址:
用来标识一组接口(通常这组接口属于不同的节点),
类似于IPv4中的组播地址。
发送到组播地址的数据报文被传送给此地址所标识的所有接口

IPv6组播地址可识别多个接口,对应于一组接口的地址(通常分属不同节点)。
发送到组播地址的数据包被送到由该地址标识的每个接口。
使用适当的组播路由拓扑,将向组播地址发送的数据包发送给该地址识别的所有接口。
任意位置的IPv6节点可以侦听任意IPv6组播地址上的组播通信。
IPv6节点可以同时侦听多个组播地址,也可以随时加入或离开组播组。 
IPv6组播地址的最明显特征就是最高的8位固定为1111 1111。
IPv6地址很容易区分组播地址,因为它总是以FF开始的 。

任播地址

任播地址:
用来标识一组接口(通常这组接口属于不同的节点)。
发送到任播地址的数据报文被传送给此地址所标识的一组接口中
距离源节点最近的一个接口。
(根据使用的路由协议进行度量)

一个IPv6任播地址与组播地址一样也可以识别多个接口,对应一组接口的地址。
大多数情况下,这些接口属于不同的节点。
但是,与组播地址不同的是,发送到任播地址的数据包被送到由该地址标识的其中一个接口。 
通过合适的路由拓扑,目的地址为任播地址的数据包将被发送到单个接口
(该地址识别的最近接口,最近接口定义的根据是因为路由距离最近),
而组播地址用于一对多通信,发送到多个接口。
一个任播地址必须不能用作IPv6数据包的源地址;
也不能分配给IPv6主机,仅可以分配给IPv6路由器。

第三部分 IPV6的数据库连接表示

Study From : https://blog.csdn.net/xlxxcc/article/details/51148086

注意IPV6的 IP地址使用 ":" 的方式进行分隔
与IPV4地址的处理时的端口 使用的分隔符是一样的

一般为了进行区分两种不通的地址,一般使用"[::1]" 将IPV6地址包裹起来.

所以一般写url的时候可以使用 http://[::1]:port 的方式来处理. 
需要注意, 如果网络不支持IPV6
可以自己手工指定IPV6的地址. 可以输入比较好记忆的地址进行使用. 

Mysql

Class.forName("com.mysql.jdbc.Driver"); 
// ipv4连接URL
// String jdbcIpv4Url = "jdbc:mysql://127.0.0.1:3306/databaseName"; 
// ipv6连接URL
// String jdbcIpv6Url = "jdbc:mysql://address=(protocol=tcp)(host=2001:470:23:13::6)(port=3306)/database"; 
// ipv6连接localhost 的 URL
String jdbcIpv6Url = "jdbc:mysql://address=(protocol=tcp)(host=::!)(port=3306)/database"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url); 

Oracle

Class.forName("oracle.jdbc.OracleDriver"); 
// ipv4连接URL
// String jdbcIpv4Url = "jdbc:oracle:thin:@//127.0.0.1:3306/orcl"; 
// ipv6连接URL
String jdbcIpv6Url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)
(HOST=[fe80::5cf:72])(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=fnstdb1)))"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url ); 

DB2

Class.forName("com.ibm.db2.jcc.DB2Driver"); 
// ipv4的连接方式
// String jdbcIpv4Url = "jdbc:db2://127.0.0.1:50000/sample"; 
// ipv6的连接方式
String jdbcIpv6Url = "jdbc:db2://[2001:470:23:13::6]:50000/sample"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url ); 

SQLServer

Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
// ipv4
//String jdbcIpv4Url = "jdbc:jtds:sqlserver://127.0.0.1:1433/master"; 
// ipv6
String jdbcIpv6Url = "jdbc:jtds:sqlserver://"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
// 如果使用ipv6
if (ipv6) { 
jdbcProperties.put("portNumber", 1433); 
jdbcProperties.put("instanceName ", "master"); 
jdbcProperties.put("serverName","2001:470:23:13::6"); 
} 
Connection connection = DriverManager.getConnection(jdbcUrl);

第四部分 IPV6的数据包升级

  • IPV6比IPV4的数据包头有了较大的变化
  • 自己对TCP/IP协议簇的了解不是很熟,写不下去了…

image


IPV6数据包详解

  • IPV6有很多优点:减少的路由分类表,只允许源头进行分片.

image


第五部分 IPV6的安全性提升

本来第四部分的报文头自己认为不熟悉.
发现IPsec自己更加不熟悉.

一般文章都是写IPV6默认开启了IPsec. 但是今天仔细查了下资料:
RFC 6434 中已经规定IPV6可以不强制开启IPsec了. 
所以实质上并不是所有的IPV6一定都是安全的IPsec进行保护的. 

但是晚上学习了很多文章, 发现大部分文章的观点是因为IPV4中NAT技术的问题.
IPV4的IPsec其实并不是非常完美
但是IPV6还是跟IPsec兼容的非常完美的, 可以较好的实现安全协议. 

关于IPsec

网络安全主要有三种方式进行保证:
1. 物理层 
   也就是我们常说的网络隔离,SM网,ZY网的处理.或者是政务网. 
2. 应用层
   应用层协议就是咱们经常说的TLS/SSL协议簇.
   最多的应用是 https以及smtps
3. 传输层
   IPsec. 其实也是一个协议簇,里面包好很多网络协议. 
   比如AH以及ESP还有IKE协议. 
   他可以在传输层,给IP数据包进行加密和解密的处理.
优缺点:
物理层最安全,但是最昂贵,最不灵活.
应用层对IaaS要求不高.需要应用层进行适配处理.
传输层对应用是黑盒的, 应用不需要关注, 但是操作系统行需要进行适配.

原文地址:http://www.cnblogs.com/jinanxiaolaohu/p/16852556.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性