本文通过以下4个方面调研,对比介绍主流数据库对IPv6的支持程度,包括:Server服务对IPV6监听,客户端支持度,是否存在IPv6数据类型,IPv6数据相关函数功能。
一、主流数据库对比简表
数据库 | 服务地址监听IPv6地址 | 客户端支持度(待细化) | IPv6相关数据类型 | IPv6相关函数 |
---|---|---|---|---|
Oracle | yes | all | no | no |
SQLServer | yes | all | no | no |
Informix | yes | all | no | no |
MySQL | yes | all | no | yes |
PostgreSQL | yes | all | yes |
yes |
MariaDB | yes | all | no | yes |
说明:以上仅为根据收集到的信息整理的结果。
二、国际商用主流数据库调研结果
2.1 Oracle
Oracle Database and IPv6 Statement of Direction
https://www.oracle.com/technetwork/database/enterprise-edition/oracledatabaseipv6sod-4007245.pdf
Oracle数据库11g R2支持在IPv6地址环境中所有单实例特性和组件,Oracle数据库12c R1做了扩展,在一些限制下,允许所有客户端通过公网访问Oracle RAC。这些限制在Oracle 数据库12c R2取消了,即全面支持IPv6.
a. Oracle Database 11g Release 2 使用IPv6的限制
除了Oracle RAC和Oracle Clusterware外,Oracle Database 11g Release 2 所有功能和组件都支持 IPv6.
b. Oracle Database 12c Release 1使用IPv6的限制
Oracle Database 12c Release 1 (12.1.0.2)不支持IPv6客户端连接Oracle RAC数据库,Oracle Clusterware 不能运行在Windows上。
c. Easy Connect Naming
Easy Connect Naming 支持 IPv6 地址. 语法支持 IPv6 URL格式,同时保留了对IPv4地址的支持:
[//]host[:port][/[service_name[:<server>]][/instance]]
为了能使用上面的语法, 主机地址需要替换为
IPv6地址,并用 “[“ 和 “]” 括起来.
Easy Connect 连接串示例如下:
[2001:fe8::12]:1522/sales.us.example.com
等价于下面的形式:
salesdb =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=2001:fe8::12)(PORT=1522))
(CONNECT_DATA=(SERVICES_NAME=sales.us.example.com)))
d. 包UTL_INADDR
UTL_INADDR 包提帮助PL/SQL 存储过程完成网络寻址等功能,有API解析出主机名和IP地址.
待研究其对IPv6的支持度,按官方声明是支持的。
包UTL_INADDR的手册地址:https://docs.oracle.com/database/121/ARPLS/u_inaddr.htm#ARPLS071
2.2 SQLServer
官方对IPv6支持的描述
《使用 IPv6 进行连接》
SQL Server 和 SQL Server Native Client 完全支持 Internet 协议版本 4 (IPv4) 和 Internet 协议版本 6 (IPv6)。 将 Windows 配置为使用 IPv6 SQL Server时,各组件会自动识别 IPv6 的存在。 不必采用特殊的 SQL Server 配置。
支持包括但不限于下列各项:
- SQL Server 数据库引擎 和其他服务器组件可以同时侦听 IPv4 和 IPv6 地址。 如果同时存在 IPv4 和 IPv6,则可以使用 SQL Server 配置管理器来配置 数据库引擎 ,以便只侦听 IPv4 地址或只侦听 IPv6 地址。
- 根据 IPv4 地址对运行于支持 IPv4 和 IPv6 的计算机上的 SQL Server Browser 服务进行查询时,该服务会对 IPv4 地址及其列表中的第一个 IPv4 TCP 端口做出响应。 根据 IPv6 地址进行查询时,该服务会对 IPv6 地址及其列表中的第一个 IPv6 TCP 端口做出响应。 为了避免出现不一致,建议将 IPv4 和 IPv6 侦听器配置为侦听相同的端口。
- SQL Server Management Studio 和 SQL Server 配置管理器等工具都接受 IPv4 和 IPv6 格式的 IP 地址。 大多数情况下,如果使用服务器主机名或完全限定的域名 (FQDN) 指定 <computer_name><instance_name>,则无须修改连接字符串。 如果服务器安装有 IPv4 和 IPv6,则其主机名或 FQDN 将会解析到多个 IP 地址,其中至少包括一个 IPv4 地址和多个 IPv6 地址。 SQL Server Native Client 会按照从 TCP/IP 接收这些 IP 地址时的顺序尝试使用它们来建立连接,并使用第一个成功建立的连接。 由于 SQL Server Native Client 无法预测顺序,因此,应将顺序视为随机顺序。 如果同时存在 IPv4 地址和 IPv6 地址,则首先尝试使用 IPv4 地址。 这一逻辑对于 ODBC、OLE DB 或 ADO.NET 的用户是透明的。
【说明】如果数据库引擎未侦听IPv4,则尝试进行IPv4连接之后,必须等待超时期限过后再尝试使用IPv6地址。为了避免出现这种情况,请直接连接到IPv6 IP地址或使用IPv6地址配置客户端的别名。
2.3 Informix
3.3.1 整体描述
IBM 关于其产品对IPv6兼容支持清单中,列举了Informix支持度。
Product (I) | First release with support | IPv6 basic | Dual stack support |
---|---|---|---|
IBM Informix Java Database Connectivity Driver | v3.50.JC6 | yes | yes |
IBM Informix Warehouse | v11.50 | yes | yes |
从 Informix 10.00.xC4
和 Client SDK 2.90.xC4
,服务在启动时会检查当前的操作系统是否支持 IPv6. 如果支持IPv6,服务将会使用;如果不支持 IPv6, 服务将会使用 IPv4 地址.
从用户视角,将 Informix 运行在一台同时支持 IPv4 和 IPv6 地址的服务器,与将Informix 部署在多 a multi-homed host. 用户可以在同时配置来IPv4和IPv6多机器上,采用以下任意方式来配置 Informix :
- 创建别名 (使用参数
DBSERVERALIASES
),分配给 IPv6 地址和 IPv4 地址. - 配置 Informix 监听主机sqlhosts文件中的所有IP地址.
例如:
#dbservername nettype hostname servicename options
olserver1 onsoctcp *myhost onservice1
启动Informix Version 10.0, 如果机器支持IPv6,则SQLHOSTS文件中主机名 会映射到 IPv6地址上;如果没有配置IPv6地址,主机名会映射到 IPv4 地址上.
关于禁用支持IPv6
Informix还允许在IPv4的环境下禁用 IPv6相关功能.
- 全局禁用支持IPv6,包括所有机器上的实例和客户端应用:
创建空文件
$INFORMIXDIR/etc/IFX_DISABLE_IPV6
说明:informix用户必须拥有读权限,但该文件不会真正读写内容,不需要包含任何数据。
- 仅禁止某个数据库实例或者某个客户端应用:
在数据库服务实例上,或者运行应用的机器上,创建环境变量IFX_DISABLE_IPV6
,并设置值为yes
, 即(IFX_DISABLE_IPV6=yes
)。
参见Informix support for IPv6 addresses
2.3.2 使用JDBC连接Server
IBM® Informix® JDBC Driver, Version 3.0及以后版本都支持IPv6.
解析连接URL的代码可以处理像IPv6地址这样更长的信息(IPv6 128位).例如:3ffe:ffff:ffff:ffff:0:0:0:12
要连接Informix服务的IPv6端口,可以使用系统属性,例如:java -Djava.net.preferIPv6Addresses=true
使用IBM Informix JDBC Driver, Version 3.0或之后的版本处理没有现式文字描述的URL时不受影响,原有行为也没有改变。
冒号 (:) 是连接URL中的关键分隔符,尤其是IPv6格式的.
用户需要使用格式严谨的URL,这样驱动才能识别IPv6地址串.
注意下面示例中的4点细节:
-
jdbc:informix-sqli://
是必须的. - 冒号括住端口
8088
, 即(:8088:)
是必须的. - 驱动不验证
3ffe:ffff:ffff:ffff:0::12
. -
8088
必须是小于32k的有效数字.
jdbc:informix-sqli://3ffe:ffff:ffff:ffff:0::12:8088:informixserver=X...
三、开源主流数据库调研结果
3.1 MySQL
3.1.1 MySQL对IPv6的支持主要在3个方面
MySQL对IPv6的支持体现在以下几个方面
1. 基于IPv6建立其连接
MySQL服务支持客户端以IPv6地址来建立TCP/IP连接,本机可以如下的方式建立连接
shell> mysql -h ::1
前提是:1、所在机器已经支持IPv6;2、MySQL服务配置支持IPv6来建立连接。
MySQL默认启用IPv6,可以通过修改--bind-address
来修改默认行为。
2. 基于IPv6来授权
MySQL账户名支持基于IPv6地址,由DBA对特定客户端进行授权. IPv6地址可以与账户名结合,在以下语句中使用,如 CREATE USER, GRANT, REVOKE. 如:
mysql> CREATE USER 'bill'@'::1' IDENTIFIED BY 'secret';
mysql> GRANT SELECT ON mydb.* TO 'bill'@'::1';
3. IPv6相关函数
- IPv6函数支持在字符串和内部IPv6格式之间转换,以及检查是否是有效的IPv6地址。例如, INET6_ATON() 、INET6_NTOA() 和 INET_ATON() 、INET_NTOA()类似, 但可以处理 IPv6 地址。
3.1.2 关于bind-address
参数
bind-address
的基本信息如下表
Property | Value |
---|---|
Command-Line Format | --bind-address=addr |
System Variable | bind_address |
Scope | Global |
Dynamic | No |
SET_VAR Hint Applies | No |
Type | string |
Default Value | * |
MySQL服务默认监听1个或多个网络socket。每个socket绑定到1个地址上,但可以映射到多个接口上。如果想配置服务如何监听TCP/IP连接,则需要在配合--bind-address来起服务。
在MySQL 8.0.13之前, --bind-address 只接收单一地址值, 可以是确定的IP地址或者是主机名, 也可以是使用通配符来监听多个接口 (*, 0.0.0.0, or ::).
从MySQL 8.0.13起, --bind-address 既接受上面介绍的单一地址值,又可以是一个逗号分隔的地址列表.如果是后者时,不能再使用通配符来描述IP地址.
IP地址可以IPv4 或IPv6地址。 当使用主机名时,服务会将主机名解析为IP地址,并绑定.如果有多个IP地址时,会解析为第一个IP地址值。
服务处理不同类型的规则如下:
- 当地址为 *, 服务监听所有网卡上所有地址连接,包括IPv4、IPv6,这也是缺省值.
- 当地址为 0.0.0.0, 服务仅监听IPv4的地址.
- 当地址为 ::, 服务监听所有网卡上IPv4、IPv6地址.
- 当地址为IPv4映射的地址, 服务仅监听这个地址,无论是IPv4形式还是IPv6形式.如服务绑定::ffff:127.0.0.1, 客户端可以这样连接:--host=127.0.0.1 或 --host=::ffff:127.0.0.1.
- 当地址特定IPv4、 IPv6地址(如 127.0.0.1 或 ::1), 服务仅监听这个地址。
如果任意一个地址绑定失败,服务都会产生错误,且不会启动。.
【示例】
- --bind-address=*
服务监听所有IP地址,包括 IPv4 或 IPv6地址. - --bind-address=198.51.100.20
服务只监听 198.51.100.20. - --bind-address=198.51.100.20,2001:db8:0:f101::1
服务同时监听 198.51.100.20 (IPv4地址)和 2001:db8:0:f101::1 (IPv6 地址). - --bind-address=198.51.100.20,*
会产生错误,因为在以列表形式列举IP地址时不能再使用通配符。
3.1.3 IPv6相关函数
- INET6_ATON() 将IPv6转化为数值
- INET6_NTOA() 将数值转化为IPv6地址串
- IS_IPV4_COMPAT() 判断是否 IPv4兼容地址
- IS_IPV4_MAPPED() 判断是否 IPv4映射地址
- IS_IPV6() 判断是否是IPv6地址
- IS_IPV4() 判断是否是IPv4地址
- INET_ATON() 返回地址的数值
- INET_NTOA() 将地址解析为IP地址
3.1.4 扩展阅读
- 使用IPv6非本地来连接 Connecting Using IPv6 Nonlocal Host Addresses
- 从服务商获取IPv6地址 Obtaining an IPv6 Address from a Broker
3.2 PostgresSQL(10.X)
3.2.1 支持网址数据类型
Name | Storage Size | Description |
---|---|---|
cidr | 7 or 19 bytes | IPv4 and IPv6 networks |
inet | 7 or 19 bytes | IPv4 and IPv6 hosts and networks |
macaddr | 6 bytes | MAC addresses |
macaddr8 | 8 bytes | MAC addresses (EUI-64 format) |
说明:针对cidr、inet类型排序时,IPv4地址在IPv6地址前。
3.2.1.1 inet
inet
类型可存储IPv4、IPv6主机地址及子网信息,而且所有都存在一个字段中. The subnet is represented by the number of network address bits present in the host address (the “netmask”). 如果网络掩码是32,则这个地址是IPv4, 这个值不能表明是子网,只是一个主机.
在IPv6, 网址长度为 128位,所以 128位代表一个具体的主机地址.注意,如果只需要接受网络,你应该使用cidr
而不是inet
.
输入的格式为 address/y ,其中address 是IPv4、IPv6地址,y是网络掩码位. 如果没有 /y , 默认是32(IPv4)或128(IPv6),仅代表一个具体的主机.
3.2.1.2 cidr
cidr
类型支持IPv4、IPv6网络规范.输入输出格式遵循Classless Internet Domain Routing conventions.
表:cidr Type Input Examples
cidr Input | cidr Output | abbrev(cidr) |
---|---|---|
192.168.100.128/25 | 192.168.100.128/25 | 192.168.100.128/25 |
192.168/24 | 192.168.0.0/24 | 192.168.0/24 |
192.168/25 | 192.168.0.0/25 | 192.168.0.0/25 |
192.168.1 | 192.168.1.0/24 | 192.168.1/24 |
192.168 | 192.168.0.0/24 | 192.168.0/24 |
128.1 | 128.1.0.0/16 | 128.1/16 |
128 | 128.0.0.0/16 | 128.0/16 |
128.1.2 | 128.1.2.0/24 | 128.1.2/24 |
10.1.2 | 10.1.2.0/24 | 10.1.2/24 |
10.1 | 10.1.0.0/16 | 10.1/16 |
10 | 10.0.0.0/8 | 10/8 |
10.1.2.3/32 | 10.1.2.3/32 | 10.1.2.3/32 |
2001:4f8:3:ba::/64 | 2001:4f8:3:ba::/64 | 2001:4f8:3:ba::/64 |
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001:4f8:3:ba:2e0:81ff:fe22:d1f1 |
::ffff:1.2.3.0/120 | ::ffff:1.2.3.0/120 | ::ffff:1.2.3/120 |
::ffff:1.2.3.0/128 | ::ffff:1.2.3.0/128 | ::ffff:1.2.3.0/128 |
3.2.1.3 inet vs. cidr
inet
与cidr
的本质区别是, inet
accepts values with nonzero bits to the right of the netmask, whereas cidr does not. 如192.168.0.1/24 对于inet合法,但对于cidr
无效.
- 如果你不喜欢inet 和cidr的输出格式,可以使用函数
host
,text
,abbrev
.
3.2.1.4 macaddr
macaddr
类型存储MAC地址,接收以下格式:
'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'0800-2b01-0203'
'08002b010203'
这些例子都代表同一个地址. 通过f来接收实现大小敏感。输出为第一种形式.
3.2.1.4 macaddr8
macaddr8 类型存储以EUI-64格式存储MAC地址.注意:IPv6使用修订过的EUI-64格式,从EUI-48转换过来需要第7位应该设置为1。接收以下类型的输入:
'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'
这些都代表同一地址.输出为第一种. 要将一个传统的48位MAC地址(EUI-48格式)转换为修订过的EUI-64格式(IPv6地址),使用函数macaddr8_set7bit:
SELECT macaddr8_set7bit('08:00:2b:01:02:03');
macaddr8_set7bit
-------------------------
0a:00:2b:ff:fe:01:02:03
(1 row)
3.2.2 网址函数与运算符
下表介绍了可用于cidr和inet类型的运算符. 运算符 <<, <<=, >>,>>=, && 用于测试是否包含在子网中.它们只处理两个网址的网络部分(忽略主机部分),判断一个网址是否等于另一个网址或是其子集.
表:cidr and inet Operators
Operator | Description | Example |
---|---|---|
< | is less than | inet '192.168.1.5' < inet '192.168.1.6' |
<= | is less than or equal | inet '192.168.1.5' <= inet'192.168.1.5' |
= | equals | inet '192.168.1.5' = inet '192.168.1.5' |
>= | is greater or equal | inet '192.168.1.5' >= inet '192.168.1.5' |
> | is greater than | inet '192.168.1.5' > inet '192.168.1.4' |
<> | is not equal | inet '192.168.1.5' <> inet '192.168.1.4' |
<< | is contained by | inet '192.168.1.5' << inet '192.168.1/24' |
<<= | is contained by or equals | inet '192.168.1/24' <<= inet '192.168.1/24' |
>> | contains | inet '192.168.1/24' >> inet '192.168.1.5' |
>>= | contains or equals | inet '192.168.1/24' >>= inet '192.168.1/24' |
&& | contains or is contained by | inet '192.168.1/24' && inet '192.168.1.80/28' |
~ | bitwise NOT | ~ inet '192.168.1.6' |
& | bitwise AND | inet '192.168.1.6' & inet '0.0.0.255' |
| | bitwise OR | inet '192.168.1.6' |inet '0.0.0.255' |
+ | addition | inet '192.168.1.6' + 25 |
- | subtraction | inet '192.168.1.43' - 36 |
- | subtraction | inet '192.168.1.43' - inet '192.168.1.19' |
下表介绍了可用于cidr和inet两种类型的函数. 函数abbrev
, host
, text
主要用于格式化显示.
表: cidr 、inet 函数
Function | Return Type | Description | Example | Result |
---|---|---|---|---|
abbrev(inet) | text | abbreviated display format as text | abbrev(inet'10.1.0.0/16') | 10.1.0.0/16 |
abbrev(cidr) | text | abbreviated display format as text | abbrev(cidr'10.1.0.0/16') | 10.1/16 |
broadcast(inet) | inet | broadcast address for network | broadcast('192.168.1.5/24') | 192.168.1.255/24 |
family(inet) | int | extract family of address; 4 for IPv4, 6 for IPv6 | family('::1') | 6 |
host(inet) | text | extract IP address as text | host('192.168.1.5/24') | 192.168.1.5 |
hostmask(inet) | inet | construct host mask for network | hostmask('192.168.23.20/30') | 0.0.0.3 |
masklen(inet) | int | extract netmask length | masklen('192.168.1.5/24') | 24 |
netmask(inet) | inet | construct netmask for network | netmask('192.168.1.5/24') | 255.255.255.0 |
network(inet) | cidr | extract network part of address | network('192.168.1.5/24') | 192.168.1.0/24 |
set_masklen(inet,int) | inet | set netmask length for inet value | set_masklen('192.168.1.5/24',16) | 192.168.1.5/16 |
set_masklen(cidr,int) | cidr | set netmask length for cidr value | set_masklen('192.168.1.0/24'::cidr,16) | 192.168.0.0/16 |
text(inet) | text | extract IP address and netmask length as text | text(inet'192.168.1.5') | 192.168.1.5/32 |
inet_same_family(inet,inet) | boolean | are the addresses from the same family? | inet_same_family('192.168.1.5/24','::1') | false |
inet_merge(inet,inet) | cidr | the smallest network which includes both of the given networks | inet_merge('192.168.1.5/24','192.168.2.5/24') | 192.168.0.0/22 |
说明:任意cidr值可转换为inet;因此,上表中的支持inet函数也支持cidr.
下表介绍了 macaddr 类型的相关函数type.函数trunc(macaddr) 返回MAC 地址.
表:macaddr 函数
Function | Return Type | Description | Example | Result |
---|---|---|---|---|
trunc(macaddr) | macaddr | set last 3 bytes to zero | trunc(macaddr '12:34:56:78:90:ab') | 12:34:56:00:00:00 |
说明:macaddr类型也支持标准的关系运算(>, <=等,按辞典顺序) 和位运算(~, & and |)
下表介绍了macaddr8类型相关的函数。
表macaddr8 函数
Function | Return Type | Description | Example | Result |
---|---|---|---|---|
trunc(macaddr8) | macaddr8 | set last 5 bytes to zero | trunc(macaddr8'12:34:56:78:90:ab:cd:ef') | 12:34:56:00:00:00:00:00 |
macaddr8_set7bit(macaddr8) | macaddr8 | set 7th bit to one, also known as modified EUI-64, for inclusion in an IPv6 address | macaddr8_set7bit(macaddr8'00:34:56:ab:cd:ef') | 02:34:56:ff:fe:ab:cd:ef |
说明:macaddr8类型也是标准的关系运算和位运算。
3.2.3 扩展阅读
https://www.postgresql.org/files/documentation/pdf/10/postgresql-10-A4.pdf
3.3 MariaDB(10.X)
3.3.1 IPv6相关函数
- IS_IPV6(expr) :如果是IPV6地址串,则返回1,否则返回0.
SELECT IS_IPV6('48f3::d432:1431:ba23:846f');
+--------------------------------------+
| IS_IPV6('48f3::d432:1431:ba23:846f') |
+--------------------------------------+
| 1 |
+--------------------------------------+
1 row in set (0.02 sec)
SELECT IS_IPV6('10.0.1.1');
+---------------------+
| IS_IPV6('10.0.1.1') |
+---------------------+
| 0 |
+---------------------+
- INET6_ATON(expr) :将IP地址串转换为对应的数值。
SELECT HEX(INET6_ATON('10.0.1.1'));
+-----------------------------+
| HEX(INET6_ATON('10.0.1.1')) |
+-----------------------------+
| 0A000101 |
+-----------------------------+
SELECT HEX(INET6_ATON('48f3::d432:1431:ba23:846f'));
+----------------------------------------------+
| HEX(INET6_ATON('48f3::d432:1431:ba23:846f')) |
+----------------------------------------------+
| 48F3000000000000D4321431BA23846F |
+----------------------------------------------+
- INET6_NTOA(expr):将数值转换为对应的IP地址串。
SELECT INET6_NTOA(UNHEX('0A000101'));
+-------------------------------+
| INET6_NTOA(UNHEX('0A000101')) |
+-------------------------------+
| 10.0.1.1 |
+-------------------------------+
SELECT INET6_NTOA(UNHEX('48F3000000000000D4321431BA23846F'));
+-------------------------------------------------------+
| INET6_NTOA(UNHEX('48F3000000000000D4321431BA23846F')) |
+-------------------------------------------------------+
| 48f3::d432:1431:ba23:846f |
+-------------------------------------------------------+
- IS_IPV4_COMPAT(expr): 与INET6_ATON()配合判断IPV6地址是否是IPV4兼容的,是则返回1,否则返回0。
SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.1.1'));
+------------------------------------------+
| IS_IPV4_COMPAT(INET6_ATON('::10.0.1.1')) |
+------------------------------------------+
| 1 |
+------------------------------------------+
SELECT IS_IPV4_COMPAT(INET6_ATON('::48f3::d432:1431:ba23:846f'));
+-----------------------------------------------------------+
| IS_IPV4_COMPAT(INET6_ATON('::48f3::d432:1431:ba23:846f')) |
+-----------------------------------------------------------+
| 0 |
+-----------------------------------------------------------+
- IS_IPV4_MAPPED(expr):与INET6_ATON()配合,判断IPV6地址是否是有效的IPV4映射地址,是则返回1,否则返回0。
SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.1.1'));
+------------------------------------------+
| IS_IPV4_MAPPED(INET6_ATON('::10.0.1.1')) |
+------------------------------------------+
| 0 |
+------------------------------------------+
SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.1.1'));
+-----------------------------------------------+
| IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.1.1')) |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+
3.3.2 客户端
MariaDB Connector/J
JDBC连接串格式如下:
jdbc:(mysql|mariadb):[replication:|failover:|sequential:|aurora:]//<hostDescription>[,<hostDescription>...]/[database][?<key1>=<value1>[&<key2>=<value2>]]
HostDescription如下:
<host>[:<portnumber>] or address=(host=<host>)[(port=<portnumber>)][(type=(master|slave))]
host必须是DNS名或者IP地址,如果是IPV6+简单host描述,则IP地址必须写在[]中,如下例。
[2001:0660:7401:0200:0000:0000:0edf:bdd7]:3306
四、云服务商流数据库调研结果
4.1 阿里云
- 《阿里云IPv6解决方案》
- IPv6转换服务
IPv6转换服务(IPv6 Translation Service),是一种有状态的IPv6和IPv4网络地址与协议转换服务。通过IPv6转换服务,具备公网IPv4地址的服务器可快速面向IPv6网络侧用户提供访问服务。IPv6转换服务当前提供四层模式(支持TCP和UDP协议)。
4.2 百度云
为此百度云制定了IPv6改造的“三步走”方案。
- 第一步,将百度云网络接入IPv6网络环境,为产品提供IPv6接入访问服务;
- 第二步,百度云核心产品支持IPv6协议栈,拥有全球唯一的IPv6地址,并具备主动访问IPv6网络能力;
- 第三步,百度云所有产品支持IPv4和IPv6双协议栈,为用户提供完整的IPv6网络支持。
百度云在EIP上集成了 IPv6 终结功能,为绑定了EIP的云服务器、负载均衡等实例提供IPv6访问能力。用户无需改造现有业务架构部署,只需在EIP上开启IPv6终结功能,即可获取到一个IPv6地址,使业务获得对外提供IPv6访问服务的能力,IPv6网络客户端访问该地址的流量会被转换为IPv4流量,实现用户业务和IPv6网络的平滑对接。
IPv6地址分配原则:EIP开启IPv6终结功能后,会为该EIP分配一个全球唯一的IPv6地址,地址组成为 “2400:da00:404:2::” 前缀拼接EIP的IPv4地址,即128位IPv6地址前96位为固定前缀,后32位为对应EIP的IPv4地址。
每个EIP仅会分配一个IPv6地址,EIP关闭IPv6终结功能后该IPv6地址会被系统回收。
注意:目前百度云IPv6终结功能处于公测阶段,仅向华北-北京区域(Region)的EIP实例开放试用,用户需通过工单申请开通。
4.3 腾讯云
腾讯云IPv6技术将采用平滑过渡的方式推进:
- 第一步,在中国互联网的客户端和流量以IPv4为主的大环境下,提供平滑、安全的IPv6互联网入口,也提供透明的6to4转换服务访问底层核心网络和现网业务,时间是2018到2019年;
- 第二步,到2020年,逐步完成端到端的IPv6改造,此时IPv6与IPv4同时运行在腾讯云上;
- 第三步,随着中国互联网的IPv6访问和流量的比例加大,底层核心网络向IPv6过渡完成,IPv6成为网络主体,同时兼容存量的IPv4的业务。到2022年基本实现从IPv4到IPv6的切换。
五、附录
附录一、 IPv6标准简介
IPv6
IPv6的地址长度为128b,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。IPv6有3种表示方法。
一、冒分十六进制表示法
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
这种表示法中,每个X的前导0是可以省略的,例如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
二、0位压缩表示法
在某些情况下,一个IPv6地址中问可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
三、内嵌IPv4地址表示法
为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用 [6] 。
国际标准
- Internet Protocol, Version 6 (IPv6) Specification, rfc8200 https://tools.ietf.org/html/rfc8200
- List of IPv6 tunnel brokers https://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers
- Format for Literal IPv6 Addresses in URL's,rfc2732https://tools.ietf.org/html/rfc2732
推广情况
- IPV6 的发展是从 1992 年开始的,截止 2016 年 9 月底,全球共有超过 220 个国家和地区组织申请了 IPv6 地址,申请量已经达到 IPv4 地址的 18 万多倍,其中 25.4%的地址块已通告使用。全球 13 个根域名服务器中已有 11 个根域名服务器支持 IPv6;1346个顶级域名服务器中已有 1318 个支持 IPv6,占比达 97.9%。
- 全球活跃的 IPv6 路由条目超过 2.9 万条,支持 IPv6 的自治域超过 1.18 万个,已有超过 248 个运营商永久提供IPv6 的接入服务。
信息源:https://www.chyxx.com/industry/201801/606465.html
附录二、中国关于IPv6的战略布局
国家战略规格
2017-11-26 中共中央办公厅 国务院办公厅印发《推进互联网协议第六版(IPv6)规模部署行动计划》
推广情况
- 在网络基础设施方面,三家基础电信企业已完成26个省、上百个地市LTE网络IPv6改造,并为LTE用户分配IPv6地址,目前基础电信企业已分配IPv6地址的用户总数超过7000万。
- 在应用基础设施方面,基础电信企业的大型数据中心均已支持IPv6,基本建立IPv6业务受理、开通测试流程;部分内容分发网络企业、云服务平台企业已完成部分产品IPv6改造,正逐步提供IPv6商用服务。
- 在互联网应用方面,主要互联网企业针对用户量大、流量集中的互联网应用,均制定了IPv6改造实施方案,相关改造工作正有序开展;基础电信企业的门户网站及部分自营业务系统已完成IPv6改造并对用户提供服务。
- 在终端方面,国内主要的LTE终端基本具备IPv6支持能力,大部分终端默认配置支持IPv4/IPv6双栈。
信息源:http://net.yesky.com/internet/312/1102614812.shtml
附录三、判断系统是否支持IPv6
本机命令检测
最简单的验证方式是,执行命令(ping6 ::1
)来验证。
$ uname -v
Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT 2018; root:xnu-4570.71.2~1/RELEASE_X86_64
$ ping6 ::1
PING6(56=40+8+8 bytes) ::1 --> ::1
16 bytes from ::1, icmp_seq=0 hlim=64 time=0.105 ms
16 bytes from ::1, icmp_seq=1 hlim=64 time=0.131 ms
16 bytes from ::1, icmp_seq=2 hlim=64 time=0.141 ms
16 bytes from ::1, icmp_seq=3 hlim=64 time=0.138 ms
^Z
[1]+ Stopped ping6 ::1
第3方网站监测
地址:http://test-ipv6.com/
源于一个开源项目,test-IPv6.com是一个开源网站,致力于帮助终端用户确定IPv6是否可用.
附录四、Linux IPv6 HOWTO (en)
Linux IPv6 HOWTO的目标是解答关于Linux系统中IPv6相关问题,包括安装、配置、使用IPv6程序.
参考
- 百度百科 IPv6
- 维基百科 IPv6
- 新华社授权发布 《推进互联网协议第六版(IPv6)规模部署行动计划》
- 国务院直接发布 《推进互联网协议第六版(IPv6)规模部署行动计划》
- IBM产品兼容IPv6清单
- Informix support for IPv6 addresses
- Internet Protocol, Version 6 (IPv6) Specification, rfc8200 https://tools.ietf.org/html/rfc8200
- PostgreSQL 手册 https://www.postgresql.org/files/documentation/pdf/10/postgresql-10-A4.pdf