应用层协议HTTP

在互联网世界中, HTTP ( H yper T ext T ransfer P rotocol ,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。它 是一个 无连接、无状态 的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

1. URL

平时我们俗称的 " 网址 " 其实就是说的 URL

urlencodeurldecode

像 / ? : 等这样的字符 , 已经被 url 当做特殊意义理解了。 因此这些字符不能随意出现。 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义 。
转义的规则如下 :
将需要转码的字符转为 16 进制,然后从右到左,取 4 位 ( 不足 4 位直接处理 ) ,每 2 位
做一位,前面加上 % ,编码成 %XY 格式


"+" 被转义成了 "%2B"
urldecode 就是 urlencode 的逆过程 ;
UrlEncode编码/UrlDecode解码 - 站长工具

HTTP****协议请求与响应格式

首行: [方法] + [url] + [版本]

Header: 请求的属性,冒号分割的键值对,每组属性之间使用\r\n 分隔,遇到空行表示 Header 部分结束

Body: 空行后面的内容都是 Body. Body 允许为空字符串.

Header 中会有一个 Content-Length 属性来标识 Body 的长度;

HTTP****响应

首行: [版本号] + [状态码] + [状态码解释]

Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束

Body: 空行后面的内容都是 Body. Body 允许为空字符串.

Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.

基本应答格式如下:

2. HTTP 常见****方法

  1. GET方法
    用途:用于请求 URL 指定的资源
    特性:指定资源经服务器端解析后返回响应内容。
    示例:GET /index.html HTTP/1.1
    向服务器请求 /index.html 资源,服务器会解析该资源并返回其内容(如 HTML 文件)。
    form 表单:https://www.runoob.com/html/html-forms.html

  2. POST 方法
    用途:用于传输实体的主体,通常用于提交表单数据
    特性:可以发送大量的数据给服务器,并且数据包含在请求体中。
    示例:POST /submit.cgi HTTP/1.1
    form 表单:https://www.runoob.com/html/html-forms.htm

  3. HEAD 方法
    用途:与 GET 方法类似,但不返回报文主体部分,仅返回响应头
    特性:用于确认 URL 的有效性及资源更新的日期时间等。
    示例:HEAD /index.html HTTP/1.1

  4. OPTIONS 方法
    用途:用于查询针对请求 URL 指定的资源支持的方法。
    示例:OPTIONS * HTTP/1.1
    特性:返回允许的方法,如 GET、POST 等。

3. HTTP的状态码

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定
向), 504(Bad Gateway)

状态码 名称 含义 应用样例 补充说明
100 Continue 服务器已收到请求头,客户端应继续发送请求体 上传大文件前,服务器检查请求头后返回 100,允许客户端继续传输文件数据。 需配合 Expect: 100-continue 请求头使用。
200 OK 请求成功 访问 https://example.com,服务器返回网页内容。 最常用的成功状态码。
201 Created 资源创建成功 POST /articles 创建新文章,服务器返回 201 和新文章的 URL(Location 头)。 通常伴随 Location 响应头指向新资源。
204 No Content 请求成功,但无返回内容 DELETE /articles/123 删除文章后,服务器返回 204 表示操作成功。 适用于无需返回数据的操作(如删除、更新)。
301 Moved Permanently 资源永久重定向 网站域名从 http 切换到 https,旧链接返回 301 跳转到新地址。 搜索引擎会更新索引。
302 Found (或 See Other) 资源临时重定向 用户登录后,服务器返回 302 重定向到个人主页。 浏览器下次仍请求原地址。
304 Not Modified 资源未修改(客户端可使用缓存) 浏览器携带 If-Modified-Since 头请求静态资源,服务器返回 304 表示缓存有效。 节省带宽,提升性能。
400 Bad Request 客户端请求错误(如参数格式错误) 提交表单时缺少必填字段,服务器返回 400 和错误详情(如 {"error": "Name is required"})。 需在响应体中明确错误原因。
401 Unauthorized 未认证或认证失败 访问 /admin 未登录时,服务器返回 401WWW-Authenticate 头要求登录。 403 的区别:401 是未认证,403 是认证后无权限。
403 Forbidden 服务器拒绝访问(无权限) 普通用户尝试访问 /admin/dashboard,服务器返回 403 即使登录也无法访问。
404 Not Found 资源不存在 访问 https://example.com/old-page,但该页面已删除。 需检查 URL 是否正确或资源是否被移除。
500 Internal Server Error 服务器内部错误 服务器数据库崩溃,返回 500 和错误日志 ID(如 {"error": "Database timeout"})。 需排查服务器端代码或依赖服务。
502 Bad Gateway 网关/代理服务器从上游服务器收到无效响应 使用 Nginx 反向代理时,后端服务崩溃,Nginx 返回 502 常见于微服务架构中下游服务不可用。
503 Service Unavailable 服务不可用(维护或过载) 电商大促时服务器过载,返回 503Retry-After: 3600 头(提示 1 小时后重试)。 可能伴随维护页面或排队系统。

HTTP 状态码 301(永久重定向)和 302(临时重定向)都依赖 Location 选项。以下是关于两者依赖 Location 选项的详细说明:
HTTP 状态码 301(永久重定向):

当服务器返回 HTTP 301 状态码时,表示请求的资源已经被永久移动到新的位置。

在这种情况下,服务器会在响应中添加一个 Location 头部,用于指定资源的新位置。这个Location头部包含了新的 URL 地址,浏览器会自动重定向到该地址。

例如,在 HTTP 响应中,可能会看到类似于以下的头部信息

cpp 复制代码
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\

HTTP 状态码 302 (临时重定向)
当服务器返回 HTTP 302 状态码时,表示请求的资源临时被移动到新的位置。
同样地,服务器也会在响应中添加一个 Location 头部来指定资源的新位置。浏览器会暂时使用新的 URL 进行后续的请求,但不会缓存这个重定向。
例如,在 HTTP 响应中,可能会看到类似于以下的头部信息:

cpp 复制代码
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n

4.HTTP 常见 Header

Content-Type: 数据类型(text/html 等)

Content-Length: Body 的长度

Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;

User-Agent: 声明用户的操作系统和浏览器版本信息;

referer: 当前页面是从哪个页面跳转过来的;

Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;

Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能

关于 connection 报头
HTTP 中的 Connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态

核心作用:

  • 管理持久连接:Connection 字段还用于管理持久连接(也称为长连接)。持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接,以便在同一个连接上发送多个请求和接收多个响应。

  • HTTP/1.1:在 HTTP/1.1 协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复用同一个连接。

  • HTTP/1.0:在 HTTP/1.0 协议中,默认连接是非持久的。如果希望在 HTTP/1.0 上实现持久连接,需要在请求头中显式设置 Connection: keep-alive。
    语法格式:
    Connection: keep-alive:表示希望保持连接以复用 TCP 连接。
    Connection: close:表示请求/响应完成后,应该关闭 TCP 连接。