检查网络接口IP版本iOS

9
我想了解当前正在使用的网络接口IP版本是IPv4还是IPv6。我正在使用以下指南http://www.brianjcoleman.com/tutorial-how-to-test-your-app-for-ipv6-compatibility/,来测试我的应用程序是否支持IPv6。
我查看了所有可用的资源(例如Swift - 获取设备的IP地址如何以编程方式获取iPhone的IP地址iOS网络接口名称到底意味着什么?pdp_ip是什么?ap是什么?),这些帮助我获取了可用接口的列表。当我的iPhone连接到IPv4 WiFi网络时,列表如下:
"awdl0/ipv6" = "fe80::14ce:f9ff:fe2a:44df";
"en0/ipv4" = "192.168.1.190";
"en0/ipv6" = "fdba:ae3c:c993::19cd:be51:e41b:632e";
"lo0/ipv4" = "127.0.0.1";
"lo0/ipv6" = "fe80::1";
"pdp_ip0/ipv4" = "100.83.148.33";
"utun0/ipv6" = "fe80::e94e:c3b6:ff73:1ded";

当连接到IPv6 WiFi网络时,列表如下:

"awdl0/ipv6" = "fe80::14ce:f9ff:fe2a:44df";
"en0/ipv4" = "169.254.127.94";
"en0/ipv6" = "2001:2::aab1:7dd5:c5dc:16dd:b678";
"lo0/ipv4" = "127.0.0.1";
"lo0/ipv6" = "fe80::1";
"pdp_ip0/ipv4" = "100.83.148.33";
"utun0/ipv6" = "fe80::e94e:c3b6:ff73:1ded";

在这两种情况下,我都有en0/ipv4和en0/ipv6,因此我不清楚如何在程序上决定我的网络的实际IP版本。非常感谢您的帮助。提前致谢。

http://meta.stackexchange.com/q/66377/189912 - Michael Hampton
1个回答

5
首先,也是最重要的一点,需要理解的是你几乎总是同时处于IPv4和IPv6网络中(除非其中一个被禁用)。未能接收到DHCP地址并不意味着你不在网络上。这只是意味着没有DHCP服务器与你通信(在没有DHCP服务器的情况下,拥有网络是完全合法的)。没有其他人与你在同一网络上实际上也不意味着你不在网络上。你可以独自一人上网。你就在网络上。
这听起来有点啰嗦,但了解发生了什么很重要。你通常想知道的是“我在这个网络上是否有一个‘公开’可路由的地址”。而大多数人真正想知道的是(这是一个根本不同的问题,经常非常难以回答):“我的‘主要’网络是什么?” (这特别困难是因为你的“主要”网络可能会因你要访问的地址而不同。)
但对于你可能想回答的实际问题,那就是“我是否有一个已分配并且可能可路由的IPv4/6地址?”要回答这个问题,你必须查看你拥有的地址,并查看它是分配给谁的。我推荐的列表是维基百科的保留IP地址。查看这个列表,我们可以考虑每个地址的情况。

IPv4网络

"awdl0/ipv6" = "fe80::14ce:f9ff:fe2a:44df"; # fe80 => Link local (not routable)
"en0/ipv4" = "192.168.1.190"; # 192.168 => Private network (but *probably* NAT)
"en0/ipv6" = "fdba:ae3c:c993::19cd:be51:e41b:632e"; # fdba => Unique local address (not routable)
"lo0/ipv4" = "127.0.0.1"; # 127 => Host loopback (not routable)
"lo0/ipv6" = "fe80::1"; # fe80 => Host loopback (not routable) 
"pdp_ip0/ipv4" = "100.83.148.33"; # 100.83 => Service provider (not useful to you)
"utun0/ipv6" = "fe80::e94e:c3b6:ff73:1ded"; # fe80 => Host loopback (not routable)

IPv6网络

"awdl0/ipv6" = "fe80::14ce:f9ff:fe2a:44df"; # Loopback
"en0/ipv4" = "169.254.127.94"; # Link local (not routable)
"en0/ipv6" = "2001:2::aab1:7dd5:c5dc:16dd:b678"; # 2001 => "Teredo tunnel" (IPv6 routable over IPv4)
"lo0/ipv4" = "127.0.0.1"; # loopback
"lo0/ipv6" = "fe80::1"; # loopback
"pdp_ip0/ipv4" = "100.83.148.33"; # Service provider
"utun0/ipv6" = "fe80::e94e:c3b6:ff73:1ded"; # loopback

特别是在处理iPhone的时候,通常要查看第一个以太网接口 en0(即WiFi)。你可以看到在第一种情况下:

"en0/ipv4" = "192.168.1.190"; # 192.168 => Private network (but *probably* NAT)
"en0/ipv6" = "fdba:ae3c:c993::19cd:be51:e41b:632e"; # fdba => Unique local address (not routable)

在第二种情况下,您有:
"en0/ipv4" = "169.254.127.94"; # Link local (not routable)
"en0/ipv6" = "2001:2::aab1:7dd5:c5dc:16dd:b678"; # 2001 => "Teredo tunnel" (IPv6 routable over IPv4)

那么,这就是如何确定哪个地址是可路由的。您需要检查它所在的范围。(对于问题:“为什么不能只说'你在互联网上?'”,主要答案的一个重要部分是规范没有定义“互联网”。互联网只是一个特别大的网络。此外,您看到的大多数IPv4地址都将是私有的,并且从技术上讲并不在“互联网”上。网络适配器无法知道是否存在NAT,可以从私有网络桥接到公共网络。)
顺便说一下,当我说“不可路由”时,并不意味着它不是您的主要地址。例如,您可以基于链路本地地址构建整个网络(我已经做过很多次)。但是这些地址不会路由(即它们不会被转发到当前网络段之外),因此对于大多数常见用途来说,将它们视为“不是真正的地址”是可以的。同样,我曾经完全使用主机专用地址构建“网络”,但由于它们无法路由到当前计算机之外,它们通常不是人们所说的“网络”。

非常棒的回答。非常感谢! - Igor Nazarov
1
我非常喜欢_IANA IPv4 Special-Purpose Address RegistryIANA IPv6 Special-Purpose Address Registry_。它们各自都有非常有用的表格。 - Ron Maupin
ULA是可路由的,但它们并非全局可路由。即使存在一个ULA,也不一定表示缺乏全局IPv6连接性。例如,网络可能正在使用NPTv6。 - Michael Hampton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接