HTTP基础

73 阅读8分钟

1. HTTP

HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web 是建立在 HTTP 协议上通信的。

2. 请求/响应报文

HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。

image.png

请求报文:由请求行、请求头、空行、请求体四部分组成

响应报文:由状态行、响应头、空行、响应体四部分组成

  • 请求行:包含HTTP方法,请求地址,HTTP协议以及版本
  • 请求头/响应头:一些key:value,来告诉服务端我要哪些内容
  • 空行:用来区分首部和实体,因为请求头都是key:value的格式,当解析遇到空行时,服务端就知道下一个不再是请求头部分,就该当作请求体来解析了
  • 请求体:请求的参数
  • 状态行:包含HTTP协议及版本、数据状态码、状态码英文名称
  • 响应体:服务端返回的数据

2.1 method 请求方法

方法描述
GET请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据
POST用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
PUT用请求的有效载荷替换目标资源的所有当前表示
DELETE删除指定的资源
HEAD请求一个与GET请求的响应相同的响应,但没有响应体
CONNECT建立一个到由目标资源表示的服务器的隧道
OPTIONS用于描述目标资源的通信选项
TRACE沿着到目标资源的路径执行一个消息回环测试
PATCH用于对资源应用部分修改
以上请求方式可以分为两类:
  • 安全:不会修改服务器的数据的方法:GET HEAD OPTIONS
  • 幂等:同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有safe的方法都是idempotent的:GET HEAD OPTIONS PUT DELETE

2.2 状态码

总体而言

  • 1xx 表示请求已接收,继续处理
  • 2xx 表示成功
  • 3xx 表示需要进一步操作
  • 4xx 表示浏览器方面出错
  • 5xx 表示服务器方面出错

常用状态码及含义:

状态码含义
200 OK客户端请求成功
206 Partial Content用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分
301 Moved Permanently永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问
302 Found临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问
304 Not Modified表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制
400 Bad Request请求的报文有错误
401 Unauthorized请求未经授权
403 Forbidden服务器禁止访问资源
404 Not Found请求的资源在服务器上不存在或未找到
500 Internal Server Error服务器出现错误
501 Not Implemented客户端请求的功能还不支持
502 Bad Gateway服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误
503 Service Unavailable服务器当前很忙,暂时无法响应客户端
504 Gateway Timeout网关或者代理的服务器无法在规定的时间内获得想要的响应

2.3 请求头

Header首部和请求方法配合工作,共同决定了客户端和服务器能做什么事情。

请求头含义
Accept接收类型,表示浏览器支持的MIME类型(对标服务端返回的Content-Type)
Content-Type客户端发送出去实体内容的类型
Cache-Control指定请求和响应遵循的缓存机制,如no-cache
If-Modified-Since对应服务端的Last-Modified,用来匹配看文件是否变动,只能精确到1s之内
Expires缓存控制,在这个时间内不会请求,直接使用缓存,服务端时间
Max-age代表资源在本地缓存多少秒,有效时间内不会请求,而是使用缓存
If-None-Match对应服务端的ETag,用来匹配文件内容是否改变(非常精确)
Cookie有cookie并且同域访问时会自动带上
Referer该页面的来源URL(适用于所有类型的请求,会精确到详细页面地址,csrf拦截常用到这个字段)
Origin最初的请求是从哪里发起的(只会精确到端口),Origin比Referer更尊重隐私
User-Agent用户客户端的一些必要信息,如UA头部等

2.4 响应头

响应头含义
Content-Type服务端返回的实体内容的类型
Cache-Control指定请求和响应遵循的缓存机制,如no-cache
Last-Modified请求资源的最后修改时间
Expires应该在什么时候认为文档已经过期,从而不再缓存它
Max-age客户端的本地资源应该缓存多少秒,开启了Cache-Control后有效
ETag资源的特定版本的标识符,Etags类似于指纹
Set-Cookie设置和页面关联的cookie,服务器通过这个头部把cookie传给客户端
Server服务器的一些相关信息
Access-Control-Allow-Origin服务器端允许的请求Origin头部(譬如为*)

2.5 cookie

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

3. HTTP发展

3.1 HTTP1.1

目前广泛使用的是HTTP1.1,最突出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」

缺点:

  1. 无状态:服务端不会记忆HTTP状态,每个请求都是单独的,解决方法多样,简单如使用cookie
  2. 明文传输,不安全。

特点:

  1. 在HTTP1.0的基础上增加了长连接

在HTTP1.0中,每个http请求都需要先进行TCP三次握手,请求后都需要进行TCP四次挥手,使用长连接后可在单个TCP连接上进行多次请求-响应,超过一定时间没有任何数据交互,服务端就会主动断开这个连接

HTTP1.1上默认开启长连接

Connection: Keep-Alive

2. 管道传输

需要注意的是,服务器还是按顺序处理请求,处理单个请求时间较长时,后面的请求处理也会被阻塞,即仍然存在相应的对头阻塞。

3.2 HTTP2

HTTP2性能提升的核心就在于二进制分帧层。HTTP2是二进制协议,他采用二进制格式传输数据而不是1.x的文本格式,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)

3.2.1 多路复用

HTTP2建立一个TCP连接,一个连接上面可以有任意多个流(stream),消息分割成一个或多个帧在流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。

发送方可以交错发送,接收方重组

3.2.2 服务器推送

在HTTP2中,服务器可以自动向客户端发送消息。

客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。 Stream 1 是客户端向服务端请求的资源,属于客户端建立的 Stream,所以该 Stream 的 ID 是奇数(数字 1);Stream 2 和 4 都是服务端主动向客户端推送的资源,属于服务端建立的 Stream,所以这两个 Stream 的 ID 是偶数(数字 2 和 4)。

同时,由于服务器可以主动发起推送push,在客户端仅请求html文件时,服务端除了响应html文件,还可以主动将后续会请求的js文件和css文件也push给客户端,减少消息传递次数。