正文
背景
大概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地址的划分
单播地址
单播地址:
用来唯一标识一个接口,类似于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协议簇的了解不是很熟,写不下去了...
IPV6数据包详解
- IPV6有很多优点:减少的路由分类表,只允许源头进行分片.
第五部分 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要求不高.需要应用层进行适配处理.
传输层对应用是黑盒的, 应用不需要关注, 但是操作系统行需要进行适配.