概况
HTTP是基于TCP/IP的应用层协议。影响HTTP网络请求的因素主要有两个:宽带和延迟。
宽带: 现在网络基础建设已经很完善,宽带得到了极大的提升,我们不在会担心由宽带而影响网速。
-
延迟:
1、 浏览器阻塞:浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有4
个连接(浏览器内核不同可能会有差异),当超过浏览器最大连接数限制,后续请求就会被阻塞。2、DNS查询:浏览器需要知道目标服务器的
IP
才能建立连接。将域名解析为IP
的这个系统就是DNS。通常可以利用DNS缓存结果达到减少这个时间的目的。3、建立连接:HTTP是基于
TCP
协议的,浏览器最快也要在第三次握手时才能捎带HTTP请求报文,达到真正建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响比较明显,慢启动对大文件类请求影响比较大。
持久链接(Persistent Connection)
HTTP1.0需要使用connection: keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。
HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP链接,服务器不跟踪每个客户记录和请求。
会话方式如下:
1、建立连接
2、发出请求信息
3、回包响应信息
4、关掉连接小结:浏览器和web服务器连接很短,每次连接只处理一个请求和响应。对每个请求,浏览器和web服务器都要建立一次单独的链接,服务器回完包,会直接断开链接,所以他们之间的通信是完全独立分开的请求和响应对,没法做到连接状态控制。同时建立和关掉链接会占用连接时间。
HTTP1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
HTTP1.1还允许客户端不用等待上一次结果返回,就可以发送下一次请求。但服务器的回包策略必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分每次请求的响应内容。
节约宽带
HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。
当服务器返回401的时候,客户端就可以不用发送body了,节约了宽带。
Range
- HTTP1.1还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。
Host头处理
HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。随着虚拟主机技术的发展,在一台屋里服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都支持Host头域,且请求消息中没有Host头域会报告一个错误(400 Bad Request)。
HTTP2.0
目前iOS系统网络请求框架NSURLSessionTask使用的就是HTTP2.0
新的二进制格式,HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,
要做到健壮性考虑的场景必然很多。二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便其健壮。多路复用,既连接共享,每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个链接的request可以随机的混杂在一起,接收方可以根据request的id将request在归属到各自不同的服务端请求里面。多路复用。
header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份 header fields表,既避免了重复header的传输,又减小了需要传输的大小。
服务端推送,同
SPDY
一样,HTTP2.0也具有server push功能,具体看下面提到的SPDY
。
HTTPS
-
HTTP 有以下安全性问题:
1、使用明文进行通信,内容可能会被窃听;
2、不验证通信方的身份,通信方的身份有可能遭遇伪装;
3、无法证明报文的完整性,报文有可能遭篡改。 HTTPS可以理解为 HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPS 使用了隧道进行通信。通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)
对称秘钥加密和非对称秘钥加密
1、对称密钥加密
- 对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥
- 优点:运算速度快;缺点:密钥容易被获取;
2、公开密钥加密
公开密钥加密(Public-Key Encryption),也称为非对称密钥加密,使用一对密钥进行加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
优点:更加安全;缺点:运算速度慢;
3、注:
- HTTPS采用混合的加密机制,使用
公开密钥加密
用于传输对称密钥
来保证安全性,之后使用对称密钥加密进行通信来保证效率。
HTTPS性能问题
HTTPS 降低用户访问速度。SSL握手,HTTPS 对速度会有一定程度的降低,但是只要经过合理优化和部署,HTTPS 对速度的影响完全可以接受。在很多场景下,HTTPS 速度完全不逊于 HTTP,如果使用 SPDY,HTTPS 的速度甚至还要比 HTTP 快。
相对于HTTPS降低访问速度,其实更需要关心的是服务器端的CPU压力,HTTPS中大量的密钥算法计算,会消耗大量的CPU资源,只有足够的优化,HTTPS 的机器成本才不会明显增加。
使用SPDY
2012年google如一声惊雷提出了SPDY的方案,大家才开始从正面看待和解决老版本HTTP协议本身的问题,SPDY可以说是综合了HTTPS和HTTP两者有点于一体的传输协议,主要解决:
降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
-
服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。SPDY构成图:
参考文献:
http://oncenote.com/2014/10/21/Security-1-HTTPS/
http://oncenote.com/2015/09/16/Security-2-HTTPS2/
https://www.jianshu.com/p/4b5d2d47833d
https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ