IOS 网络层的组织如下:
- Cocoa 层 (webKit、Game Kit、NSURL、Bonjour)
- Core Foundation层 (CFNetwork、CFNetServices)
- OS 层 (BSD)
- HardWare 层(Wi-Fi、Cellular、Bluetooth)
Game Kit
核心功能在于为IOS 应用提供了另一个点到点的网络选项。在传统的网络配置中,Game Kit构建在Bonjour之上。它能创建自组(ad-hoc)的Bluetooth Personal Area NetWorks (PAN),创建网络时,只需要会话标识符、显示名与连接模式,不需要Socket配置或任何其他底层网络
Bonjour Bonjour
为基于组播域名服务(multicast DNS)的开放性零设置网络标准所起的名字,能自动发现IP网络上的电脑、设备和服务。Bonjour 使用工业标准的 IP 协议来允许设备自动发现彼此,而不需输入IP 地址或配置DNS 服务器。
NSStream
cocoa级别的api,构建在CFNetwork之上,作为NSURLConnection的基础,旨在完成一些底层的网络任务,例如telnet、SMTP, NSStream没有提供对处理HTTP/S响应状态码或认证的內建支持,它所发出与接收的数据都位于C缓冲中。它无法管理多个外发请求,需要子类化添加。NSStream是异步的,通过NSStreamDelegate实现通信更新。
CFNetWork
CFNetWork API位于基础的BSD socket之上(Internet Berkeley sockets),用在NSStream、URL加载系统、Bonjour与Game Kit API的实现中。它为HTTP与FTP等高级协议提供原生支持。CFNetwork与BSD socket之间的主要差别在于运行循环集成。
BSD socket
构成大多数网络活动的基础,是网络框架层次体系中的软件最底层。BSD socket使用C实现,它没有在操作系统中插入任何钩子
运行循环
运行循环是有类NSRunLoop表示的,有些线程可以让操作系统唤醒睡眠的线程以管理到来的事件,运行循环是这些线程的基础组件,运行循环可以在一个周期内调度任务并处理到来的事件,IOS应用中每个线程最多只有一个运行循环,对于主线程中,APP 中在应用委托 applicationDidFinishLaunchingWithOptions:方法调用后就可以访问。
辅助线程必须显示运行自己的运行循环,在辅助线程中运行循环之前,至少添加一个输入源或定时器,否则,运行循环就会立刻退出。运行循环会从两类源中接收事件:输入源与定时器。输入源(通常是基于端口的或是自定义的)会异步向应用发送事件,两类源的主要差别在于内核会自动发出基于端口的源信号,而自定义源就需要从不同的线程中手动发出。
定时器会生成基于时间的通知,它为应用提供了一种机制以在未来的某个时间执行某个具体任务。定时器事件是同步发出的,并且与特定的模式有关
运行循环模式
每次通过运行循环都是在你所指定的模式下的一次运行。运行循环模式是由操作系统所用的一种约定,用于过滤监控的源并发布事件,比如调用委托方法等。模式包含了应该监控的输入源与定时器,以及当运行循环事件发生时应该通知的观察者。
关于RunLoop的苹果官方文档https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
CFRunLoopRef 的开源资料https://opensource.apple.com/source/CF/CF-1151.16