应用层协议 HTTP 讲解&实战:从0实现HTTP 服务器-二:???? HTTP 协议请求与响应格式

时间:2025-01-24 07:00:32

???? HTTP 请求

在这里插入图片描述

  • 首行: [方法] + [uri] + [版本]
  • Header: 请求报头, 冒号分割的键值对; 每组属性之间使用 \r\n 分隔; 遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度;
    在这里插入图片描述

???? HTTP 响应

在这里插入图片描述

  • 首行: [版本号] + [状态码] + [状态码解释]
  • Header: 响应报头, 冒号分割的键值对;每组属性之间使用 \r\n 分隔;遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.
    在这里插入图片描述

???? HTTP 的方法

在这里插入图片描述
???? 其中最常用的就是 GET 方法和 POST 方法.

  1. GET 方法(重点)
  • 用途: 用于请求 URL 指定的资源。
  • 示例: GET /index.html HTTP/1.1
  • 特性: 指定资源经服务器端解析后返回响应内容。
  • form 表单: https://www.runoob.com/html/html-forms.html
  1. POST 方法(重点)
  • 用途: 用于传输实体的主体, 通常用于提交表单数据。
  • 示例: POST /submit.cgi HTTP/1.1
  • 特性: 可以发送大量的数据给服务器, 并且数据包含在请求体中。
  • form 表单: https://www.runoob.com/html/html-forms.htm
  1. PUT 方法(不常用)
  • 用途: 用于传输文件, 将请求报文主体中的文件保存到请求 URL 指定的位置。
  • 示例: PUT /example.html HTTP/1.1
  • 特性: 不太常用, 但在某些情况下, 如 RESTful API 中, 用于更新资源。
  1. HEAD 方法
  • 用途: 与 GET 方法类似, 但不返回报文主体部分, 仅返回响应头。
  • 示例: HEAD /index.html HTTP/1.1
  • 特性: 用于确认 URL 的有效性及资源更新的日期时间等。
  1. DELETE 方法(不常用)
  • 用途: 用于删除文件, 是 PUT 的相反方法。
  • 示例: DELETE /example.html HTTP/1.1
  • 特性: 按请求 URL 删除指定的资源。
  1. OPTIONS 方法
  • 用途: 用于查询针对请求 URL 指定的资源支持的方法。
  • 示例: OPTIONS * HTTP/1.1
  • 特性: 返回允许的方法, 如 GET、 POST 等。

???? HTTP 的状态码

在这里插入图片描述
???? 最常见的状态码, 比如 200(OK)404(Not Found)403(Forbidden)302(Redirect, 重定向)504(Bad Gateway)

状态码 含义 应用样例
100 Continue 上传大文件时, 服务器告诉客户端可以继续上传
200 OK 访问网站首页, 服务器返回网页内容
201 Created 发布新文章, 服务器返回文章创建成功的信息
204 No Content 删除文章后, 服务器返回“无内容”表示操作成功
301 Moved Permanently 网站换域名后, 自动跳转到新域名; 搜索引擎更新网站链接时使用
302 Found 或 See Other 用户登录成功后, 重定向到用户首页
304 Not Modified 浏览器缓存机制, 对未修改的资源返回304 状态码
400 Bad Request 填写表单时, 格式不正确导致提交失败
401 Unauthorized 访问需要登录的页面时, 未登录或认证失败
403 Forbidden 尝试访问你没有权限查看的页面
404 Not Found 访问不存在的网页链接
500 Internal Server Error 服务器崩溃或数据库错误导致页面无法加载
502 Bad Gateway 使用代理服务器时, 代理服务器无法从上游服务器获取有效响应
503 Service Unavailable 服务器维护或过载, 暂时无法处理请求

???? 以下是仅包含重定向相关状态码的表格

状态码 含义 是否为临时重定向 应用样例
301 Moved Permanently 否(永久重定向) 网站换域名后, 自动跳转到新域名;搜索引擎更新网站链接时使用
302 Found 或 See Other 是(临时重定向) 用户登录成功后,重定向到用户首页
307 Temporary Redirect 是(临时重定向) 临时重定向资源到新的位置(较少使用)
308 Permanent Redirect 否(永久重定向) 永久重定向资源到新的位置(较少使用)

关于重定向的验证, 以 301 为代表:

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

HTTP 状态码 301(永久重定向) :

  • 当服务器返回 HTTP 301 状态码时, 表示请求的资源已经被永久移动到新的位置。
  • 在这种情况下, 服务器会在响应中添加一个 Location 头部, 用于指定资源的新位置。 这个 Location 头部包含了新的 URL 地址, 浏览器会自动重定向到该地址。
  • 例如, 在 HTTP 响应中, 可能会看到类似于以下的头部信息:
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n

HTTP 状态码 302(临时重定向) :

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

???? 总结: 无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。

???? 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 连接

????‍???? 下面附上一张关于 HTTP 常见 header 的表格

字段名 含义 样例
Accept 客户端可接受的响应内容类型 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
AcceptEncoding 客户端支持的数据压缩格式 Accept-Encoding: gzip, deflate, br
AcceptLanguage 客户端可接受的语言类型 Accept-Language: zhCN,zh;q=0.9,en;q=0.8
Host 请求的主机名和端口号 Host: www.example.com:8080
User-Agent 客户端的软件环境信息 User-Agent: Mozilla/5.0 (Windows NT10.0; Win64; x64)AppleWebKit/537.36 (KHTML, likeGecko) Chrome/91.0.4472.124Safari/537.36
Cookie 客户端发送给服务器的 HTTP cookie 信息 Cookie: session_id=abcdefg12345;user_id=123
Referer 请求的来源 URL Referer: http://www.example.com/previous_page.html
Content-Type 实体主体的媒体类型 Content-Type: application/x-wwwform-urlencoded (对于表单提交) 或Content-Type: application/json (对于JSON 数据)
Content-Length 实体主体的字节大小 Content-Length: 150
Authorization 认证信息, 如用户名和密码 Authorization: BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ== (Base64编码后的用户名:密码)
Cache-Control 缓存控制指令 请求时: Cache-Control: no-cache 或Cache-Control: max-age=3600; 响应时:Cache-Control: public, maxage=3600
Connection 请求完后是关闭还是保持连接 Connection: keep-alive 或Connection: close
Date 请求或响应的日期和时间 Date: Wed, 21 Oct 2023 07:28:00 GMT
Location 重定向的目标URL(与 3xx 状态码配合使用) Location:http://www.example.com/new_location.html (与 302 状态码配合使用)
Server 服务器类型 Server: Apache/2.4.41 (Unix)Last-Modified 资源的最后修改时间Last-Modified: Wed, 21 Oct 202307:20:00 GMT
ETag 资源的唯一标识符, 用于缓存 ETag: “3f80f-1b6-5f4e2512a4100”
Expires 响应过期的日期和时间 Expires: Wed, 21 Oct 2023 08:28:00 GMT