网络基础知识

  1. HTTP
    a) URL的概念:URL 的全称是 Uniform Resource Locator(统一资源定位符),URL就是资源在互联网上的地址URL的格式:协议头(不同的协议代表不同的资源查找方式)、主机地址(存放资源主机IP地址(域名))、路径(资源在主机中的具体位置)。常见的URL协议:HTTP、FTP、File、tel、sms、mailto。
    b) HTTP协议的介绍:全称是:Hypertext Transfer Protocol,超文本传输协议。超文本就是除了文字数字以外,视频、音频、图片都属于超文本;传输就是客户端和服务器之间的数据传递过程,传递的都是二进制数据;协议规定了客户端和服务器之间的数据传输格式,类似租房合同。
    HTTP是网络编程使用最广泛的协议,特点是:协议简单、服务器程序规模小、通信速度快;允许传输任意类型的数据。
    HTTP0.9和1.0使用非持续链接,每次链接只处理一个请求服务器对客户端请求作出响应后,立即断开连接。每建立一次链接,只能发送一次请求,得到一次响应.。注意 : 非持续链接不适合频繁的请求.
    HTTP 1.1 使用持续连接,创建一个新的连接,一个连接可以传送多个对象。每建立一次链接,发送一次请求并得到响应之后,链接不会立即断开,链接会持续保持一段时间.在这个时间内客户端如果还有请求就不需要再与服务器建立链接. 注意 : 持续链接不是一直保持链接,这个链接只持续一定的时间.因为不能长时间占用服务器资源.
    c) 短连接:非持续链接和持续链接都是短链接,数据请求结束后,会断开连接,能够及时释放服务器资源,让服务器能够为更多的用户提供服务。
    长连接:一旦连接建立之后,始终保持连接状态,除非断网或者主动退出登录;后续只需发送和接收数据即可,数据响应更及时;长连接对服务器资源占用比较大;对交互响应要求快的应用,例如即时通讯(XMPP),需要使用长连接。
    心跳包:是检测长连接的重要技术手段;判断客户端当前在线。
    d) 请求:一个完整的由客户端发给服务器的HTTP 请求,需要请求行、请求头、请求体(可选)。
    (a)请求行:指定请求方法、请求资源路径以及HTTP协议版本.(GET/HTTP/1.1)
    (b)请求头:对客户端的环境描述、客户端请求的主机地址等信息。(服务器主机地址一定需要)
    (c)请求体:客户端发给服务器的数据,例如要上传的文件数据。GET请求没有请求体;POST请求有请求体
    e) 响应:一个完整的HTTP响应包含状态行、响应头、响应体。
    (a)状态行:包含HTTP协议版本、状态码、状态英文名称(HTTP/1.1 200 OK)(状态码:1XX:消息;2XX:成功;3XX:更多选择;4XX:客户端错误;5XX:服务器错误)
    (b)响应头:服务器告诉客户端一些对服务器描述的信息(服务器类型、返回数据长度、返回数据的类型、响应时间等),请求发送和响应返回的额外信息都是键值对的形式。
    (c)响应体:服务器返回给客户端的二进制数据。

  2. OSI七层模型
    a) 介绍:开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
    b) 物理层:把二进制转换成电流,把电流转换成二进制(单位是bit比特)。与物理层有关的设备:中继器(将电信号方法,因为电缆是金属有电阻)
    c) 数据链路层:将二进制数据转换成标准帧格式(起始位、数据、地址、校验、结束位)。与数据链路层有关的设备:交换机,也就是大家常说的猫(为数据帧从一个端口到另一个任意端口的转发提供了低时延、低开销的通路)。如果把电脑比如成客户,数据链路比喻成物流,那么快递小哥如何找到客户地址?通过电脑MAC地址(MAC地址由网卡决定)
    d) 网络层:它是OSI参考模型中最复杂的一层。网络层主要有两个作用:选择数据传输的最优路径,解决网络阻塞问题(网络阻塞的原因主要是CPU需要处理数据有一定延迟);将大的数据切割成小的数据包,根据不同时间段的不同最优路径进行传输(可以联想看片时候的断点续传)。网络层有关的设备:路由器(一个作用是连通不同的网络,另一个作用是选择信息传送的线路)。互联网如何识别电脑?通过IP地址
    e) 传输层:OSI下3层的主要任务是数据通信,上3层的任务是数据处理。而传输层(Transport Layer)是OSI模型的第4层。因此该层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。该层的主要任务是:定义了一些传输数据的协议和端口号,TCP,UDP。 主要是从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做报文段。电脑如何识别某一个应用程序?通过端口号:每一个应用程序都有很多的服务,每一个服务对应着一个端口号。
    i. MAC地址、ip地址、端口号的理解:假如我想在淘宝买一个娃娃,首先需要登录淘宝账号,下单购买后卖家开始联系寄东西过来。如果把卖家比喻成电脑A,我比喻成电脑B,买的东西相当于A给B传输的数据,那么MAC地址就相当于B下单时填写的收货地址(如深圳市宝安区中粮商务公园),这个地址是固定的,如果搬家了换了地址就相当于换了网卡更换了MAC地址,而ip地址就相当淘宝这个平台,我可以在淘宝买东西,也可以在京东买,ip地址是不固定的,端口号就相当于中粮公园有很多楼也有很多教室,每一个教室对应的是一个端口号(好比用淘宝程序购买,虽然找到了这台电脑的地址但是电脑中有很多应用程序,如何找到你是用淘宝客户端发起的获取数据请求而不是你的其他软件就是通过端口号来识别的)
    f) 会话层:组织和协调两个会话进程之间的通信,并对数据交换进行管理,通过传输层建立数据传输的通路。数据的传输是在会话层完成的,而不是传输层,传输层只是定义了数据传输的协议
    g) 表示层:对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等(可以理解成iOS中将c语言的char字符转换成OC语言的NSString)
    h) 应用层:是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务
    i) 小结:由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。 在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

  3. TCP协议和UDP协议
    a) TCP特点:面向连接、传输可靠、传输速度慢、应用场合:传输大量数据;(比如打电话,必须对方接听)
    b) UDP特点:面向非连接、传输不可靠、传输速度快、应用场合:传输少量数据;(比如发短信,直接发送)
    c) TCP和UDP都是IP协议,在传输层定义。
    d) TCP工作原理:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机 A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据
    e) TCP的三次握手:
    i. 首先客户端向服务器发起一个建立连接的同步(SYN)请求;
    ii. 服务器在收到这个请求后向客户端回复一个同步/确认(SYN/ACK)应答;
    iii. 客户端收到此应答确认之后再向服务器发送一个确认(ACK)。此时TCP连接成功建立.
    f) TCP的四次挥手:
    i. 客户端A发送一个断开连接请求(FIN),用来关闭客户A到服务器B的数据传送
    ii. 服务器B收到断开连接请求(FIN),它发回一个确认应答(ACK),确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
    iii. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
    iv. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)

  4. Socket
    a) 介绍:Socket是一种通讯机制,用于描述IP地址和端口。IP地址用于找到你的电脑,端口号用于找到你这台电脑上面的某一个应用程序的某一个服务。可以理解为:Scoket = IP地址+端口号.Socket是对TCP/IP的封装提供的一套API,是实现协议的一种技术,是传输层和应用层的桥梁。
    b) C语言接口函数:socket(建立socket)、bind(绑定)、connect(连接)、listen(监听连接)、accept(接收连接)、send(发送)、recv(接收数据)
    c) CocoaAsyncSocket是MAC和iOS平台的一套基于C语言socket,封装成OC的开源框架。
    d) 原理:套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认
    (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态
    (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
    (3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

  5. 数据解析(JSON)
    a) 数据解析:从服务器获取到的数据时二进制数据,需要转化为客户端能识别的数据。序列化:将客户端数据转化为二进制;反序列化:把二进制转化为客户端数据。
    b) JSON:本质上是一种“特殊格式”的字符串,以键值对的形式来表示,语法格式很像字典。JSON的解析:id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 返回的数据会根据原始数据是由{}或者[]括起来决定的。解析完成之后做字典转模型,一般使用YYModel MJExtension来实现。
    c) 和XML对比:数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;JSON的速度快于XML。JSON与JavaScript的交互更方便。JSON比XML,数据的体积小。XML解析使用SAX和DOM,iOS用SAX。

  6. GET和POST
    a) GET: 从服务器获取数据,效率比POST高, GET请求能够被缓存, 在 HTTP 协议定义中,没有对GET请求的数据大小限制,不过因为浏览器不同一般限制在 2~8K 之间. GET发送请求时,URL中除了资源路径以外,所有的参数(查询字符串)也包装在URL中.参数格式:在资源路径末尾添加?表示追加参数; 每一个变量及值按照 变量名=变量值 方式设定,不能包含空格或者中文; 多个参数使用&连接. 使用字符串拼接函数拼接参数,然后把字符串转换为URL就可以了。
    b) POST:向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET. POST请求不能被缓存. POST提交数据比较大,大小靠服务器的设定值限制,PHP通常限定 2M. POST发送请求时,URL中只有资源路径,但不包含参数,相对更安全。所有涉及到用户隐私的数据(密码,银行卡号)一定记住使用POST方式传递.参数设置在请求体中,参数格式跟GET一致。(创建请求,设置请求方式POST,设置请求体<参数>)

  7. NSURLConnection
    a) NSURLConnection是iOS2推出,用法简单,最古老最经典最直接的一种网络解决方案,在iOS9废弃了。
    b) 使用步骤:
    i. 根据URL实例化网络请求:NSURLRequest *request = [NSURLRequest requestWithURL:url];
    ii. 将请求异步发送给服务器:[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse response, NSData data, NSError connectionError) {/服务器响应后执行/};
    c) 请求对象:可以设置缓存策略、超时时长。还有可变的请求对象NSMutableURLRequest
    d) 响应对象:response头返回URL、MIMEType(数据类型)、(状态码)、数据长度等。

  8. NSURLSession
    a) 介绍:iOS7退出,用于替代NSURLConnection,支持后台运行的网络任务,暂停、停止、重启网络任务,不再需要NSOperation封装。为了方便程序员使用,苹果提供了一个全局session,所有的任务(Task)都是由session发起的,所有的任务默认是挂起的,需要resume。
    b) 请求步骤:
    i. 准备URL:NSURL *URL = [NSURL URLWithString:@"http://localhost/demo.json"];
    ii. session:NSURLSession session = [NSURLSession sharedSession]; //系统单例session
    iii. 发起任务(task):NSURLSessionDataTask dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error){/处理响应
    /};
    iv. 启动任务(resume):[dataTask resume];
    v. POST需要创建可变请求(设置请求方式和请求体):[session dataTaskWithRequest]

你可能感兴趣的:(网络基础知识)