帮助我理解我在使用网络链接调节器测试可达性代码时所看到的。这是我的香草可达性代码:
Reachability* wifiReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
switch (netStatus)
{
case NotReachable:
{
NSLog(@"Access Not Available");
break;
}
case ReachableViaWWAN:
{
NSLog(@"Reachable WWAN");
break;
}
case ReachableViaWiFi:
{
NSLog(@"Reachable WiFi");
break;
}
}
现在,当我使用网络链路调节器使用"100%损耗"预设测试这段代码时- netStatus
的值是ReachableViaWWAN
,这是我没有预料到的。我读到很多抱怨,说可达性并没有真正测试连接性,而是测试连接性的潜力。我的问题是:
"100% Loss"是否允许对Apple服务器的DNS请求通过,但不允许任何数据包通过?
这可能与以下事实有关:可达性并不能保证数据包能够真正到达目标主机。它是关于本地网络配置(接口up/down)以及它是否可以发送数据包。
来自Apple的SCNetworkReachability参考:
当应用程序发送到网络堆栈的数据包可以离开本地设备时,远程主机被认为是可达的。可达性并不保证数据包会被主机实际接收。
因此,如果接口是up的,并且Reachability可以发送一个包,它是满足的,并返回状态可达。
选自苹果开发者指南《为什么网络很难》:
重要:SCNetworkReachability API不打算用作确定网络连接的预运行机制。通过尝试连接来确定网络连接。如果连接失败,请参考SCNetworkReachability API来帮助诊断失败的原因。