IPv6地址範圍
回答
在範圍中使用IP地址(既不是IPv4也不是IPv6)是不正確的。將IP地址的特定「範圍」進行分組的正確方法是使用前綴(CIDR表示法)或掩碼(過時,僅對IPv4有效,如果嘗試使用非連續掩碼則會發生瘋狂)。
有時你會看到使用IPv4範圍的人(有時甚至是應用程序,家庭路由器等),但這只是錯誤的做法。
使用Classless Inter-Domain Routing (CIDR)你將有一個元組<地址,前綴>,其中地址是一個128位無符號整數和前綴是一個微小的(0..128)無符號整數。前綴表示網絡地址中有多少位最重要的位表示網絡地址,而其他128位前綴最不重要位表示該網絡中的特定主機。因此,例如,2620:0:860:2 ::/64(wikimedia.org)的IPv6「範圍」表示從2620:0:860:2 ::直到2620:0:860: 860:2:FFFF:FFFF:FFFF:FFFF。
您不應該使用兩個「bigint」將這樣的值存儲在數據庫中,而是在單個列中使用任何本機表示形式,除非您想讓開發人員的生活成爲一場噩夢。如果你的DBMS不支持整數這個大,除了替換你的DBMS,我建議使用固定長度的二進制數據列,長度爲16字節。
對適當的IPv6地址使用DBMS不會是一個不好的 想法。下面是使用的PostgreSQL,版本8.3的示例:
mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1
mydb=> SELECT * FROM Networks;
name | prefix
---------------+---------------
Documentation | 2001:db8::/32
ULA | fc00::/7
Orchid | 2001:10::/28
(3 rows)
mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
name | prefix
---------------+---------------
Documentation | 2001:db8::/32
(1 row)
PostgreSQL不錯的壯舉。如果只切換DBMS就像拍手一樣簡單:) – 2011-06-11 09:29:55
- 1. 過濾掉IPv6多播地址範圍
- 2. 迭代兩個IPV6地址之間的地址範圍
- 3. OSX上具有'嵌入'範圍的IPv6鏈接本地地址
- 4. 提取Bash中的IPv4和IPv6地址範圍?
- 5. 查找爲IPv6地址範圍內的正則表達式
- 6. IPv6網絡範圍
- 7. 在ipv6的鏈接本地地址中提到範圍標識的原因
- 8. 檢查IP地址範圍
- 9. mips地址超出範圍
- 10. 地址範圍:不夠長
- 11. 散列IP地址範圍
- 12. GDB:地址範圍映射
- 13. 地址超出範圍mips
- 14. 數組範圍地址
- 15. 引用IP地址範圍
- 16. MARS - 地址超出範圍
- 17. EC2的IP地址範圍
- 18. 各種IP地址範圍
- 19. 代表IPv6地址
- 20. sockaddr和IPv6地址
- 21. 解析IPv6地址
- 22. 的IPv6範圍ID問題
- 23. Linux IPV6主地址和副地址
- 24. 從PHP Ipv6 CIDR獲取IPv6地址數
- 25. 驗證子網地址範圍在vnet地址範圍下通過c#
- 26. scapy不發送全球範圍目的地址的IPv6數據包
- 27. IPv6地址到域名
- 28. 定期對IPv6地址
- 29. 從url解析ipv6地址
- 30. 生成隨機IPv6地址
以下帖由[@vinS]提出(https://stackoverflow.com/users/977855/vins)作爲解決你的IPv6問題:HTTPS: //stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses – datv 2017-12-20 06:34:17