iOS开发之HTTP与HTTPS网络请求
HTTP是互联网中应用最为广泛的一种网络协议,在进入正文之前,先解释什么是网络协议?网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议是由以下三个要素组成:语义、语法、时序。国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中每一层都规定有明确的服务及接口标准;把用户的应用程序作为最高层;除了最高层外,中间的每一层都向上一层提供服务,同时又是下一层的用户。另外还有一种参考模型,TCP/IP参考模型(TCP/IP Reference Model)。是首先由ARPANET所使用的网络体系结构。这个体系结构在它的两个主要协议出现以后被称为TCP/IP参考模型。这一网络协议共分为四层:网络访问层、互联网层、传输层和应用层。需要注意的一点是,TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。
下面一幅图解释两种分层之间对应关系:
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428173809124-160910656.png)
从上图中可以看出,HTTP是应用层中的一种协议。那么HTTP到底是什么呢?
HTTP,超文本传输协议(HyperText Transfer Protocol)
HTTP是一个客户端和服务器端请求和应答的标准。HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428173838914-2066499015.png)
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个指示头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
HTTP通信的基本单位是报文,HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。包括请求报文和响应报文。请求报文格式如下:
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428173909300-1644354980.jpg)
请求行以方法字段开始,后面分别是 URL 字段和 HTTP 协议版本字段,并以 CRLF 结尾。
响应报文格式如下:
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
其中状态码元由3位数字组成,表示请求是否被理解或被满足。
状态码
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428174031013-668466720.png)
常见的状态码对应的含义
HTTP请求方法包括GET、POST、PUT、DELETE、PATCH、HEAD、
OPTIONS、TRACE。其中GET和POST最为常用。
GET和POST的区别
从语义角度来说,GET是从指定的资源请求数据,POST是向指定的资源提交要被处理的数据。通俗点将,GET是获取数据,POST是更新数据。
具体区别可以大致总结为一下几点:
(1) GET的URL可见,POST的URL不可见;
(2) GET请求可以被缓存,POST不会被缓存;
(3) GET请求可以保留在浏览器历史记录中,POST不会;
(4) GET请求有长度限制,2048个字节,POST长度没有限制;
(5) GET请求是幂等性的,POST是非幂等性的;
(6) GET请求的安全性没有POST高。
HTTP连接流程
在Http工作之前,Web浏览器通过网络和Web服务器建立链连接,该连接是通过TCP来完成的,上文说过,TCP协议和IP共同组成了Internet,即著名的TCP/IP协议族,HTTP是比TCP更高的应用层协议,一般TCP接口的端口号是80。
TCP被称为“面向连接”的传输层协议,需知道的是,传输层主要有两个协议,分别是 TCP 和 UDP。
下面一张图来解释TCP连接流程:
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428174113933-1707796610.jpg)
三次握手:第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。
四次挥手:第一次握手:TCP发送一个FIN(结束),用来关闭客户到服务端的连接。
第二次握手:服务端收到这个FIN,他发回一个ACK(确认),确认收到 序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。
第三次握手:服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。
第四次握手:客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。
延伸思考:TCP和DUP的区别?
HTTPS(:Hyper Text Transfer Protocol over Secure Socket Layer)
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP+SSL/TSL
HTTPS使用端口443,而不是象HTTP那样使用端口80来通信。
SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428174146373-315014053.jpg)
HTTPS的建立流程
(1)客户使用https的URL访问服务器,要求与服务器建立SSL连接。
(2)服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)服务器利用自己的私钥解密出会话密钥。
(6)服务器利用会话密钥加密与客户端之间的通信。
如下图所示:
![](https://img2018.cnblogs.com/blog/1347820/201904/1347820-20190428174209679-815773390.png)
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
参考链接:https://www.jianshu.com/p/c5eb856d63eb