# HTTP 介绍

# 是什么

超文本传输协议,Hyper Text Transfer Protocol。从服务器传输超文本标记语言(HTML)到本地浏览器的协议。在服务器和客户端之间传输文本、音频、图片等内容的约定和规范。

  • 超文本:超越普通文本。文本、图片、音频、视频等内容。
  • 传输:将内容/数据从一方传到另一方。说明 HTTP 是双向的协议,双方数据的传输过程,可能经过多个中间人(其中就包含了安全认证,数据压缩,编码转换)。不能用于广播、寻址。
  • 协议:双方/多方之间的一个约定,在 HTTP 中,规定了计算机之间的通信规范,以及各种控制和错误处理方式。

# 原理

HTTP 需要与其他协议协作(不是单独存在的),一个基于 TCP/IP 通信协议来传递数据的协议,可传输数据包括 HTML 文件、图片、音频等,属于应用层,一般用于 B/S 架构。

TIP

应用层还有其他协议:
FTP:文件传输协议,用来在客户机和 FTP 服务器之间的传输数据(用来在两台计算机之间传输文件)
DNS 域名系统:域名到 IP 之间的解析服务
SMTP:邮件发送协议
POP3:邮件接收协议
DHCP:动态主机配置协议

# 特点

  • 请求 - 应答 支持客户端/服务端模式,也是一种请求/响应模式的协议。
  • 简单快速 发送请求时,只需传输请求方法和路径就可以,常见方法 GET、POST、OPTIONS、HEAD
  • 灵活可拓展 允许传输多种类型的数据,例如文本、图片、音频等,传输类型通过 Content-Type 标记
  • 无状态 每次请求不保存之前发送请求的状态,每次都是独立的,Cookie。
  • 可靠传输 依赖于 TCP/IP 协议,确保传输数据的完整性。
  • 持久连接 需要配置 Connection: keep-alive(HTTP/1.1 默认开启)。建立一次 TCP 请求,可多次请求/响应。出现原因,每进行一次 HTTP 请求,都会进行一次 TCP 连接,连接和开销较大,耗时。

# 优点

  • 简单、灵活、易拓展
  • 应用广泛、环境成熟
  • 无状态,服务器不用记录状态信息,减轻服务器压力。

# 缺点

  • 明文传输。使用文本,非二进制数据
  • 无法验证报文完整性。内容可能被篡改
  • 不验证通信方的身份,可能会被伪造
  • 无状态
  • 队头阻塞

# 请求方法

  • GET:获取资源,幂等操作
  • HEAD:获取报文首部,类似于 GET,但是不返回报文主体,幂等操作
  • POST:更新/创建资源,非幂等操作
  • PUT:更新/创建资源,幂等操作
  • PATCH: 内容局部更新,幂等操作
  • DELETE:删除资源/数据,幂等操作
  • OPTIONS:插叙服务器支持的方法,是否跨域,幂等操作

TIP

幂等,多次操作,返回的结果是一致的。 PUT

# GET、POST 区别

  • GET 会被浏览器缓存下来,POST 不会
  • GET 只能进行 URL 编码,只能接收 ASCII 字符,POST 没限制
  • GET 参数方法在 URL 上,POST 放到请求里
  • 幂等性

TIP

URL 和 URI 的区别 URI:Uniform Resource Identifier 统一资源标识符,只能使用 ASCII 码。
URL:Uniform Resource Location 统一资源定位符 URI 是用来标示 一个具体的资源的,我们可以通过 URI 知道一个资源是什么。组成:协议,主机地址(域名或 IP),端口,路径,query 参数等。

URL 则是用来定位具体的资源的,标示了一个具体的资源位置。互联网上的每个文件都有一个唯一的 URL。

URN 统一资源名,是 URI 的另一种形式。特定内容的唯一名称,与资源位置无关。仍处于研发阶段。

# 报文

# 请求

# 请求行

请求行包括,请求方法、URL、协议/版本

# 请求头

  • connective:
  • Origin:
  • User-Agent:
  • Accept-Encoding: ...

# 请求正文

# 响应

# 响应行

响应行包括,协议/版本,响应状态

# 响应头

  • Date:
  • Set-Cookie:
  • Cache-Control:
  • Expires:
  • Etag:
  • Last-Modified:
  • 响应正文

TIP


Set-Cookie: a=b;Max-Age=10;Expires=xxx;Domain=xxx;path=/;HttpOnly;SameSite=Strict

Expires(绝对时间点),Max-Age(单位是秒)用来设置 cookie 的过期时间,Max-Age 优先级更高。

DomainPath指定了 Cookie 所属的域名和路径

HttpOnly 设置了不能通过 document.cookie 操作 cookie 信息。

SameSite可以防范跨站请求伪造(XSRF)攻击,设置成SameSite=Strict可以严格限定 Cookie 不能随着跳转链接跨站发送,而SameSite=Lax则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。SameSite=Secure,Cookie 只能用 HTTPS 发送。

# 状态码

# 1xx,请求已收到,需进一步处理

# 2xx,成功状态

  • 200 OK,成功返回,带有响应体
  • 204 No Content,成功返回,不带实体

# 3xx,重定向

  • 301,永久重定向,浏览器缓存,下次访问,直接跳转到定向地址
  • 302,临时重定向,不缓存,可用于负载均衡、URL 增强(增加一些信息)、鉴权相关等。会将 POST 请求处理成 GET。
  • 303,临时重定向,将浏览器重定向到另一个资源,新资源并不是请求的资源,而是对请求资源的描述,比如重置密码,服务器返回 303 响应,重定向到上传成功或者失败的页面。
  • 304,缓存相关
  • 307,和 302、303 类似,但是不会改变请求的方式。

# 4xx,请求错误

  • 400,请求报文语法错误
  • 401,需要有通过 HTTP 认证的认证信息或者表示用户认证失败
  • 403,请求被拒绝
  • 404,请求资源未找到

# 5xx,服务端错误

  • 500,服务器内部错误
  • 501,客户端请求,服务器不支持
  • 502,服务器正常,代理服务器无法获取合法响应
  • 503,服务器超负荷,或停机维护