超文本传输协议(HyperText Transfer Protocol) 参考链接
-
缓存处理:http1.0主要使用Expires、If-Modified-since作为缓存判断的标准,而http1.1则引入ETag、If-None-Match等
-
带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接
-
错误通知的管理:http1.1增加了更多的状态响应码,如409(请求的资源与资源的当前状态发生冲突)、410(服务器上的某个资源被永久性的删除)等
-
Host头处理:HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
-
长连接: HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,其中长连接也就是对应在HTTP1.1中的Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
典型的请求头有:
Accept:用于告诉服务器,客户机支持的数据类型
Accept-Charset:用于告诉服务器,客户机所采用的编码
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机的语言环境
Host:客户机通过这个头告诉服务器,想访问的主机名
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境
Cookie:客户机通过这个头可以向服务器带数据
典型的响应头部有:
Location:这个头配合302状态码使用,用于告诉客户找谁
Server:服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:服务器通过这个头,数据的压缩格式
Content-Length:服务器通过这个头,告诉浏览器回送数据的长度
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Last-Modified:服务器通过这个头,告诉浏览器当前资源缓存时间
Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次
Content-Disposition:服务器通过这个头,告诉浏览器以下载方式打开数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据的传送格式
ETag:…
Expires:服务器通过这个头,告诉浏览器把回送的资源缓存多长时间,-1或0,则是不缓存
Cache-Control:no-cache
Pragma:no-cache 服务器通过以上两个头,也是控制浏览器不要缓存数据
-
在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间
-
传输的内容都是明文,一定程度上无法保证数据的安全性
-
header里携带的内容过大,在一定程度上增加了传输的成本
-
虽然HTTP1.1支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压等
HTTPS: HTTP + TLS
-
https则是具有安全性的TLS加密传输协议
-
http端口80,https默认端口443
-
对称加密:传输的数据用其加密,客户端生成一对称密钥,需要告知服务器
-
非对称加密:服务器端生成一公钥私钥对,公钥对外开放,私钥服务器自己持有,客户端通过公钥对对称密钥进行加密,密文传给服务器,服务器通过私钥解密获取对称密钥
- 多路复用:即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。多路复用原理和keep alive区别如下图:
keep-alive与多路复用区别
[区别案例](https://http2.akamai.com/demo)
* keep-alive虽然也只建立一次链接,但请求是串行有序的,只是减少了建立链接的时间,而且浏览器本身会限制最大TCP连接数为6个左右
* http2数据流为二进制流,并行操作传输
-
Header压缩:HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小
-
服务端推送:同SPDY一样,HTTP2.0也具有Server Push功能
-
新的二进制格式:HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
HTTP3.0,也称作HTTP over QUIC。HTTP3.0的核心是QUIC(读音quick)协议,传统http协议是基于传输层TCP的协议,而QUIC是基于传输层UDP上的协议,可以定义成:HTTP3.0基于UDP的安全可靠的HTTP2.0协议
-
减少了TCP三次握手及TLS握手时间
-
多路复用丢包时的线头阻塞问题
-
优化重传策略
-
流量控制
-
连接迁移
1、浏览器向DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器
5、释放 TCP 连接
6、浏览器将该 html 文本并显示内容
- 101: websocket连接
- 200: 成功返回完成
- 206: 成功返回但未完成,请求长视频音频可能出现
- 301: 永久重定向
- 302: 临时重定向
- 304: 缓存
- 400: 请求参数错误
- 401: 没有权限
- 403: 禁止访问
- 404: 访问地址没找到
- 500: 服务端返回错误
- 504: 服务端无法处理请求