版本追踪

2025.1.19:初版


1 概述

1.1 概念

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)

  • 超文本:可以传递文本,图片,影像,html 文件等各类数据

  • 传输协议:Http 是应用层通信协议(通常基于 TCP),规定了通信参与者的工作流程,格式规范等

Http 对下层协议并无强制规定,理论上 Http 可以运行在任何可以提供传输的网络上

1.2 协议版本

Http 已演化出多代版本,其中大部分支持向下兼容

  • HTTP/0.9
  • HTTP/1.0
  • HTTP/1.1
  • HTTP/2
  • HTTP/3

1.3 工作流程

通常,HTTP 客户端发起请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在该端口监听客户端的请求。一旦收到请求,服务器会向客户端返回响应

  1. 建立链接:由客户端发起,建立一个到服务器指定端口(默认是 80 端口)的 TCP 链接

  2. 请求:客户端按照既定格式通过 TCP 将服务器发起请求

  3. 响应:服务器监听端口,根据协议处理请求并将处理结果和请求资源通过 TCP 返回到客户端

  4. 断开链接:完成响应后服务器主动断开链接,客户端被动断开

  5. 本地解析:客户端本地解析并处理资源

1.4 特点

B/S 模式:通信参与者被划分为客户端和服务器,客户端负责发起请求,服务器负责处理请求并响应
无连接:Http 协议默认是无连接通信,其含义是限制每次连接只处理一个请求,服务器每次处理并响应完客户的请求后,即断开连接,采用这种方式可以节省传输中等待的时间(Http 1.1 后可支持持续连接)
无状态:Http 协议是无状态协议,是指协议对于事务处理没有记忆能力,每次传输都是相对独立的,如此可以加快应答速度,但同时缺少状态也意味着如果后续处理需要前面的信息,则必须重传(该问题通过 cookie 解决)

2 报文格式

请求报文和响应报文都遵循固定的格式

  • 报文头部
    • 请求/状态行
    • 请求/响应头
      • 请求/响应首部字段 1
      • 请求/响应首部字段 2
      • 请求/响应首部字段 n
  • 空行
  • 请求/响应内容

2.1 请求报文

一个 HTTP 请求报文(也称请求消息)由请求行(request line)、请求头(header)、空行和请求数据(也称请求体) 4个部分组成

image.png

2.1.1 请求行

请求行(也称请求起始行)由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

请求行格式如下:Method 空格 Request-URI 空格 HTTP-Version CRLF

Method 表示请求方法;
Request-URl 表示一个统一资源标识符;
HTTP-Version 表示请求的 HTTP 协议版本;
CRLF 表示回车和换行;

例如,GET /index.html HTTP/1.1

Http 协议规定了多种请求方法:

  • HTTP1.0定义了三种请求方法: GET,POST 和 HEAD 方法。

  • HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报文头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有的资源的修改
4 PUT 从客户端向服务器床送的数据取代指定的文档的内容
5 DELETE 请求服务器删除指定的页面
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
7 OPTIONS 允许客户端查看服务器的性能
8 TRACE 回显服务器收到的请求,主要用于测试和诊断

2.1.2 请求头

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号:分隔。请求头部通知服务器有关于客户端请求的信息

请求头是以 key: value 的形式现示的。每一个报头域(报头域包括请求头和响应头)都是由名字++空格+组成,消息报头域的名字是大小写无关的。

请求头里保存的是请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示请求头部分结束。

典型的请求头有:

Content-Type: 数据类型( text/html 等)
Content-Length: 请求体 Body 的长度
User-Agent:产生请求的浏览器类型,声明用户的操作系统和浏览器版本信息
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机,客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
referer: 当前页面是从哪个页面跳转过来的
location: 搭配 3xx 状态码使用,告诉客户端接下来要去哪里访问
Cookie: 用于在客户端存储少量信息,通常用于实现会话(session)的功能

注:浏览器不是根据资源的 url 后缀判断资源的类型,而是通过 Content-Type 来判断资源的类型

1737272272028.png

2.1.3 空行

一个空行指示所有关于请求的元数据已经发送完毕,即空行标志着请求头的结束,也标志着请求体的开始。空行可以用\r\n书写。

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头

2.1.4 请求体

请求体可为空字符串(在 GET 方法中请求体为空,相关参数已经包含在 URL 中)。如果请求体存在, 则在请求头中会有一个 Content-Length 属性来标识请求体 Body 的长度

2.1.5 URL

统一资源标识( Uniform Resource Locator,简称 URL )

URL 的一般语法格式为:protocol :// hostname[:port] / path / [:parameters][?query] (其中带方括号的为可选项)

protocol:指定传输协议

file 资源是本地计算机上的文件。格式 file:///,注意后边应是三个斜杠
ftp 通过 FTP 访问资源。格式 FTP://
gopher 通过 Gopher 协议访问该资源。
http 通过 HTTP 访问该资源。 格式 HTTP://
https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://
mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:
MMS 通过 支持 MMS(流媒体协议的播放该资源。(代表软件:Windows Media Player)格式 MMS://
ed2k 通过 支持 ed2k(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:电驴 格式 ed2k://
Flashget 通过 支持 Flashget:(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:快车) 格式 Flashget://
t> hunder 通过 支持 thunder(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:迅雷格式 thunder://
news 通过 NNTP 访问该资源

hostname:主机名,用于定位资源所属服务器,形式常为域名或 IP 地址,也可在主机名前包含登录主机所需的账户和密码,如 username[:password]@hostname

port(可省略):端口号,用于配合主机名定位服务器上提供资源服务的进程,因此端口号必不可少。而可省略是因为省略情况下各个协议会将自动将 port 字段补全为协议的默认端口(Http 默认为 80)

path:由多个 / 符号隔开的字符串,一般用来表示主机上的一个目录或文件地址,如 http://hjjjjj.top/tags/ 表示主机的 /tags 目录下的资源

parameters:参数,用于指定特殊参数的可选项,有服务器端程序自行解释。

query:查询,用于在请求过程中给服务器(一般是动态网页的后端)传递参数,可有多个参数,用 & 符号隔开,每个参数的名和值用等号隔开。如 http://hjjjjj.top/posts/20241020.html?highlight=供电

为什么域名访问时省略端口号却可以访问到除默认以外的其他端口?
域名解析为公网 IP 时可将域名映射到 IP: Port 的格式,详见 [[域名解析]]

2.1.6 请求示例

GET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//请求行
GET /hello/index.jsp HTTP/1.1

//请求头信息,因为GET请求没有正文
Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

//空行

//因为GET没有正文,所以下面为空

POST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 请求行
POST /hello/index.jsp HTTP/1.1

//请求头信息
Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Referer: http://localhost/hello/index.jsp

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

Content-Type: application/x-www-form-urlencoded

Content-Length: 14

// 这里是空行

//POST有请求正文

username=hello

2.2 响应报文

Http 响应报文也由四个部分构成:状态行,响应头,空行,响应体

2.2.1 状态行

响应报文的状态行与请求行的区别在于将请求方法更换为状态码,格式如下:

HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF

HTTP-Version:表示服务器 Http 协议的版本,不一定与客户端 Http 版本一致
Status-Code:响应状态码,用于识别服务器的响应状态,状态码在后文中详细说明
Reason-Phrase:和 Status-Code 都用于识别服务器响应状态。区别在于 Status-Code 用于客户端机器自动识别,Reason-Phrase 便于人工理解

状态行示例:HTTP/1.1 200 OK

2.2.2 响应头

格式同请求报文的请求头,常用的响应头如下:

字段名 作用
Accept-Ranges 服务器用来表示自身支持的范围请求
Server 这个字段描述了服务器的信息,如服务器的软件名称和版本
Content-Type 这个字段告诉客户端响应体的媒体类型。例如,对于HTML文档,它可能是text/html;对于JPEG图像,它可能是image/jpeg
Content-Length 这个字段表示响应体的长度,以字节为单位。它有助于客户端知道响应体的大小,以便正确地接收和解析数据
Content-Encoding 这个字段描述了响应体使用的内容编码。常见的编码类型包括gzip和deflate,它们用于压缩数据以减少传输大小
Cache-Control 这个字段用于指定缓存指令,控制响应内容在客户端、代理服务器或其他中间缓存中的缓存行为
Expires 这个字段提供了一个日期和时间,表示响应内容在何时过期。之后,缓存的响应不应再被使用,直到从服务器获取新的响应
ETag 这是一个由服务器生成的唯一标识符,用于标识资源的特定版本。当资源内容发生变化时,ETag也会变化。它常用于条件请求(如使用If-None-Match字段)来检查资源是否已修改
Last-Modified 告诉客户端资源的最后修改时间,配合请求头中的 if-modified-since 字段
Set-Cookie 这个字段用于设置HTTP cookie,这些 cookie 随后会由浏览器发送回服务器,以便进行会话跟踪或个性化设置
Location 在某些情况下,如重定向,这个字段提供了资源的替代位置。当状态码为 3xx 时,这个字段特别有用
Connection 这个字段控制是否保持网络连接。例如,Connection: keep-alive表示连接应保持打开状态,以便后续请求可以在同一连接上发送

对于 Content-Type 字段,常见的内容类型如下:

text/html : HTML 格式
text/plain :纯文本格式
text/xml : XML 格式
image/gif :gif 图片格式
image/jpeg :jpg 图片格式
image/png:png 图片格式

以 application 开头的媒体格式类型:

application/xhtml+xml :XHTML 格式
application/xml: XML 数据格式
application/atom+xml :Atom XML 聚合格式
application/json: JSON 数据格式
application/pdf:pdf 格式
application/msword : Word 文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x- www-form-urlencoded : <form encType=""> 中默认的 encType,form 表单数据被编码为 key/value 格式发送到服务器(表单默认的提交数据的格式)

用于 POST 方法的数据格式:

multipart/form-data :需要在表单中进行文件上传时,就需要使用该格式

完整的响应头示例:

1737280749906.png

2.2.3 空行

同请求报文空行

2.2.4 响应体

服务器返回给客户端的实际数据。这可以是 HTML 页面、JSON 数据、图片或其他类型的资源。如果服务器返回了一个 HTML 页面,那么页面的内容就会包含在响应体中,返回资源类型取决于响应头的 Content-Type 字段

2.2.5 响应示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HTTP/1.1 200 OK  
Server: nginx/1.19.2
Date: Tue, 17 Aug 2023 12:34:56 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 12345
Connection: keep-alive
Last-Modified: Mon, 16 Aug 2023 11:22:33 GMT
ETag: "abcdef123456"
Cache-Control: max-age=3600
Set-Cookie: session_id=1234567890abcdef; expires=Wed, 17 Sep 2023 12:34:56 GMT; path=/; HttpOnly

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example Page</title>
</head>
<body>
<h1>Welcome to the Example Page!</h1>
<p>This is an example of an HTTP response body.</p>
</body>
</html>

2.3 状态码

状态码的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况

2.3.1 1xx :信息

消息 描述
100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。

2.3.2 2xx :成功

消息 描述
200 OK 请求成功(其后是对GET和POST请求的应答文档。)
201 Created 请求被创建完成,同时新的资源被创建。
202 Accepted 供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。

2.3.3 3xx :重定向

消息 描述
300 Multiple Choices 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。
301 Moved Permanently 所请求的页面已经转移至新的url。
302 Found 所请求的页面已经临时转移至新的url。
303 See Other 所请求的页面可在别的url下被找到。
304 Not Modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。
306 Unused 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。
307 Temporary Redirect 被请求的页面已经临时移至新的url。

2.3.4 4xx :客户端错误

消息 描述
400 Bad Request 服务器未能理解请求。
401 Unauthorized 被请求的页面需要用户名和密码。
401.1 登录失败。
401.2 服务器配置导致登录失败。
401.3 由于ACL对资源的限制而未获得授权。
401.4 筛选器授权失败。
401.5 ISAPI/CGI应用程序授权失败。
401.7 访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS 6.0所专用。
402 Payment Required 此代码尚无法使用。
403 Forbidden 对被请求页面的访问被禁止。
403.1 执行访问被禁止。
403.2 读访问被禁止。
403.3 写访问被禁止。
403.4 要求SSL。
403.5 要求SSL 128。
403.6 IP地址被拒绝。
403.7 要求客户端证书。
403.8 站点访问被拒绝。
403.9 用户数过多。
403.10 配置无效。
403.11 密码更改。
403.12 拒绝访问映射表。
403.13 客户端证书被吊销。
403.14 拒绝目录列表。
403.15 超出客户端访问许可。
403.16 客户端证书不受信任或无效。
403.17 客户端证书已过期或尚未生效。
403.18 在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS 6.0所专用。
403.19 不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS 6.0所专用。
403.20 Passport登录失败。这个错误代码为IIS 6.0所专用。
404 Not Found 服务器无法找到被请求的页面。
404.0 (无)–没有找到文件或目录。
404.1 无法在所请求的端口上访问Web站点。
404.2 Web服务扩展锁定策略阻止本请求。
404.3 MIME映射策略阻止本请求。
405 Method Not Allowed 请求中指定的方法不被允许。
406 Not Acceptable 服务器生成的响应无法被客户端所接受。
407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。
408 Request Timeout 请求超出了服务器的等待时间。
409 Conflict 由于冲突,请求无法被完成。
410 Gone 被请求的页面不可用。
411 Length Required “Content-Length”未被定义。如果无此内容,服务器不会接受请求。
412 Precondition Failed 请求中的前提条件被服务器评估为失败。
413 Request Entity Too Large 由于所请求的实体的太大,服务器不会接受请求。
414 Request-url Too Long 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。
415 Unsupported Media Type 由于媒介类型不被支持,服务器不会接受请求。
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。
417 Expectation Failed 执行失败。
423 锁定的错误。

2.3.5 5xx :服务器错误

消息 描述
500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。
500.12 应用程序正忙于在Web服务器上重新启动。
500.13 Web服务器太忙。
500.15 不允许直接请求Global.asa。
500.16 UNC授权凭据不正确。这个错误代码为IIS 6.0所专用。
500.18 URL授权存储不能打开。这个错误代码为IIS 6.0所专用。
500.100 内部ASP错误。
501 Not Implemented 请求未完成。服务器不支持所请求的功能。
502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。
502.1 CGI应用程序超时。
502.2 CGI应用程序出错。
503 Service Unavailable 请求未完成。服务器临时过载或宕机。
504 Gateway Timeout 网关超时。
505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP版本。

3 Cookie

4 与 HTTPS 区别

#通信协议
#HTTP
#Web