在應用開發中你是如何處理IP地址存儲的呢?是不是定義為:(15)呢?
一、IPv4和IPv6(1)、IPv4介紹
網際協議版本4,又稱互聯網通信協議第四版,是網際協議開發過程中的第四個修訂版本,也是此協議第一個被廣泛部署的版本。IPv4是互聯網的核心,也是使用最廣泛的網際協議版本。
IPv4是一種無連接的協議,操作在使用分組交換的鏈路層(如以太網)上。此協議會盡最大努力交付數據包,意即它不保證任何數據包均能送達目的地,也不保證所有數據包均按照正確的順序無重復地到達。這些方面是由上層的傳輸協議(如傳輸控制協議)處理的。
到2019年底,全球所有43億個IPv4地址已分配完畢,這意味著沒有更多的IPv4地址可以使用。
格式
值
從點分十進制轉換
點分十進制
192.0.2.235
不適用
點分十六進制
0xC0.0x00.0x02.0xEB
每個字節被單獨轉換為十六進制
點分八進制
0300.0000.0002.0353
每個字節被單獨轉換為八進制
十六進制
將點分十六進制連在一起
十進制
用十進制寫出的32位整數
八進制
3
用八進制寫出的32位整數
(2)、IPv6介紹
IPv6即互聯網協議第6版,是互聯網工程任務組(IETF)設計的用于替代IPv4的下一代IP協議,其地址數量號稱可以為全世界的每一粒沙子編上一個地址。IPv6的地址長度為128位,是IPv4地址長度的4倍。于是IPv4點分十進制格式不再適用ipv4地址的主要表示格式是,采用十六進制表示。
IPv6表示方法1
格式為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
IPv6標識方法2
在某些情況下,一個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 → ::
IPv6標識方法3
內嵌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位的方法依舊適用 。
二、Mysql中相關函數(1)、
八點分十進制 ip地址 轉為無符號整型(4-8位)
mysql> select inet_aton('0.0.0.0') ip1,inet_aton('255.255.255.255') ip2;
+------+------------+
| ip1 | ip2 |
+------+------------+
| 0 | 4294967295 |
+------+------------+
1 row in set (0.00 sec)
(2)、
該函數把整型的ip地址轉為點分十進制形式
mysql> select inet_ntoa(0) ip1,inet_ntoa(4294967295) ip2;
+---------+-----------------+
| ip1 | ip2 |
+---------+-----------------+
| 0.0.0.0 | 255.255.255.255 |
+---------+-----------------+
1 row in set (0.00 sec)
(3)、
該函數把IPv6字符串地址轉換為無符號整型二進制數據
mysql> select inet6_aton('ABCD:EF01:2345:6789:ABCD:EF01:2345:6789') as v6;
+------------------+
| v6 |
+------------------+
| ??#Eg壂惋#Eg? |
+------------------+
1 row in set (0.00 sec)
(4)、
把二進制形式的無符號整型(128位),轉換為字符串形式IPv6地址
mysql> select inet6_aton('ABCD:EF01:2345:6789:ABCD:EF01:2345:6789') into @v6;
Query OK, 1 row affected (0.00 sec)
mysql> select inet6_ntoa(@v6) as v6s;
+-----------------------------------------+
| v6s |
+-----------------------------------------+
| abcd:ef01:2345:6789:abcd:ef01:2345:6789 |
+-----------------------------------------+
1 row in set (0.00 sec)
三、有效云平臺訪問日志處理方法
在有效云系統開發中,訪問日志的處理非常簡單,只需要一行代碼即可實現:
{{FUNC_SQLEXEC "sitedb" "insert into tb_visit_log(ip,domain,ua,refer_url) values (?,?,?,?)" IP DOMAIN USERAGENT REFER }}
這樣代碼直接放到任何頁面中(一般在HTML內容末尾), 為數據庫執行函數, 為鏈接代號。
其中參數 IP、、、REFER 均為系統上下文環境變量,直接引用。
● IP 客戶端訪問的IP地址
● 訪問的域名
● UA信息
● REFER 來源網址
數據表結構
CREATE TABLE `tb_visit_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`domain` varchar(255) DEFAULT '',
`refer_url` varchar(500) DEFAULT '',
`ua` varchar(500) DEFAULT '',
`ip` varbinary(16) DEFAULT NULL,
`logtime` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
如果是IPv4 ip可定義為(4),IPv6定義為(16)。
在顯示時, 或 轉換為字符串形式:
select id,if(IS_IPV4(ip),inet_ntoa(ip),inet6_ntoa(ip)) as ip,domain,ua,logtime from tb_visit_log limit logtime desc limit 2000;
這樣的定義可以很大程度節省數據庫的存儲空間和查詢效率。
IPv4: (15) 和 (4) 所需存儲空間相差11字節*(表數據格式寬),當數據量巨大時ipv4地址的主要表示格式是,這個間距將被放大。