[iOS] 网络之概述
[ios] 网络之概述,如果一味的沉浸在自己的世界里,或许会成为神。但是你悟出的思想,如果不加以传播,岂不是浪费了你这十年的悟道。假使浑浑噩噩十年过去了,外界变成什么样子都不得而知。当你出现在世上时,看见大街上扫码就能骑走的自行车,是否会感到惊讶。当然这样说就有点夸张了,毕竟没有人会独隐山林十余载。思想碰撞才能产生火花。一个好的手机应用应该能够让用户把自己的想法广播给世界,接收这个世界无时无刻刷新的消息。ios上的应用是如何传播消息的,以及它如何和不同的进行通信。首先会介绍一些简单的背景知识,这些知识在网络上、书籍中都能够随时查阅到,所以这里只是大概的提一下。这里提到是因为接下来介绍的功能是和这些知识有一定的相关性,同时如果想深入了解的话可以快速找到知识点。
tcp/ip http url loading system url load nsurlsession
tcp/ip
这个世界如果要想和别人交流,首先就要明确定义你说出来的话代表什么。大家共同遵守某种协议,以便大家能够方便的交流。tcp/ip协议族则允许很多不同的厂家生产各种型号的计算机,运行完全不同的操作系统互相进行通信。
tcp/ip,是一组不同层次上的多个协议的组合。它通常被认为是一个四层协议系统,每一层负责不同的功能:
1)链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与传输媒介的物理接口细节。
2)网络层,有时也称作互联网层,处理分组在网络中的活动。
3)运输层,主要为两台主机上的应用程序提供端到端的通信。
4)应用层,负责处理特定的应用程序细节。应用层属于用户进程,主要处理应用程序细节;其它三层则属于内核,主要处理通信细节。假设a手机和b手机进行聊天,a和b的应用层负责解析和现显示文字和图片,至于这些文字、图片怎么从a传到b或者从b传到a的,应用层不关心,这是其它三层该关心的事情。网络层ip它提供了一种不可靠的服务。它只是尽可能快地把分组从源结点送到目的节点,但是并不提供任何可靠性保证。tcp在不可靠的ip层上提供了一个可靠的运输层。为了提供这种可靠的服务,tcp采用了超时重传、发送和接收端的确认分组等机制。
应用层和传输层使用的是端到端协议,网络层ip使用的是逐跳协议,它并不知道到达任何目的的完整路径(除了那些与主机直接相连的目的)。也就是说,一个ip数据包可能要经过很多个才能从a点到达b点。
多台计算机组在一起形成了网络,多个网络连在一起形成了一个网络的网络,就这样互联网形成了。互联网就是一组通过相同协议族互连在一起的网络。通过图我们能够看到,两个网络以太网和令牌环是通过路由器相连。网络层就是让各个网络之间通信。
假设以太网网络上的客户端要和令牌环网络上的服务器进行通信。表面上看客户端只需要告诉服务器想要什么资源,服务器收到请求以后会返回数据给客户端。它们的背后会发生什么,接下来就要好好看看了。
首先数据从客户端到服务器(或者服务器到客户端)会经历封装和分用。封装就是每一层(tcp/ip有四层,分别负责不同的功能)对收到的数据要增加一些首部信息(有时候还要增加尾部信息) 。这些信息是描述数据是属于什么应用、用tcp还是udp传输,使用哪些协议等等。这些信息至关重要,它是保证一段数据从何而来且正确的去往何处。
应用层给数据加上首部交给传输层;
传输层收到应用层传来的数据后,它会加上传输层的首部,为了标识是哪个应用,它会在首部填上该应用的端口号,然后交给网络层;
网络层收到传输层传来的数据(称之为tcp段(udp为udp段)),它会加上ip首部,为了标识是tcp还是udp或者其它协议,ip首部中存入一个长度为8bit的数值,称作协议域。然后传给网络接口层;
类似地,网络接口层收到上层传来的数据(称之为ip数据报),也会加入相应的首部和尾部。
当b主机收到一个以太网数据帧时,数据就开始从协议栈由底向上升。同时去掉各层协议加上的报文首部。每层协议都要检查报文首部中的标识,以确定接收数据的上层协议。这个过程称作分用。数据是如何从a到b的呢?
1) 客户端调用函数把域名(例如:www.csdn.net)转换成32bit的ip地址;如果本地的主机缓存了域名对应的ip地址,则直接转换;否则它会向就近的dns服务器,请求对应的ip地址。
2) 客户端请求tcp用得到的ip地址建立连接。
3) tcp发送一个连接请求分段到远端的主机,即用上述ip地址发送一份ip数据报。
4) 如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么ip数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过ip选路函数来确定位于本地网络上的下一站路有地址,并让它转发ip数据报。这两种情况下,ip数据报都是被送到位于本地网络上的一台主机或路由器。
5) 假定是一个以太网,那么发送端主机必须把32bit的ip地址变换成48bit的以太网地址(网卡它的另一个名字叫做网络适配器的硬件编码是唯一的,48bit。),这种映射是arp完成的。
6) arp发送一份称作arp请求的以太网数据帧给以太网上的每个主机。这个过程称作广播。arp请求数据帧中包含目的主机的ip地址,其意思是“如果你是这个ip地址的拥有者,请回答你的硬件地址”。这就好比,你在网上购物,需要填写地址,填写地址是你主动的。而arp需要每家每户的喊,应该说每家每户都能够收到,收到后如果是这个ip地址的拥有者,回复;否则,丢弃这个报,不管它。
7) 目的主机的arp层收到这份广播报文后,识别出这是发送端在询问它的ip地址,于是发送一个arp应答。这个arp应答包含ip地址及对应的硬件地址。
8) 收到arp应答后,使arp进行请求——应答交换的ip数据报现在就可以传送了。
9) 发送ip数据报道目的主机。
注意:点对点链路不使用arp。当设置这些链路时,必须告知内核链路每一端的ip地址。像以太网地址这样的硬件地址并不涉及。
这里只涉及到报文是如何转发的,tcp三次握手、四次断开连接,udp如何连接等等。这里就不在说了,网上资料有很多。这里只做一个简单的了解。
http
超文本传输协议(http hypertext transfer protocol)是互联网上应用最为广泛的一种网络协议。用于从www服务器传输超文本到本地的传输协议。它可以使浏览器更加高效,是网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
http采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、url、协议版本、以及包含请求修饰符、客户信息和内容的类似于mime的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
http可以建立在任何协议族之上,例如tcp/ip,ibm的sna。它不依赖于协议族。
一次http操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,http的工作就开始了。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(url)、协议版本号,后边是mime信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是mime信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户端与服务器断开。
其中如果以上任何一个步骤出错,都会返回错误的信息。
下图response是响应描述数据,request是请求的描述数据。
url loading system
url加载系统是一组允许应用程序通过url访问资源的类和协议,这个技术的核心是nsurl类,它允许应用程序操纵url和它们引用的资源。为了支持该类,foundation框架提供了丰富的类集合,可以加载url引用的内容,将数据上传到服务器,管理cookie存储,控制响应缓存,以特定应用方式处理凭据存储和身份验证,并写入自定义协议扩展。url 加在系统支持ftp、http、https、file、data协议访问资源。
url加载系统主要包括加载url、协议支持、身份验证和凭据、cookie存储、配置管理、缓存管理。其中后5中属于帮助类。
url load
url load包含七个类它们分别是:nsurlsession、nsurlconnection(由nsurlsession替换,苹果推荐使用nsurlsession)、nsurldownload(不支持ios)、nsurlresponse(子类nshttpurlresponse)、nsurlrequest(子类nshttpurlresponse),由于苹果公司使用nsurlsession替换nsurlconnection(ios9以后不支持该api),nsurldownload不支持ios且nsurlsession包含了下载功能,因此nsurlconnection、nsurldownload不做介绍。
nsurlsession
nsurlsession和相关的类是一个提供通过http下载内容的api,这个api提供了一组丰富的委托方法来支持身份验证,可以在后台进行下载。nsurlsession是异步的网络api,如果使用默认的、系统提供的委托则需要实现block,当传输成功或者失败,它会通过block返回。如果自定义委托对象在从服务器对象接收到数据时调用这些委托方法。 nsurlsession 除了提供状态和进度属性给委托方法,它还支持取消、重新启动(恢复)、暂停任务。
nsurlrequest对象封装了url和任何特定于协议的属性(可以参考上图的request信息)。
注意:当客户端使用nsmutableurlrequest进行请求时,内部会对这个请求进行深拷贝。换句话说,如果你想利用之前的句柄进行修改,那是不可能的。
nsreponse对象包含两个内容:描述数据的数据(可以参考上图的response信息)和客户端想要的数据。大多数协议通用的描述数据的数据由nsurlresponse类封装,由mime类型、预期的内容长度、文本编码(适用的)和提供响应的url组成。
上一篇: 如何做好内容营销?你需要掌握这六个步骤
下一篇: C语言 - 流文件