理解HTTP协议|青训营笔记

137 阅读6分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 5 天,欢迎各位大佬批评指正。

HTTP 发展与现状

HTTP作为现代互联网通用协议,经历了几个较大的版本迭代更新,是目前最热门的应用层协议之一。目前被广泛使用的仍然是HTTP 1.1版本协议,但是HTTP2 / HTTP3协议依然是未来互联网协议发展的趋势。对于HTTP和传输层的TCP/IP协议的熟练掌握不仅是前端开发人员的必备技能,也是后期进行性能优化,页面加载效率提升和一些特殊应用场景的(加密传输、实时通讯等)的基础。

什么是 HTTP 协议

HTTPHyper Text Transfer Protocol(超文本传输协议),位于OSI七层网络模型的第七层,即应用层协议,在传输层基于TCP协议。具有请求-响应单向机制,无状态,并且有简单可扩展的特性。

网络协议模型.png

最早的HTTP协议仅仅用于传输简单的文本信息,随着互联网的发展,愈来越多的资源和文件可以在HTTP协议下进行传输,比如:图片、视频、音频、超链接等

HTTP 协议分析

如下图是一个最基本的HTTP模型: http协议详解.png

1. 报文结构分析

HTTP协议由start-lineheaderbody组成。

  • 请求头: 第一行为请求行,包括:请求方法、URL、HTTP协议版本等,以空格分割。例如:
GET / HTTP/1.1
常用request-header描述
Host通信的服务器域名IP地址
Connection网络连接方式,默认值为keep-alive,即复用链接
Accept客户端可以接受的资源类型(对应响应头的Content-Type)
Accept-Encoding客户端支持的压缩编码格式,例如gzipdefaultbr等。
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客户端支持的压缩编码格式,例如gzipdefaultbr等。
Cookie发送请求携带的客户端信息,使得请求变为一个有状态的请求。
Cache-Control指定响应请求遵循的缓存机制。
Etag资源特定标识符
Expires缓存失效期。
Max-Age缓存在本地缓存最大时间。
Last-Modified资源最后修改时间。
User-Agent客户端信息,包括:浏览器版本手机、电脑信息等。
  • 缓存机制:浏览器请求的资源,可以被缓存在本地,下一次打开的时候可以直接从本地加载,避免建立TCP链接拉取资源,有更好的响应时间并且降低服务器的压力。其可分为强缓存/协商缓存截屏2023-02-07 21.25.24.png

  • 强缓存:当缓存的资源标识未过期时,可以直接拉去本地资源不必发送http请求。由ExpiresCache-Control控制。 截屏2023-02-07 21.21.16.png

  • 协商缓存:当缓存资源过期时,需要和服务器通信验证缓存资源是否是最新的。 截屏2023-02-07 21.21.34.png

  • cookiecookie会同域请求中自动携带,具体字段如下: 截屏2023-02-07 21.26.12.png

2. 请求方式

虽然一般见到的请求都是GETPOST;但其实请求方式有许多~

请求方式描述
GET用于请求服务器获取资源。
POST将一个实体提交到服务器,用于更改资源状态等。
PUT用请求有效载荷替换目标资源的所有当前表示。
DELETE删除指定资源。
HEAD请求一个与GET请求相同的响应,但是没有响应体。
CONNECT建立一个到目标服务器的通信隧道。
OPTIONS描述目前资源的通信选项。
TRACE沿着目标资源路径进行消息回环测试
PATCH对资源应用部分进行修改。

safe(安全方法)

安全方法就是不会修改服务器资源状态的请求方式。比如:GETHEADOPTIONS

Idempotent(幂等方法)

幂等方法即多次和一次产生的效果是一样的,服务器的状态也是一样的。除了安全的三种方法外,还有PUTDELETE

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加密,防止传输信息被截获破解。具体如下图所示:

截屏2023-02-07 20.23.48.png

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都可以设置依赖和权重,按照依赖树分配优先级,解决了关键请求被阻塞的问题。