IOS网络篇3之IOS底层网络架构详解

来源:互联网 发布:翼龙贷java 待遇 编辑:程序博客网 时间:2024/05/22 03:27

紧接这一篇:

IOS网络篇2之客户端离线缓存策略(NSURLProtocol)

首先我们来看看IOS网络的主要层次结构:


IOS的网络层次结构主要分为以下三个部分:

Cocoa层:NSURL(比较常用的)、NSStream、GameKit、WebKit、ASIHttpRequest(第三方框架)

Core Foundation:CFNetwork/CFNetServices、CFStream、CFSocket

OS:BSD Socket

下面我们再来看看Web Kit NSURL CFNetwork BSDSockets 之间的关系。

\

NSStream NSURL 都是基于OC的API。

NSURL 也是以CFNetwork作为基础的:

这里可以看到WebKit是基于NSURL的,因此所有的WebKit NSURL的网络请求都是可以被NSURLProtocol截获的。

CFNetwork是基于C的。CFNetWork的基础是CFStream和CFSocket。

CFNetwork架构:


CFNetwork提供了对FTP和HTTP的支持(基于CFStream和CFSocket):

有如下的一些API:

CFFTP API 

CFHTTP API

CFHTTPAuthentication API

CFHost API

CFNetServices API

CFNetDiagnostics API


套接字是网络通信的基础:

CFSocket是基于BSD Socket的。CFStream提供了和设备无关的读写数据的能力。有CFReadStream和CFWriteStream两种。


CFSocket:

Sockets 是网络通讯的最基本一层。一个 socket 起的作用类似与一个电话线接口,它可以使你连接到另一个 socket 上(不论是本地的还是网络另一端的),并且向那个 socket 发送数据。

最常见的 socket 抽象概念就是 BSD sockets,而 CFSocket 则是 BSD sockets 的抽象。

(1)CFHTTP的使用:

可以应用CFHTTP API创建HTTP恳求,凡是HTTP恳求办法包含GET、HEAD、PUT、POST、DELETE、TRACR、CONNECT和OPTIONS。应用CFHTTP恳求一般4个步调: 

 

应用CFHTTPMessageCreateRequest函数生成一个CFHTTP消息对象

应用CFHTTPMessageSetBody函数设置消息内容

应用CFHTTPMessageSetHeaderFieldValue函数设置消息头

应用CFHTTPMessageCopySerializedMessage序列化消息 

   只有http post 须要消息内容,里面是要提交的表单数据。


(2)CFFTP的使用

(3)NSURLConnection

http://blog.csdn.net/kesalin/article/details/8867781

http://www.tekuba.net/program/334/

http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server

http://www.th7.cn/Program/IOS/201407/232562.shtml

下面资料摘抄自网络:

NSURLConnection

  NSURLConnectionCocoa层的API,提供了最简单的URL请求,与网络服务相互交互,获取视频图像和HTML格式的文件等功能。他是建立在NSStream基础上的,同时也提供了对四种最主要的URI规范的支持,fileHTTPHTTPSFTP。虽然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

  BonjourApple的零配置网络的实现,Bonjour提供了发现和连接网络设备和服务的机制,可以忽略设备的网络地址,相应的,Bonjour使用的是名称、服务类型、和域来识别服务。Bonjour抽象了底层的网络对于底层的组播DNS和基于DNSService 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没有内置的HTTPHTTPS状态支持和认证支持。他将数据接受到C缓冲期中,他也不能管理多重外界请求,这些需要通过继承子类才能够提供支持。NSStream是异步的,通过NSStreamDelegte进行交互。

CFNetwork

  CFNetwork API是基于BSD socket之上的,用来实现NSStreamURL加载系统以及BonjourGame Kit API。他提供了对一些协议如HTTPFTP的更加高级的支持。CFNetworkBSD socket的主要区别在于运行循环集成。如果系统使用CFNetwork,输入和输出时间会排列在线程的运行循环当中。如果输入和输出时间发生在另外的现成中,那么需要程序员亲自开启适合的运行循环模式。CFNetworkURL加载系统提供了更多的配置选项,这是一把双刃剑。这些配置选项在通过CFNetwork创建HTTP请求的时候是可见的。当你创建请求的时候,必须手动添加HTTP头和cookies,而NSURLConnection可以自动添加标准的头和cookieCFNetwork基础设施是建立在CFSocketCFStream 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-FiAPI或者是蜂窝无线电。Apple推荐仅使用CFNetwork或者更高层次的API


0 0
原创粉丝点击