本文共 3983 字,大约阅读时间需要 13 分钟。
HTTP(HyperText Transfer Protocol)超文本传输协议,一个应用层协议,定义了客户端和服务端的请求-响应方式。
作为HTTP协议的一代目,稍微不太成熟(完善),本来没有版本号加冕的,为了区别后面版本的协议,就划分了个0.9给它。
其方式如下,由单行指令构成的请求,以唯一可用方法GET开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
GET /hello.html
响应也略显简陋,没有HTTP头、状态码或者错误码,只包含响应文档本身。
你好,世界!
1996年,一个更健壮的HTTP协议二代目诞生了, 引入了请求(响应)头+请求(响应)体的概念,而且也可以传输除纯文本HTML文件以外其他类型的文档。(感谢Content-Type头)
然而HTTP1.0缺陷也很明显。每次请求都需要新建TCP连接,然后关闭,下次请求再新建关闭,即TCP连接不能复用。
1997年,开始修订HTTP的第一个标准化版本,即HTTP 1.1。它做了如下的改进:
- 复用TCP连接,节省多次新建-断开连接的时间。(感谢 connection keeplive)
- 增加管线化技术。
- 支持响应分块。(感谢Transfer-Encoding)
- 引入额外的缓存控制机制。
- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
- 感谢Host头,能够使不同域名配置在同一个IP地址的服务器上。
关于管线化技术。它可以让客户端在发送第一个请请求后不必等待应答即可发送第二、三…请求。但为了遵循HTTP1.1协议,服务器还是需要按请求的顺序有序的返回结果,这样整个连接还是先进先出,队头阻塞还是会发生,在该协议下,浏览器一般也是默认关闭该技术的。(只不过把原来客户端的FIFO搬到服务器端)
Content-Length
来表示消息体的长度。在TCP连接可以服用的情况下,这个长度可以让客户端知道响应消息是从哪里开始和结束的。 Transfer-Encoding: chunked
,告诉浏览器我使用的是分块传输编码,然后把响应数据分解成一系列数据块,一个完整的消息体由n个块组成,并以最后一个大小为0的块为结束,服务器发送数据时不再需要预先告诉客户端发送内容的总大小。
- 管线化技术有队头阻塞问题
- 单个TCP连接真正实现复用多个请求
- 当HTTP header很长时,影响网页加载延迟
针对上述问题,HTTP 2.0做了改进:
- HTTP 2.0是二进制协议而不再是文本协议,并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束,便于多路服用的实现。
- HTTP 2.0消除了这些限制后,通过允许客户端和服务器将HTTP消息分解为独立的帧,进行交织,然后在另一端重新组装,从而实现了完整的请求和响应多路复用。(想象你下载一部电视剧合集,不再是第一集下载完后再下载第二、三。。。)
- HTTP 2.0中,标头字段被压缩并以二进制代码传输,而不再是明文传输。 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
- 服务器推送。HTTP 1.1中,请求一个页面后,如果它包括了CSS、JS等资源,浏览器会再发起请求,获取这些资源文件。在HTTP 2.0中,除了响应于原始请求,服务器还可以向一个客户端请求发送多个响应,而客户端不必显式地请求每个请求。
注意,HTTP 2.0的使用有HTTPS要求。
- 关于HTTP3.0,虽然有人起草案了,不过截至到2021年1月18号,还没正式应用起来。
- 它基于QUIC协议,旨在将HTTP协议应用到UDP的基础上,并实现多路复用、0-RTT、TLS加密、流量控制、丢包重传等功能。
HTTP在基本的TCP/IP协议栈上发送信息,网景公司在此基础上创建了一个额外的加密传输层:SSL(安全套接字层,Secure Sockets Layer) 。而SSL又在标准化道路上最终成为TLS(传输层安全性,Transport Layer Security)。HTTPS协议也被称为HTTP通过TLS或基于SSL的HTTP。2016年,电子前沿基金会(EFF)在网络浏览器开发人员的支持下发起了一项运动,导致该协议变得越来越普遍。
关于HTTPS的加密算法,它采用了对称加密算法+非对称加密算法的加密方式。为啥?
而采用了对称加密算法+非对称加密算法如何实现加密内容不被破解勒~
其实,如果有列文虎克的朋友会发现,其实不需要对称加密也可以,即第二个阶段,协商出密钥k,变成协商出公钥和私钥,客户端本地保存一份,后面和服务端进行数据交互时,就可以全部采用非对称加密的方式了。
其实,在《图解HTTP》一书中有这样一段描述,加密过程就是对离散对数求值,这并非而易举就能办到的。如果传输内容使用非对称加密进行加密与解密的话,速度会慢到2~100倍。而通过非对称加密,服务器与客户端协定一个共享密钥进行对称加密,即保证安全又兼顾速度。
采用了对称加密算法+非对称加密算法看似完美了,但道高一尺,魔高一丈。如图所示。
如何解决这个中间人问题勒。其实分析中间人的入侵步骤,我们可以知道,在客户端第一步获取公钥的过程中就已经不对劲了,因为客户端拿到的公钥是中间人伪造的。如果有一个可以证明公钥PK是安全的方式,不就没有后边的事情了吗~
于是就有了CA机构(Catificate Authority,证书颁发机构)了,任何个体/组织都可以扮演 CA 的角色,只不过难以得到客户端的信任(有时候访问一些网站经常会弹框提示该网站的证书不受信任)。
理解CA如何增加HTTPS的安全性的问题上,需要先了解一哈:
于是有如下图,Cpk、Csk代表CA机构的公钥和私钥:
上文说到了HTTPS采用的是对称加密和非对称加密的加密方式,而在协商出对称加密用的私钥k时,流程其实太过简单粗暴,详细点的步骤如下:
转载地址:http://flxm.baihongyu.com/