HTTP协议
版本追踪
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 服务器则在该端口监听客户端的请求。一旦收到请求,服务器会向客户端返回响应
建立链接:由客户端发起,建立一个到服务器指定端口(默认是 80 端口)的 TCP 链接
请求:客户端按照既定格式通过 TCP 将服务器发起请求
响应:服务器监听端口,根据协议处理请求并将处理结果和请求资源通过 TCP 返回到客户端
断开链接:完成响应后服务器主动断开链接,客户端被动断开
本地解析:客户端本地解析并处理资源
1.4 特点
B/S 模式:通信参与者被划分为客户端和服务器,客户端负责发起请求,服务器负责处理请求并响应
无连接:Http 协议默认是无连接通信,其含义是限制每次连接只处理一个请求,服务器每次处理并响应完客户的请求后,即断开连接,采用这种方式可以节省传输中等待的时间(Http 1.1 后可支持持续连接)
无状态:Http 协议是无状态协议,是指协议对于事务处理没有记忆能力,每次传输都是相对独立的,如此可以加快应答速度,但同时缺少状态也意味着如果后续处理需要前面的信息,则必须重传(该问题通过 cookie 解决)
2 报文格式
请求报文和响应报文都遵循固定的格式
- 报文头部
- 请求/状态行
- 请求/响应头
- 请求/响应首部字段 1
- 请求/响应首部字段 2
- 请求/响应首部字段 n
- 空行
- 请求/响应内容
2.1 请求报文
一个 HTTP 请求报文(也称请求消息)由请求行(request line)、请求头(header)、空行和请求数据(也称请求体) 4个部分组成
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 来判断资源的类型
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 | //请求行 |
POST
1 | // 请求行 |
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 :需要在表单中进行文件上传时,就需要使用该格式
完整的响应头示例:
2.2.3 空行
同请求报文空行
2.2.4 响应体
服务器返回给客户端的实际数据。这可以是 HTML 页面、JSON 数据、图片或其他类型的资源。如果服务器返回了一个 HTML 页面,那么页面的内容就会包含在响应体中,返回资源类型取决于响应头的 Content-Type 字段
2.2.5 响应示例
1 | 200 OK |
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







