OSI网络七层协议
如图所示
- 应用层:当负责传送数据发送请求时:把需要发送的数据,按照应用的格式标准协议等封装成对应数据。当负责接收数据响应请求时:把数据按照应用的标准格式进行解析。例如在HTTP协议中,发送请求前要封装请求头,而接收数据时要解析响应头,这些解析过程方式是根据应用层的协议格式而定的,每个协议格式式不一样。如果不同应用标准格式不一样,会解析失败,无法正确显示数据内容。例如:A电脑是 Mac电脑用的pages软件写一个文本,然后传给B windows电脑,B电脑接收到的是A电脑的数据,数据格式完全跟A电脑一样。但是B电脑上没有能解析A电脑pages软件数据的工具。所以B电脑用户无法读取该文件。文件之所以无法解析不是因为电脑端不一样,而是因为没有软件解析对应数据格式的应用。 实际上数据格式的基本封装是应用自身完成的,还没有到达应用层这一步。拿HTTP说,当应用封装好需要传输的数据进行传输时(例如我们平时应用中把数据封装在字典里然后转成json字符串,这一步骤就是应用本身完成的封装),应用层会根据HTTP协议对数据进行处理(封装成HTTP的请求头),该协议会在传输的数据前段附加一个首部标签,该首部标签标明了发送数据的内容和发送的地址
- 表示层:数据的转换层。当负责传送数据发送请求时:会将应用层封装的数据转换成网络通用的标准数据格式进行传递(格式化编码)。当负责接收数据响应请求时:会将会话层传入的网络通用标准格式数据转换为对应设备的数据。不同设备对同一比特流数据的解析可能会有不同的结果。表示层与表示层之间为了识别编码格式,也会附加首部信息。
- 会话层:负责网络通信的建立和断开,选择网络通信的连接方式,是GET、POST、长连接,短连接。当负责传送数据发送请求时:把表示层的数据按照一定规律和标准拆分成数据块(每个数据库都有一个单独的附加首部信息,标记接收端和发送端ip)。当负责接收数据响应请求时:负责把比特流数据根据数据的每个节点拼接成完整的数据。会话层会在接收到的数据前端附加首部信息,记录数据的传输顺序信息。
- 传输层:主要是用户负责建立两端节点的通信关系,保证数据的传输安全,传输是直接连接双方节点ip地址,不经过路由处理。如果A发送给B信息,传输过程中出现数据丢失或者网络出现异常只发送了部分信息到达B端,B端会反馈消息,告诉A,只收到了部分消息,A会将未发送的消息重新发送到B,比如迅雷下载资源的时候,可以暂停,下次继续按照上一次的进度下载。(猜测可能是传输结束后会话层中根据附加首部信息判断到数据传输顺序并不完整,会把不完整的顺序反馈给发送端,让附送端把未接收到的数据重新发送过来)
- 网络层:将数据传输到目标地址,目标地址可以是由多个网络或路由连接而成的某个地址,因此改层主要是寻找地址和路由选择。
- 数据链路层:负责物理层上的通信传输,把0、1序列化为有意义的数据帧传给对端。通过Mac地址,目的是识别连接到同一传输介质上的设备。因此,这一把分层中将包含Mac地址信息的首部附加到网络层转发过来的数据上,发送到网络。
- 物理层:负责将机器语言的0、1转换为电压高低、脉冲光的闪灭输出给物理的传输介质(光纤)。
在iOS中把上三层统称为应用层
对于我们而言理解上也就主要是4个层,数据链路层,网络层,传输层,应用层
TCP/UDP协议
TCP协议
TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
源端口号(sourec port):数据发送源的应用进程端口号,占16位(2个字节),端口号最小为1024,最大为65535。因为该字段占16位(16bit),而16bit在十进制中最大表示为65535最小表示为0,所以端口号最大为65535,而由于0-1023是知名端口号一般由系统占用。所以端口号最小从1024开始。
-目的端口号(destination port):标明接收数据的端口号。
-顺序号(sequence number):这里的顺序号就是TCP的握手和挥手的seq,它占32位,标识了TCP报文中第一个字节在传输方向中对应的字节序号。当SYN时,SN(sequence number)=ISN(随机值)单位是byte。比如发送端发送的一个TCP包净荷(不包含TCP头)为12byte,SN为5,则发送端接着发送的下一个数据包的时候,SN应该设置为5+12=17。通过序列号,TCP接收端可以识别出重复接收到的TCP包,从而丢弃重复包,同时对于乱序数据包也可以依靠序列号进行重排序,进而对高层提供有序的数据流。另外如果接收的包中包含SYN或FIN标志位,逻辑上也占用1个byte,应答号需加1
TCP报头长度(Header Length):仅表示报头的长度,占4位(这里按照32位字长位单位计算。占4位标示4bit,而4bit最大二进制表示为1111,最大显示的值为15,而单位是32位字长。表示每个单位按照32来计算。每个单位也就是4字节。最大能表示15个单位,就是60字节,TCP报头内容最多60个字节)。它指出TCP报文段从数据起始处 距离 TCP报文段的起始处有多远。[这就是为什么上图中 会分为前16位 后16位,因为单位是按照32位字长计算的]
保留位(Resy):占6位,保留给以后使用,目前必须设置为0
编码位:
URG:紧急数据标志位
ACK:确认序号有效
PSH:请求推送位,接收端应尽快把数据传送给应用层
RST:重置连接,通常,如果TCP收到的一个分段明显不属于该主机的任何一个连接,则向远程发送一个复位包
SYN:建立连接,让连接双方同步序列号
FIN:释放连接
窗口大小(Window Size):标示从确认号开始,报文的发送源可以接受的字节数为多少。
校验和(check sum):奇偶校验,此校验和是对整个TCP报文段以16位字进行计算所得,服务端接收后进行验证。
-紧急指针(urgent poiner):主要是用作发送端向另一端发送紧急数据的一种方式,只有在URG标志值为1的时候才有效。它是一个正的偏移量,跟顺序号字段中的值相加表示紧急数据最后一个字节的序号。
-选择(options):至少1字节的可变长字段,标识哪个选项(如果有的话)有效。如果没有选项,这个字节等于0,说明选项的结束。这个字节等于1表示无需再有操作;等于2表示下四个字节包括源机器的最大长度,最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。注:MSS=TCP报文段长度-TCP首部长度
填充(Padding):因为选择(options)项长度不一定是32位的整数倍,所以需要填充位,在这个字段中加入额外的0,来保证该字段的位数是32的倍数,保证TCP头是32的整数倍。
数据(data):TCP所传输的数据,在三次握手和四次挥手时仅有TCP首部,没有该data字段。
三次握手
- 首先客户端向服务端发起一个建立连接的同步(
SYN)请求; - 服务端在收到这个请求后向客户端回复一个同步/确认(
SYN/ACK)的应答; - 客户端收到应答回应后再向服务端发送一个确认(
ACK),此时TCP连接成功建立.
四次挥手
- 首先客户端发送一个
FIN消息给服务端,客户端进入FIN_WAIT_1状态。 - 接着服务端收到
FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。 - 服务端在回复完客户端的
TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输的数据是否已经传输完毕,一旦确认数据传输完成,服务端发送一个FIN消息给客户端,服务端进入LAST_ACK状态。 - 最后客户端收到
FIN消息后,进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
UDP协议
UDP被称之为用户数据报协议位于传输层。提供非面向连接的网络服务,传送数据不需要和服务端建立连接,只需要知道数据需要发送到哪一个IP地址和监听端口即可,该服务传输的数据是不可靠的、可以由一点发送到到多点。这意味着它不保证数据报的到达只负责发送,也不保证所传送数据包的顺序是否正确,正因为UDP协议的控制选项较少,在数据传输过程中延迟较小所以数据传输效率很高,一般用于对可靠性要求不高的功能上,因为它不提供数据包分组、组装和不能对数据包进行排,舍弃了TCP的建立连接等开销较大的步骤。简单的说UDP只管发送数据,过程与结果并不在乎。一般网络质量较差时,采用UDP会造成数据的丢失。从UDP的结构来说,UDP首部采用了16bit大小的内容来标识UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。
UDP长度(Length):由于UDP首部由4个字段组成,每个字段16bit即2字节。所以UDP长度最小8字节。UDP长度占16bit,最大表示值65535,而UDP报文占8个字节,IP包头占20个字节。所以UDP最大能表示65535-8-20=65507字节。但由于MTU的限制,实际在以太网中UDP最大可以表示1500-8-20=1472字节。
HTTP协议
基本概念
- 客户端(Client):移动应用(iOS、android等应用)
- 服务器(Server):为客户端提供服务、提供数据、提供资源的机器
- 请求(Request):客户端向服务器索取数据的一种行为
- 响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端
HTTP基本概念
协议:协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议。
HTTP协议:即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议作用:HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
URL:我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。
HTTP版本区别
HTTP/0.9和1.0
使用非持续连接,限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
HTTP/1.1
当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/1.1 相较于 HTTP/1.0 协议的区别主要体现在:
- 缓存处理
- 带宽优化及网络连接的使用
- 错误通知的管理
- 消息在网络中的发送
- 互联网地址的维护
- 安全性及完整
HTTP通信过程 - 请求详细内容
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求头:包含了对客户端的环境描述、客户端请求信息等
GET /minion.png HTTP/1.1 // 包含了请求方法、请求资源路径、HTTP协议版本
Host: 120.25.226.186:32812 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 // 客户端的类型,客户端的软件环境
Accept: text/html // 客户端所能接收的数据类型
Accept-Language: zh-cn// 客户端的语言环境
Accept-Encoding: gzip// 客户端支持的数据压缩格式
HTTP通信过程 - 响应详细内容
HTTP协议规定:1个完整的HTTP响应中包含以下内容
响应头:包含了对服务器的描述、对返回数据的描述
HTTP/1.1 200 OK // 包含了HTTP协议版本、状态码、状态英文名称
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
常见响应状态码
HTTP协议的特点
HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议的主要特点可概括如下:
- 简单快速:因为HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。
URL
URL的全称是Uniform Resource Locator(统一资源定位符)
URL就是资源的地址、位置。互联网上的每个资源都有一个唯一的URL,通过这个个URL,能找到互联网上唯一的一个资源。
URL的基本格式 = 协议://主机地址/路径
协议:不同的协议,代表着不同的资源查找方式、资源传输方式
主机地址:存放资源的主机(服务器)的IP地址(域名)
路径:资源在主机(服务器)中的具体位置
发送HTTP请求
发送HTTP请求的方法
在HTTP/1.1协议中,定义了8种发送HTTP请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
各个方法的解释如下(所有方法全为大写):
- GET: 请求获取Request-URI所标识的资源
- POST: 在Request-URI所标识的资源后附加新的数据
- HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
- PUT: 请求服务器存储一个资源,并用Request-URI作为其标识
- DELETE: 请求服务器删除Request-URI所标识的资源
- TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT: 保留将来使用
- OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
- PUT :增
- DELETE :删
- POST:改
- GET:查
最常用的是GET和POST(实际上GET和POST都能办到增删改查)
GET和POST对比和区别
GET和POST的主要区别表现在数据传递上
- GET:在请求URL后面以?的形式拼接发给服务器的参数,多个参数之间用&隔开。 比如http://www.test.com/login?username=123&pwd=234&type=JSON由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
- POST:发给服务器的参数全部放在请求体中,理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
注意:GET和POST都可以向服务器传送数据,也都可以从服务器获取数据
关于URL长度的限制
首先,HTTP协议及URL官方说明均对URL长度限制没有说明,也就是说GET,POST都对URL长度没有限制,但是HTTP客户端和服务器的实现对URL长度进行了限制,因此我们使用GET请求拼接参数,有时会导致URL过长而无法进行请求。
关于安全问题
并不是POST比GET特别安全,只不过GET传递的参数显示在URL中,我们一眼就可以看到,POST方式看不到是因为浏览器做了限制,我们同样可以用第三方工具看到POST方式传递的数据。
GET 和POST 的选择
选择GET和POST的建议
- 如果仅仅是索取数据(数据查询),建议使用GET
- 如果是增加、修改、删除数据或者传递大量数据,比如文件上传,建议用POST
服务器返回的数据格式
服务器返回给客户端的数据,一般都是JSON格式或者XML格式
JSON
什么是JSON
JSON(JavaScript Object Notation):一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交互。
JSON的格式
JSON的格式很像OC中的字典和数组
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
标准JSON格式的注意点:key必须用双引号
JSON解析方案
要想从JSON中挖掘出具体数据,需要对JSON进行解析,将JSON数据转换为OC数据类型 在iOS中,苹果为我们提供了JSON的解析方案 NSJSONSerialization。
XML
什么是XML
扩展标记语言 (Extensible Markup Language, XML)
用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML格式
一个常见的XML文档一般由以下部分组成
- 文档声明:在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明
<?xml version="1.0" ?>
用encoding属性说明文档的字符编码
<?xml version="1.0" encoding="UTF-8" ?>
- 元素(Element):一个元素包括了开始标签和结束标签
拥有内容的元素:
<video>小黄人</video>
没有内容的元素:<video></video>
一个元素可以嵌套若干个子元素(不能出现交叉嵌套)
规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素
- 属性(Attribute)
XML解析
要想从XML中提取有用的信息,必须得学会解析XML
XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
解析XML的工具
苹果原生NSXMLParser: 使用SAX方式解析,使用简单
HTTPS
HTTPS简介
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer):是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS通信过程
HTTPS与HTTP的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。