http 报文
一个http
报文也成为http
消息 ( message )
在http1
中,http
报文是基于文本的;在http2
之后,报文被封装成二进制帧,无法明文读取
请求报文包含了http
方法,http
协议版本,url
,请求头,请求体;响应报文包含状态码,状态信息、http
协议版本,响应头,响应体
http 与 https 的区别
先说结论,http
=https
+tls/ssl
加密
我们从一些“客户端-服务端”的密钥加密方式来逐步讲解https
的加密方式
这里需要注意的点是,客户端向服务端的请求和服务端对客户端的响应报文都是需要加密传输的
对称加密
对称加密是指客户端向服务端请求时,服务端把一个公钥传给客户端,此后客户端与服务端之间的信息传输都使用该公钥加密
这就有很大的风险,因为公钥每个人都是可以获取的,所以有坏人拿到服务端的公钥并且拦截到http
报文的话就可以获取其中的信息
非对称加密
非对称加密是指服务端存储了一把公钥a和私钥a',客户端存储了公钥b和私钥b',然后客户端与服务端传输信息时,将自己的公钥发给对方,分别用对方的公钥加密,然后用自己的私钥解密对方发过来的信息
这样子坏人拦截到http
报文时,由于私钥无法获取,所以即使拿到公钥也没有用
但是使用非对称加密对于报文进行加密的方式性能开销比较大,这是一个缺点
混合加密
https
使用的就是混合加密,服务端存储一对公钥a和私钥a',与客户端通信时把公钥a发给客户端
客户端自己存储一个密钥下x,利用密钥x先对报文信息进行加密,然后使用公钥a对密钥x进行加密,然后把加密后的密钥x发给服务端,服务端使用私钥a'解密加密的密钥x,然后就可以解密报文了
这样子就避免了直接使用非对称的方式去加解密报文,而是去加解密另一个密钥,减少了开销
http 不同版本的区别
http1.0 短连接
在http1.0
中,使用的是短连接模型,所以每对于每一份http
报文(每一次请求),都要打开一个tcp
连接
http1.1 长连接
在http1.1
中使用了长连接的模型,,多份http
报文(多次请求)可以在同一次连接中发送,减少了不必要的开销
http1.1 队头阻塞
http1.1
使用长连接模型,同时是一个“单个请求-单个响应”模型,其响应必须按请求的顺序返回,并且只有在前一次请求响应后才能继续发送下一次请求,所以有可能出现一些很大的报文在前面阻塞了后面的请求与响应
http2 封装成帧
在http2
流传输中,将原本的http1.1
报文封装成数据帧,帧把原本的hhttp1.1
报文的header
和body
分离开来,分别对应header
帧和data
帧,一个帧又可以由多个帧片段组成,一个帧片段又分为frame header
和frame body
,详情参考mdn
文档中的图片:
http2 多路复用
多路复用就是封装成帧的特性,每个数据帧会有对应的编号,也就意味着数据帧在流中可以乱序发送,无需等待“一个请求-一个响应”