IPv6地址验证和规范化

ngn*_*ngn 5 javascript c++ python java ipv6

您使用了哪些库?它们彼此之间有多兼容?或者您是否编写了自己的解析例程?

我对Java,C++,Python和JavaScript的相互兼容的实现特别感兴趣,它们支持:

  • 零压缩(" ::")
  • IPv4映射地址(" ::ffff:123.45.67.89")
  • 规范化(包括简短形式,用于人类可读性)
  • CIDR风格的网络掩模(如最后的" /64")

Omn*_*ous 7

在POSIX系统中,您可以使用inet_ptoninet_ntop组合做标准化.您仍然需要进行自己的CIDR解析.幸运的是,我认为IPv6唯一有效的CIDR语法是/ number_of_bits表示法,所以这很容易.

您将遇到的另一个问题是缺乏对接口规范的支持.对于链接本地地址,您将看到%eth0最后的内容,以指定它们本地的链接. getaddrinfo将解析,但inet_pton不会.

您可以采用的一种策略是使用getaddrinfo解析和inet_ntop规范化.

getaddrinfo适用于Windows. inet_ptoninet_ntop不是.幸运的是,编写代码来生成规范格式的IPv6地址并不困难.它将需要两次通过,因为0压缩的规则是最先出现的最大0字符串.IPv4表单(ie ::127.0.0.1)也仅用于::IPv4::ffff:IPv4.

我没有可以测试的Windows机器,但是从文档中可以看出Windows上的Python支持inet_pton并且inet_ntop在其套接字模块中.

编写自己的例程以生成规范形式可能并不是一个坏主意,因为即使你的规范形式与其他人不一样,只要它是有效的,其他人就可以解析它.但在任何情况下,我都不会编写自己的例程来解析 IPv6地址.

我上面的建议对Python,C和C++都有好处.我对如何在Java或Javascript中解决这个问题知之甚少.

编辑:我一直在研究getaddrinfo及其对应的getnameinfo.这些几乎在所有方面都优于inet_ptoninet_ntop.它们是线程安全的,你可以传递它们的选项(AI_NUMERICHOSTgetaddrinfo这种情况下,NI_NUMERCHOSTgetnameinfo这种情况下),以防止它们进行任何类型的DNS查询.它们的界面有点复杂,在某些方面让我想起了一个丑陋的Windows界面,但很容易弄清楚要通过什么选项来获得你想要的东西.我衷心地推荐他们两个.


vpr*_*m86 5

在Java中,您可以使用

InetAddress.getByName(IP)
Run Code Online (Sandbox Code Playgroud)

然后检查由此引发的异常以验证IPv6地址

您也可以使用Sun Propreitary API.这将不会执行DNS查找.(他们可能会更改它/删除它,因为它是它们的预置API.这是在使用此编译代码时会出现的警告)

boolean sun.net.util.IPAddressUtil.isIPv6LiteralAddress(String IP)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的想法.不幸的是,该方法在抛出异常之前进行DNS查找. (3认同)

bro*_*eib 5

在Java中,Guava库具有用于在com.google.common.net.InetAddresses类中验证IPv6(和IPv4)的实用程序功能. http://goo.gl/RucRU