Open zhaofeihao opened 4 years ago
[TOC]
每个tcp连接只能发送一个请求,下一个请求发送需要重新建立tcp连接,性能很差
针对http1.0的问题,http1.1做了很大的优化
http1.1默认connection:keep-alive,一个tcp连接可以持续传输请求。
因为http1.1支持长连接,发送一个请求之后还可以发送第二个请求,如果第二个请求要等待第一个请求返回之后才发送,效率就很低,所以引入了管道机制,多个请求可以按顺序同时发送,响应按顺序返回
因为一个tcp可以同时发送多个请求,我们需要一个字段来区分多个请求,Content-length表示当前请求响应共有多少字段,超过这个值的响应就不是该请求的响应
因为http1.1是按顺序发送请求和响应,如果一个顺序靠前的请求响应时间较长,会阻碍后面请求的响应,造成很大的延迟,这就是线头阻塞。故http1.1支持分块传输:Transfer-Encoding: chunked,每个响应头前都有一个16进制数字表示该块儿大小,如果为0表示本次分块数据传输完成
新增PUT、PATCH、HEAD、 OPTIONS、DELETE请求方法
客户端请求头新增Host字段,有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。
主要还是线头阻塞问题,为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。
http2.0是基于SPDY的,两者没有太大的区别,主要是header压缩方式以及http2.0支持明文传输。
对比http1.1,主要区别有以下几个
http2.0一个tcp连接支持多个stream流同时传输
多路复用可能会带来一个新的问题,多个请求并发可能导致关键请求被阻塞,故http2.0支持request设置优先级
header中的一些信息是重复的,采用合适的压缩算法减少请求大小
正常文档流请求style.css后服务端会主动推送script.js到客户端,服务端请求的时候直接从缓存读取
https是运行在tcp协议上基于SSL/TLS的安全通信机制,其实整个加密过程比较简单,通过一张图就能很清晰,但是一些细节还是值得探究的。先上图:
TLS是在SSL基础上发展过来的,实质上是一个东西。那么TLS主要做的几件事:
加密机制实际上是在tcp链接三次握手基础上实现的:
前面是正常的tcp连接过程:
如果是正常的http连接,直接将ACK确认码发送给Server,Server收到就可以建立连接了。但是Https在这里才真正的开始。
Client拿到Server证书后需要验证证书的有效性,流程一般是:
站点证书颁发者-->中间证书颁发者-->根证书颁发者
CRL(Certificate Revocation List)即证书撤销名单。证书颁发者会提供一份已经失效证书的名单,供浏览器验证证书使用。当然这份名单是巨长无比的,浏览器不可能每次TLS都去下载,所以常用的做法是浏览器会缓存这份名单,定期做后台更新。这样虽然后台更新存在时间间隔,证书失效不实时,但一般也OK
OCSP(Online Certificate StatusProtocol)即在线证书状态协议。除了离线文件,证书颁发者也会提供实时的查询接口,查询某个特定证书目前是否有效。实时查询的问题在于浏览器需要等待这个查询结束才能继续TLS握手,延迟会更大
参考资料: http总结
全面解读HTTP&HTTPS
[TOC]
http1.0、http1.1、http2.0、https分析对比
http1.0
http1.0存在问题
每个tcp连接只能发送一个请求,下一个请求发送需要重新建立tcp连接,性能很差
http1.1
针对http1.0的问题,http1.1做了很大的优化
长连接
http1.1默认connection:keep-alive,一个tcp连接可以持续传输请求。
管道机制
因为http1.1支持长连接,发送一个请求之后还可以发送第二个请求,如果第二个请求要等待第一个请求返回之后才发送,效率就很低,所以引入了管道机制,多个请求可以按顺序同时发送,响应按顺序返回
Content-Length
因为一个tcp可以同时发送多个请求,我们需要一个字段来区分多个请求,Content-length表示当前请求响应共有多少字段,超过这个值的响应就不是该请求的响应
分块传输
因为http1.1是按顺序发送请求和响应,如果一个顺序靠前的请求响应时间较长,会阻碍后面请求的响应,造成很大的延迟,这就是线头阻塞。故http1.1支持分块传输:Transfer-Encoding: chunked,每个响应头前都有一个16进制数字表示该块儿大小,如果为0表示本次分块数据传输完成
其他功能
新增PUT、PATCH、HEAD、 OPTIONS、DELETE请求方法
客户端请求头新增Host字段,有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。
http1.1存在问题
主要还是线头阻塞问题,为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。
http1.1和http1.0对比
http2.0/SPDY
http2.0是基于SPDY的,两者没有太大的区别,主要是header压缩方式以及http2.0支持明文传输。
对比http1.1,主要区别有以下几个
多路复用
http2.0一个tcp连接支持多个stream流同时传输
请求优先级
多路复用可能会带来一个新的问题,多个请求并发可能导致关键请求被阻塞,故http2.0支持request设置优先级
header压缩
header中的一些信息是重复的,采用合适的压缩算法减少请求大小
服务端推送
正常文档流请求style.css后服务端会主动推送script.js到客户端,服务端请求的时候直接从缓存读取
https
https是运行在tcp协议上基于SSL/TLS的安全通信机制,其实整个加密过程比较简单,通过一张图就能很清晰,但是一些细节还是值得探究的。先上图:
SSL/TLS
TLS是在SSL基础上发展过来的,实质上是一个东西。那么TLS主要做的几件事:
加密机制实际上是在tcp链接三次握手基础上实现的:
前面是正常的tcp连接过程:
如果是正常的http连接,直接将ACK确认码发送给Server,Server收到就可以建立连接了。但是Https在这里才真正的开始。
证书机制/证书验证
Client拿到Server证书后需要验证证书的有效性,流程一般是:
站点证书颁发者-->中间证书颁发者-->根证书颁发者
验证策略
CRL
CRL(Certificate Revocation List)即证书撤销名单。证书颁发者会提供一份已经失效证书的名单,供浏览器验证证书使用。当然这份名单是巨长无比的,浏览器不可能每次TLS都去下载,所以常用的做法是浏览器会缓存这份名单,定期做后台更新。这样虽然后台更新存在时间间隔,证书失效不实时,但一般也OK
OCSP
OCSP(Online Certificate StatusProtocol)即在线证书状态协议。除了离线文件,证书颁发者也会提供实时的查询接口,查询某个特定证书目前是否有效。实时查询的问题在于浏览器需要等待这个查询结束才能继续TLS握手,延迟会更大
参考资料: http总结
全面解读HTTP&HTTPS