IOS的网络层次结构主要分为以下三个部分:
Cocoa层:NSURL(比较常用的)、NSStream、GameKit、WebKit、AFN/Alamofire, NSURLSession
Core Foundation:CFNetwork/CFNetServices、CFStream、CFSocket
OS:BSD Socket
Components
NSURLConnection
NSURLConnection是Cocoa层的API,提供了最简单的URL请求,与网络服务相互交互,获取视频图像和HTML格式的文件等功能。他是建立在NSStream基础上的,同时也提供了对四种最主要的URI规范的支持,file,HTTP,HTTPS和FTP。虽然NSURLConnection限制了交互所使用的协议,但是却抽象除了很多更低层次的读写过程以及缓冲机制等,还包含了对认证的支持以及缓存引擎等。NSURLConnection接口比较稀疏,主要是基于NSURLConnectionDelegate协议的,能够使得应用程序在生命周期内随时进行网络连接工作。NSURLConnection请求默认情况下是异步的,但是也可以设置为发送同步请求。同步请求会阻断请求线程,应该根据应用程序的需要来进行选择请求的类型。
Game Kit
Game Kit作为网络编程的核心,提供了点对点的网络连接方式,在传统的网络配置中,Game Kit是建立在Bonjour之上的,但是Game Kit不需要网络设施来运作,他可以创建ad-hocBluetooth Personal Area Networks PAN,在较小区域内或者没有网络基础设施的情况下互相共享资源。Game Kit在创建网络的时候仅仅需要一个会话标识和连接模型,不需要进行socket配置或者底层的网络交互来进行点对点的连接。Game Kit通过GKSessionDelegate协议进行交互。
Bonjour
Bonjour是Apple的零配置网络的实现,Bonjour提供了发现和连接网络设备和服务的机制,可以忽略设备的网络地址,相应的,Bonjour使用的是名称、服务类型、和域来识别服务。Bonjour抽象了底层的网络对于底层的组播DNS和基于DNS的Service Discovery。在Cocoa层,NSNetService API提供了发布和识别Bonjour地址信息的接口,你可以使用NSNetServiceBrowser API来发现可网络上可用的服务。即使是使用Cocoa层的API发布Bonjour服务,也需要对于Core Foundation有所了解才能配置socket的通信。
NSStream
NSStream处于Cocoa层的API,是建立在CFNetwork基础之上的,作为NSURLConnection的基础服务,以及处理底层的网络任务。与NSURLConnection似,NSStream提供了与远程服务器或本地文件的交互机制。但是你可以使用NSStream来通过诸如telnet或者SMTP协议进行交互,而这些协议是NSURLConnection不支持的。但是NSStream提供了这些额外的服务也是有代价的,NSStream没有内置的HTTP或HTTPS状态支持和认证支持。他将数据接受到C缓冲期中,他也不能管理多重外界请求,这些需要通过继承子类才能够提供支持。NSStream是异步的,通过NSStreamDelegte进行交互。
CFNetwork
CFNetwork API是基于BSD socket之上的,用来实现NSStream和URL加载系统以及Bonjour和Game Kit API。他提供了对一些协议如HTTP和FTP的更加高级的支持。CFNetwork与BSD socket的主要区别在于运行循环集成。如果系统使用CFNetwork,输入和输出时间会排列在线程的运行循环当中。如果输入和输出时间发生在另外的现成中,那么需要程序员亲自开启适合的运行循环模式。CFNetwork比URL加载系统提供了更多的配置选项,这是一把双刃剑。这些配置选项在通过CFNetwork创建HTTP请求的时候是可见的。当你创建请求的时候,必须手动添加HTTP头和cookies,而NSURLConnection可以自动添加标准的头和cookie。CFNetwork基础设施是建立在CFSocket和CFStream API之上的,这两个都是Core Foundation层的核心。CFNetwork包括了针对CFFTP等协议来与FTP服务进行交互,还有CFHTTP来发送和接收HTTP消息,以及CFNetService来发布和浏览Bonjour服务。
BSD Sockets
BSD socket建立了网络活动的底层基础,也是整个网络编程结构的最底层。BSD sockets是通过C实现,但是可以在Objective-C代码中使用。一般不推荐使用BSD socket API,因为他没有与操作系统相挂钩。例如,BSD sockets没有涉及到系统级别的VPN以及调用自动激活的Wi-Fi的API或者是蜂窝无线电。Apple推荐仅使用CFNetwork或者更高层次的API。