这是我参与「第五届青训营」伴学笔记创作活动的第 5 天,欢迎各位大佬批评指正。
HTTP 发展与现状
HTTP作为现代互联网通用协议,经历了几个较大的版本迭代更新,是目前最热门的应用层协议之一。目前被广泛使用的仍然是HTTP 1.1版本协议,但是HTTP2 / HTTP3协议依然是未来互联网协议发展的趋势。对于HTTP和传输层的TCP/IP协议的熟练掌握不仅是前端开发人员的必备技能,也是后期进行性能优化,页面加载效率提升和一些特殊应用场景的(加密传输、实时通讯等)的基础。
什么是 HTTP 协议
HTTP即Hyper Text Transfer Protocol(超文本传输协议),位于OSI七层网络模型的第七层,即应用层协议,在传输层基于TCP协议。具有请求-响应单向机制,无状态,并且有简单可扩展的特性。
最早的HTTP协议仅仅用于传输简单的文本信息,随着互联网的发展,愈来越多的资源和文件可以在HTTP协议下进行传输,比如:图片、视频、音频、超链接等。
HTTP 协议分析
如下图是一个最基本的HTTP模型:
1. 报文结构分析
HTTP协议由start-line、header和body组成。
- 请求头: 第一行为请求行,包括:请求方法、URL、HTTP协议版本等,以空格分割。例如:
GET / HTTP/1.1
| 常用request-header | 描述 |
|---|---|
| Host | 通信的服务器域名或IP地址 |
| Connection | 网络连接方式,默认值为keep-alive,即复用链接。 |
| Accept | 客户端可以接受的资源类型(对应响应头的Content-Type) |
| Accept-Encoding | 客户端支持的压缩编码格式,例如gzip,default,br等。 |
| Content-Type | 客户端发送的实体内容类型。 |
| Cookie | 同域发送请求携带的客户端信息,使得请求变为一个有状态的请求。 |
| Cache-Control | 指定请求和响应的缓存机制。 |
| If-Modified-Since | 对应Last-modified,用来判断文件是否变动,只能精确到1s。 |
| Experies | 缓存控制,如果在时间段内使用缓存。 |
| Max-Age | 代表资源在本地缓存多少秒。 |
| If-None-Match | 对应ETag,判断文件是否改变,非常精确,优先级最高。 |
| User-Agent | 客户端信息,包括:浏览器版本、手机、电脑信息等。 |
- 响应头:
第一行为状态行,包括:
HTTP协议版本、状态码等,以空格分割。例如:
HTTP/1.1 200 OK
| 常用response-header | 描述 |
|---|---|
| Content-Type | 服务器返回实体内容的类型。 |
| Connection | 网络连接方式,默认值为keep-alive,即复用链接。 |
| Accept | 客户端可以接受的资源类型 |
| Accept-Encoding | 客户端支持的压缩编码格式,例如gzip,default,br等。 |
| Cookie | 发送请求携带的客户端信息,使得请求变为一个有状态的请求。 |
| Cache-Control | 指定响应请求遵循的缓存机制。 |
| Etag | 资源特定标识符 |
| Expires | 缓存失效期。 |
| Max-Age | 缓存在本地缓存最大时间。 |
| Last-Modified | 资源最后修改时间。 |
| User-Agent | 客户端信息,包括:浏览器版本、手机、电脑信息等。 |
缓存机制:浏览器请求的资源,可以被缓存在本地,下一次打开的时候可以直接从本地加载,避免建立TCP链接拉取资源,有更好的响应时间并且降低服务器的压力。其可分为强缓存/协商缓存。
强缓存:当缓存的资源标识未过期时,可以直接拉去本地资源不必发送http请求。由
Expires和Cache-Control控制。协商缓存:当缓存资源过期时,需要和服务器通信验证缓存资源是否是最新的。
- cookie:
cookie会同域请求中自动携带,具体字段如下:
2. 请求方式
虽然一般见到的请求都是GET和POST;但其实请求方式有许多~
| 请求方式 | 描述 |
|---|---|
| GET | 用于请求服务器获取资源。 |
| POST | 将一个实体提交到服务器,用于更改资源状态等。 |
| PUT | 用请求有效载荷替换目标资源的所有当前表示。 |
| DELETE | 删除指定资源。 |
| HEAD | 请求一个与GET请求相同的响应,但是没有响应体。 |
| CONNECT | 建立一个到目标服务器的通信隧道。 |
| OPTIONS | 描述目前资源的通信选项。 |
| TRACE | 沿着目标资源路径进行消息回环测试。 |
| PATCH | 对资源应用部分进行修改。 |
safe(安全方法)
安全方法就是不会修改服务器资源状态的请求方式。比如:GET;HEAD;OPTIONS。
Idempotent(幂等方法)
幂等方法即多次和一次产生的效果是一样的,服务器的状态也是一样的。除了安全的三种方法外,还有PUT和DELETE。
3. 状态码
| 状态码 | 描述 |
|---|---|
| 1XX | 表示信息已经接受,等待后续处理。 |
| 2XX | 表示成功;请求已经被成功接受、理解;比如200。 |
| 3XX | 重定向,要完成请求必须进一步操作。 |
| 4XX | 客户端错误,请求无法完成或者有语法错误。 |
| 5XX | 服务端错误,服务端未能实现合法请求。 |
4. Restful/Restless API
REST,即representational state transfer,表现层状态转化;适用于描述API的两种设计风格。
-
RESTful API
- 每一种url代表一种资源;
- 客户端和服务端之间传递这种资源的某种表现层
- 客户端通过http请求对资源进行操作,实现表现层状态转化。
-
RESTless API
- 每一个路径代表一个一种操作。
- CRUD不是由请求方式决定。
HTTPS 概述
HTTP是明文传输的协议,很容易被第三方/中间人截获信息,不适用于保密程度较高的信息和涉及隐私的情况。HTTPS在这种需求下应运而生,其经过TSL/SSL加密,防止传输信息被截获破解。具体如下图所示:
HTTP/2 协议
HTTP/2是一个比较成熟的HTTP协议的应用方案,目前被许多大厂采用。相比于HTTP/1.1而言,其具有更快、更稳定、更简单的特性。
- 二进制分帧:
HTTP/2以二进制传输代替原本的明文传输,报文信息被划分为更小的数据帧。
- 多路复用
虽然同一个域名下浏览器允许建立6~8个TCP链接,但是对于大量数据请求数量显然不够,此外,HTTP/1.1是请求答应的方式,每个TCP只能同时处理一个请求-应答,浏览器按照FIFO原则进行处理,这样如果有一个请求阻塞,则会形成队头阻塞的情形。
HTTP/2在一个TCP连接上,可以不断发送帧,每个帧的stream identifier标明该帧属于哪一个数据流,接收方会依据stream identifier拼接数据帧形成完成的数据,因此可以实现乱序发送,并且避免队头阻塞的情况。
- 服务端主动推送
服务器会主动向浏览器推送浏览器请求相关的资源,避免后续必然的请求发起。
- 优先级
每一个stream都可以设置依赖和权重,按照依赖树分配优先级,解决了关键请求被阻塞的问题。