继本文之后,我有兴趣搜索IPv6地址范围.
在IPv4下,我将能够确定ISP提供的起始和结束IP地址,并使用这些整数值作为范围界限,快速搜索数据库以查看数据库中的任何条目是否落入该范围.
这将如何受到IPv6的影响?ISP仍然会像现在这样在范围内拥有IPv6地址吗?如果将IPv6地址存储为SQL Server数据库中的两个bigint,您将如何有效地搜索这些范围?
任何人都有一个好的(最好是经过测试的)正则表达式,只能使用有效的DNS主机名,IPv4或IPv6地址?
我有一个Java应用程序需要通过套接字连接到两台不同的机器上的两个不同的服务器.一台服务器已配置为侦听IPv4连接,而另一台服务器已配置为侦听IPv6连接.
现在,假设"host1"是侦听IPv4连接的服务器的计算机名称,而"host2"是侦听IPv6连接的服务器的计算机名称.我需要Inet4Address为"host1"和Inet6Address"host2"创建一个到每个服务器的套接字连接,如下所示:
Inet4Address inet4 = (Inet4Address)InetAddress.getByName("host1");
InetSocketAddress soc4 = new InetSocketAddress(inet4, 7777);
...
Inet6Address inet6 = (Inet6Address)InetAddress.getByName("host2");
InetSocketAddress soc6 = new InetSocketAddress(inet6, 7777);
...
Run Code Online (Sandbox Code Playgroud)
但是,出于向后兼容性原因,默认情况下,JVM优先使用IPv6地址上的IPv4地址.因此,在上面的代码中,第一次尝试连接到"host1"成功,但第二次尝试连接到"host2"失败,因为InetAddress.getByName("host2")返回an Inet4Address而不是Inet6Address.
我知道我可以将系统属性设置java.net.preferIPv6Addresses为true以优先选择IPv4上的IPv6地址,但这反过来导致第二次尝试连接到"host2"成功,但第一次尝试连接到"host1"失败(!)因为InetAddress.getByName("host1")返回一个Inet6Address代替Inet4Address.
系统属性java.net.preferIPv6Addresses只被读取一次(参见InetAddress line 212-218),因此即使我将其值设置为true后将其值更改为false也不会产生任何影响.
那么在这种情况下我能做些什么呢?这似乎是一个普遍的问题,所以必须有一种方法可以做到这一点.
请注意,我当然可以使用InetAddress.getByAddress(),并提供每台机器的IP地址,而不是明确要回的Inet4Address和Inet6Address,但我并不想这样做,除非我真的要.请其他解决方案.
哦,我正在使用java 1.6.0_19以防万一.
谢谢!
是 InetAddress.getHostAddress()的IPv6兼容的JDK 1.6?
具体而言我正在做
InetAddress.getLocalHost().getHostAddress()
Run Code Online (Sandbox Code Playgroud)
它是否符合ipv6标准?它对ipv4和v6地址都有效吗?
我正在使用ipv4和ipv6存储在postgres db中.
因为ipv4需要32位(4字节)而ipv6需要128(16byte)位.那么为什么在postgres中CIDR和INET数据类型的存储分别为IPV4和IPV6(8.1)的12字节和24字节.
对于IPV4和IPV6,它分别有7个字节和19个字节.
我不明白为什么它需要超过16字节的额外字节用于存储IPV6和4字节用于IPV4?
http://www.postgresql.org/docs/8.1/static/datatype-net-types.html
http://www.postgresql.org/docs/9.1/interactive/datatype-net-types.html
0000:0000:0000:0000:0000:0000:192.168.0.1这样的地址写为0000:0000:0000:0000:0000:0000:c0a8:0001,这是完全相同的地址,但是以十六进制表示法.
如何在PHP中发现,如果一个地址是这样写的:比如::0000:192.168.0.1或0000::0000:192.168.0.1或0000:0000:0000:0000:0000:0000:192.168.0.1等?是否足以检查基于IP的字符串是否具有"." 和':'?
如何将其更改为完整字符串0000:0000:0000:0000:0000:0000:c0a8:0001?
我是正确的,将此更改为IPv4将是这样的:
<?php
$strIP = '0000:0000:0000:0000:0000:0000:192.168.0.1';
$strResult = substr($strIP, strrpos($strIP, ':'));
echo $strResult; //192.168.0.1 ?
?>
Run Code Online (Sandbox Code Playgroud)
...或者是正确的IP字符串表示比这个代码片段更复杂吗?
我刚开始使用IPv6,所以在过去的几天里我做了很多阅读.不幸的是,我的一些问题在我的研究中没有得到解答.
我的目标是跟踪分配的地址以及分配的接口.根据我的阅读,接口可以通过几种方式获取IPv6地址,我在下面的子部分中列出了这些方法.我已经突出了我到目前为止所发现的内容,并在这些部分提出了一些问题.如果有人可以对我学到的内容进行任何更正,或者对问题有答案,请这样做.如果有人知道某个地方我可以找到更多信息,我不介意自己研究它.
编辑:我发现前缀委派实际上并没有导致地址分配.DHCP服务器使用它来获取要从其他DHCP服务器使用的前缀.
获取IPv6地址的方法有:
SLAAC用于小型网络,为接口生成IPv6地址.它需要(几乎)没有配置,基本上如下工作:
FE80::/10)生成链接本地IPv6地址.NS会向该地址发送Neighbor Solicitation()消息.如果有回复,则该地址正在使用中且无法使用.自动配置中止,配置应手动进行. 问题1a:这里真的没有倒退吗? 假设在超时时段结束时没有收到回复,则假定该地址是唯一的,并将其指定为接口的链路本地地址.
现在,该节点已连接到此链接上的所有其他节点
节点等待接收Router Advertisement(RA),或者向RS所有路由器的多播组发送Router Solicitation()消息.当RS路由器收到a时,它会响应RA.在RA将包含一个前缀.
NS消息吗? 如果有回复,则该地址已被使用,地址分配必须手动进行. 问题1b:同样,有没有自动恢复方法?问题3:接口可以有多个地址.实际上,在上述过程结束时,单个接口将具有2个地址 - 链路本地地址和全球单播地址.是否可以使用SLAAC获取此接口的其他地址?或者必须使用其他方法(例如DHCPv6)?
节点可以使用上面的步骤1-3获得链路本地地址.我相信这是可选的,它可以简单地使用::/128(未指定)作为DHCP请求中的源地址,直到它被分配一个地址.
有两种获取地址的方法 - 正常和快速提交.正常是一个4消息交换(Solicit,Advertise,Request,Reply),和快速是2消息交换(Solicit,Reply).当客户端Rapid-Commit在Solicit消息中使用选项请求快速提交时.它与Normal基本相同,因为它对我的使用没有任何影响,我现在暂时忽略它.
此外,消息可能通过中继进行代理.从中继发送到服务器的RELAY_FORW消息是消息,从服务器发送到中继的RELAY_REPL消息是消息.客户端和服务器之间的实际对话框完全封装在一个OPTION_RELAY_MSG选项中.对于以下内容,我只处理非中继消息.如果消息被中继,则很容易对原始消息进行说明,并且以下内容仍然成立.
地址分配如下:
Solicit"所有DHCP服务器和中继"多播地址发送消息.此消息的目的是发现本地链路上的DHCP服务器的标识.Advertise本地多播地址的消息. …我想知道是否有办法使用JavaScript从IPv6地址获取httpGet请求.
我在家用计算机上使用cooja建立了一个虚拟网状网络,每个节点都有一个IPv6地址,aaaa::0212:740x:000x:0x0x其中x是节点号.
使用普通的jquery请求时:
$.ajax({ url: url,
success: function(data)
{console.log(data); }
});
Run Code Online (Sandbox Code Playgroud)
一个网站,例如http://www.random.org/intergers/?etc,将获得一个随机数并记录下来,但是当输入一个ipv6地址,即[aaaa :: 0212:740x:000x:0x0x]时并没有给我任何回报,没有错误,没有反应,没有.
任何人都可以对这个问题有所了解吗?
我搜索了几个foruns,如果InAppBrowser启用了IPv6,我没有找到任何具体信息.
当我使用:refWeb = cordova.InAppBrowser.open(url,'_ blank','location = yes','clearcache = yes','clearsessioncache = yes');
使用url = http://192.168.1.210,它正常工作,但如果url = http:// [2001 :: 123:1:2:3]则会显示一个错误的网页:ERR_NAME_NOT_RESOLVED
如果我在同一设备上使用本机浏览器(如Chrome),则这些网址按预期工作.
请帮忙.
关于苹果关于iPv6 -only网络的公告,我有一些疑问.
https://developer.apple.com/news/?id=05042016a
1)如果我的应用程序已经上传而没有支持ipv6,会发生什么?
2)我正在使用旧的Reachability类,它会创建任何问题吗?
3)我正在使用使用NSURLConnection的ASIHTTP库.
4)如果我的代码中没有使用任何静态iP,但我的服务器支持iPV4,那么它会造成任何麻烦吗?
谢谢
ipv6 ×10
ipv4 ×4
java ×3
cidr ×1
cordova ×1
dhcp ×1
hostname ×1
http ×1
inappbrowser ×1
inet ×1
inetaddress ×1
ios ×1
javascript ×1
php ×1
postgresql ×1
reachability ×1
regex ×1
sockets ×1
string ×1
transform ×1