HTTP 实用指南 | 青训营笔记

85 阅读7分钟

HTTP 实用指南 | 青训营笔记

这是我参与「第四届青训营 - 前端场」笔记创作活动的第10天。

什么是 HTTP

HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议。

  • 超文本传输协议(Hyper Text Transfer Protocol,HTTP)
  • 应用层协议,基于TCP协议
  • 请求响应
  • 简单可扩展性
  • 无状态

协议分析

协议:为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。

发展

  • 消息:与逻辑请求或响应消息对应的完整的一系列帧
  • 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息
  • 帧(frame):HTTP/2通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流
  • 流控制:阻止发送方向接受方发送大量数据的机制
  • 对称加密:加密和解密都是使用同一个密钥
  • 非对称加密:加密和解密需要使用两个不同的密钥:公钥和私钥

报文

我们在发送 HTTP 请求的时候,到底给服务器发送了什么,服务器又给我们响应了什么,而这就是 HTTP 报文。

HTTP 报文分为请求报文和响应报文。

请求报文

请求报文会向Web服务器请求一个动作。

\

HTTP 请求报文由三部分组成:

  • 请求行:对报文进行描述的起始行
  • 请求头:包含属性的首部块以及可选的
  • 请求体:包含数据的主体部分
请求格式
<method> <request-URL> <version>
<headers>

<entity-body>
  • method(方法):客户端希望服务器对资源执行的动作。是一个单独的词。

  • request-URL (请求 URL):命名了所请求资源,或者URL路径组件的完整URL。
  • version (版本):报文所使用的 HTTP 版本,其格式:HTTP/. 其中 major (主要版本号)和 minor (次要版本号)都是整数。
  • headers (首部):可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个 CRLF。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始,
  • entity-body (实体的主体部分):包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。有时,报文只是以一个 CRLF 结束。
Method 分类
  • Safe(安全的):不会修改服务器的数据的方法:GET HEAD OPTIONS
  • Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。所有 safe 的方法都是 Idempotent 的
常用请求头
常用请求头作用
Accept指定客户端能够接收的内容类型
Cache-Control指定请求和响应遵循的缓存机制
Connection表示是否需要持久连接(HTTP 1.1 默认进行持久连接)
CookieHTTP请求发送时,会把保存在该请求域名下的所有 cookie 值一起发送给 Web 服务器
Content-Type客户端发送出去的实体内容的类型
Date请求发送的日期和时间
Expect请求的特定的服务器行为
From发出请求的用户的 Email
Host指定请求的服务器的域名和端口号
If-None-Match如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变
Max-Forwards限制信息通过代理和网关传送的时间
Pragma用来包含实现特定的指令

响应报文

响应报文会将请求的结果返回给客户端。

响应报文的基本报文结构与请求报文相同

请求格式
<method> <status> <reason-phrase>
<headers>

<entity-body>
  • status (状态码):由三位数字组成,描述了请求过程中所发生的情况
  • reason-phrase (原因短语):上面数字状态码的可读版本包含行终止序列之前的所有文本
状态码

  • 200 OK - 客户端请求成功
  • 301 - 资源〔网页等)被永久转移到其它 URL
  • 302 - 临时跳转
  • 401 Unauthorized - 请求未经授权
  • 404 - 请求资源不存在,可能是输入了错误的 URL
  • 500 - 服务器内部发生了不可预期的错误
  • 504 Gateway Timeout - 网关或者代理的服务器无法在规定的时间内获得想要的响应。
常用响应头
常用响应头作用
Cache-Control告诉所有的缓存机制是否可以缓存及哪种类型
Content-Type返回内容的 MIME 类型
ETag请求变量的实体标签的当前值
Expires响应过期的日期和时间
Last-Modified请求资源的最后修改时间
Location用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源
Pragma包括实现特定的指令,它可应用到响应链上的任何接收方
Proxy-Authenticate它指出认证方案和可应用到代理的该 URL 上的参数
refresh应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
Retry-After如果实体暂时不可取,通知客户端在指定时间之后再次尝试
Serverweb服务器软件名称
Set-Cookie设置 Http Cookie

RESTful API

一种 API 设计风格;REST - Representational State Transfer

  • 每一个 URL 代表一种资源
  • 客户端和服务器之间,传递这种资源的某种表现层
  • 客户端通过 HTTP method,对服务器资源进行操作,实现“表现层状态转化”

缓存

缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。

Cookie

cookie 实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上。当用户访问了某个网站,可以通过 cookie 向访问者电脑上存储数据。

作用
Name = value各种 cookie 的名称和值
Expires = DateCookie 的有效期,缺省时 Cookie 仅在浏览器关闭之前有效
Path = Path限制指定 Cookie 的发送范围的文件目录,默认为当前
Domain = domain限制 Cookie 生效的域名,默认为创建 Cookie 的服务器
secure仅在 HTTPS 安全连接时,才可以发送 Cookie
HttpOnlyJavaScript 脚本无法获得 Cookie
SameSite = [None/Strict/Lax]- None 同站、跨站请求都可发送- Strict 仅在同站发送- Lax 允许与顶级导航一起发送,并将与第三方网站发起的 GET 请求一起发送

通信方式

WebSocket

WebSocket 协议允许不受信用的客户端代码在可控的网络环境中控制远程主机。该协议包含一个握手和一个基本消息分帧、分层通过 TCP。简单点说,通过握手应答之后,建立安全的信息管道,这种方式明显优于基于 XMLHttpRequest 的 iframe 数据流和长轮询。该协议包括两个方面,握手链接(handshake)和数据传输(data transfer)。

  • 浏览器与服务器进行全双工通讯的网络技术
  • 典型场景:实时性要求高,例如聊天室
  • URL 使用 ws:// 或 wss:// 等开头

QUIC:Quick UDP Internet Connection

QUIC (Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。

  • 0-RTT 建联(首次建联除外)
  • 类似TCP的可靠传输
  • 类似 TLS 的加密传输,支持完全前向安全
  • 用户空间的拥塞控制,最新的 BBR 算法
  • 支持 h2 的基于流的多路复用,但没有 TCP 的 HOL 问题
  • 前向纠错 FEC
  • 类似 MPTCP 的 Connection migration


如有错误欢迎指正。