我想使用 redis 有效搜索 IPv6 子网范围。
我想到将 IPv6 数字地址存储在 redis 中并按范围搜索它们。这些是128 位 int,例如:
import ipaddress
int(ipaddress.ip_address(u'113f:a:2:3:4:1::77'))
> 22923991422715307029586104612626104439L
Run Code Online (Sandbox Code Playgroud)
并按范围查询:
ZRANGEBYSCORE numerics <subnet-S-start> <subnet-S-end>
Run Code Online (Sandbox Code Playgroud)
然而,redis 排序集最多可以容纳 2^53 的分数,因此我所有的大整数都被修剪,并且我失去了精度。
有没有办法在redis中保存如此大的数字而不损失精度?
您有更好的建议吗?谢谢
我尝试在 Postgres (10.4) 的 inet 列中插入 ipv6 地址 '2001:db8:3333:4444:5555:6666:1.2.3.4' 。它存储为 2001:db8:3333:4444:5555:6666:102:304 为什么 IP 存储方式不同?存储的 IP 是否代表插入的相同 IP?这是 Postgres 更高版本中已解决的已知错误吗?问候萨米尔
假设您有一个游戏服务器(仅 UDP),在同时具有 IPv4 和 IPv6 地址的服务器上运行。服务器启动,调用 getaddrinfo() 循环访问可用地址,假设它获取 IPv6 地址。因此它在 IPv6 上创建套接字并等待来自客户端的数据包。
客户端尝试连接,但这次它使用用户输入的 IPv4 地址。它创建一个 IPv4 套接字,并尝试连接到服务器。差异实际上重要吗?或者 IPv4 套接字和 IPv6 套接字之间的差异是否仅限于本地计算机?
同样,如果客户端已经创建了一个可供使用的 IPv6 套接字(因为 getaddrinfo() 表示它是有效的),然后它调用 getaddrinfo() 来查找服务器的地址,那么如果它只获得 IPv4 结果怎么办?我知道我可以告诉 getaddrinfo() 仅提供 IPv6 结果,但如果服务器没有 IPv6 地址怎么办?UDP 客户端是否应该关闭并重新创建其套接字以匹配服务器地址格式?或者我能保证得到我要求的地址格式吗?
(我欢迎任何能够回答这些问题的文档参考。我已经研究了几个小时,但尚未找到这些问题的明确答案。)
我正在研究p2p应用程序,所有这些NAT-PMP和UPNP NAT遍历场景都是如此令人不愉快.关于什么时候IPv6将被普遍使用的任何想法?
我正和一位朋友讨论IPv6的一些内部问题.
众所周知,IPv6 IP地址的大小为128位(对于IPv4,它是32位).
他问我这个大小设置为128位的原因是什么 - 256位会产生更"全面"的尺寸,这两种尺寸应该足够大,以避免将来缺少任何IP地址.
我认为它必须在像路由器这样的嵌入式设备上做到这一点,你必须更加小心内存要求,128是两个中最小的功率,这样你将来肯定不会用完这么大的IP地址.
但我不得不承认不知道一个明确的答案.
那么,网络向导,选择128位作为IPv6地址大小而不是256位的原因是什么?
要确定IPv4网关是否处于活动状态,可以使用以ETH_P_ARP作为协议的原始数据包套接字,如下所示:
int fd = socket (PF_PACKET, SOCK_RAW, ETH_P_ARP);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个等效的ETH_P_ARP的IPv6,用于沿类似的线路ping IPv6网关.以编程方式实现此目的的其他选项有哪些?
谢谢!
如果IPv4有问题并且我想从std :: istream中提取IP和ICMP头,首先我得到最初的20个字节,然后检查IPv4头中提供的头长度是否大于20个字节以便提取任何选项.下一个字节是ICMP数据包.使用IPv4标头内携带的标头长度值,我可以看到IP标头的预期大小.
但是如何获得IPv6标头的确切大小?IPv6标头内部有一个有效负载值,包括标头扩展的大小以及更高级别的数据,如ICMP.我需要知道IPv6头的大小,包括头扩展但没有更高级别的数据,以便知道ICMPv6头在std :: istream中的起始位置.
谢谢!
我想检查IP是否列入白名单,但是IPv6-地址可以有不同的表示形式:
例如2001:0DB8:0:0:1::1是2001:0db8:0000:0000:0001:0000:0000:0001。
因此,字符串比较不起作用。我怎么知道两个地址相等?
我们知道double可以从存储数量±4.94065645841246544e-324来±1.79769313486231570e+308.我们可以存储像IPv6这样的128位值double并按原样检索吗?例如,要存储IPv4,我们可以使用32位整数并将它们存储为8位分区.我们可以通过使用位屏蔽来检索它们.
在任何语言AFAIK中都没有标准容器来存储128位.我知道double可以安全地存储64位而没有任何精度错误,但有任何黑客攻击吗?