HTTP协议 | 青训营笔记

54 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

初识HTTP

HTTP 即 HyperText Transfer Protocol (超文本传输协议),是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP 是一个应用层协议,基于 TCP/IP 通信协议来传递数据。每个 HTTP 的请求都会分为请求和响应两部分,请求的内容拥有很强的扩展性,由于每个请求都是独立的,所以 HTTP 请求是无状态的。

HTTP 协议发展

HTTP 协议在最初(0.9 版本)是一个单行的协议,其请求内容非常的简单,如GET /mypage.html,响应内容也只有 HTML 文档,到了 HTTP/1.0 ,开发人员构建了协议的可扩展性,并增加了Header、状态码,并支持了多种文档类型,以及增添了许多其他功能。在 HTTP/1.1 ,增添了链接的复用、缓存、内容协商等功能,使得其成为标准化的一个版本。到了 HTTP/2 ,HTTP 协议的功能进一步强大,增加了二进制协议、压缩 header、服务器推送等功能,使得其有了更加优异的表现。

HTTP协议分析

消息结构

发送一个 HTTP 请求包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,以下是一个简单的 post 请求的内容。

POST/upload HTTP/1.1
Host:www.example.org
Content-Length:15

{"msg":"hello"}

HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。以下是一个简单响应的内容组成。

HTTP/1.1 200 OK

Data:Wed,28 Jul 2022 07:35:18
server:Tengine
content-type:text/html;charset=utf-8

<!doctype html><html lang="zh-cn"><...

方法

HTTP 请求有着多种请求方法,用于执行不同的请求内容。

Method
GET请求一个指定资源的表示形式.使用GET的请求应该只被用于获取数据。
POST用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
PUT用请求有效载荷替换目标资源的所有当前表示。
DELETE删除指定的资源。
HEAD请求一个与GET请求的响应相同的响应,但没有响应体。
CONNECT建立一个到由目标资源标识的服务器的隧道。
OPTIONS用于描述目标资源的通信选项。
TRACE沿着到目标资源的路径执行一个消息环回测试。
PATCH用于对资源应用部分修改。

状态码

当我们访问一个网页时,浏览器会向网页所在服务器发出请求。网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。HTTP 状态码由三位十进制数组成,响应分为五个类别,分别是:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。

状态码.png

常见请求头与响应头

在 HTTP 请求中有着许多的请求头,其中包含了关于请求,响应或者其他的发送实体的信息,下面是一些我们常用的请求头与响应头。

常用请求头.png

常用响应头.png

缓存

缓存可以分为两类,一类是强缓存,即资源在本地已有的情况下直接调用。另一类是协商缓存,即本地缓存不确定是否可用或是否为最新,需要与服务端进行确定。强缓存和协商缓存中都有一些字段来表示缓存中的各种内容。

缓存1.png 在浏览器中缓存的处理也遵循着一定的顺序。 缓存.png

常见场景

静态资源

静态资源即不需要与服务端进行数据交互,按照基本设置显示的资源。由于不需要与服务端交互,因此静态资源一般采用缓存的方式来提高用户的访问速度。为了当用户第一次访问时达到类似的效果,我们采用 CDN 服务器来进行就近分发,提高用户的访问效率。 静态资源.png

跨域

我们在对服务器进行请求时,有时会遇到跨域的问题,即浏览器发现请求没有得到跨域许可时,无法访问服务端响应的数据。为了解决这一问题,我们需要进行跨域。所谓跨域,全称是跨源资源共享 (CORS) Cross- Origin Resource Sharing ,是一种基于 HTTP Header 的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),这样浏览器可以访问加载这些资源。

跨域1.png