概述
超文本传输协议(HTTP, Hypertext Transfer Protocol) 是一种用于传输超媒体文档(例如 HTML)的应用层协议。它最初被设计用于 Web 浏览器与 Web 服务器之间的通信,但也广泛应用于其他客户端与服务器的交互。
HTTP 遵循经典的[客户端-服务器(Client-Server)模型:客户端发起请求,服务器处理并返回响应。HTTP 是一种无状态协议,即服务器在两个请求之间不保留任何状态信息。
特点
- 简单快速:客户端向服务器请求服务时,仅需发送请求方法和路径。常用的方法有 GET、HEAD、POST 等。由于协议本身结构简单,HTTP 服务器实现轻量,通信速度较快。
- 灵活:HTTP 允许传输任意类型的数据,通过
Content-Type
头来标识传输的数据类型。 - 无连接:HTTP 的无连接性指每次请求完成后,客户端与服务器的连接就会断开。这种方式有助于节省服务器资源,提升处理效率。
- 无状态:HTTP 协议本身不记录请求之间的状态信息。如果需要在多个请求之间保留用户状态,通常通过 Cookie、Session、Token 等机制实现。无状态的好处是服务器响应更快,但也带来了开发上的额外工作。
- 支持 B/S 和 C/S 模式:HTTP 既可用于浏览器/服务器(Browser/Server)架构,也适用于客户端/服务器(Client/Server)通信,因而应用广泛。
URL
HTTP 使用统一资源标识符(URI, Uniform Resource Identifier)来标识和定位资源。**URL(Uniform Resource Locator,统一资源定位符)**是 URI 的一种形式,包含了访问某个资源所需的完整信息。
下面通过一个新的 URL 示例来说明其组成部分:
https://example.com:8443/docs/tutorial/index.html?user=alice&lang=zh#section2
这个 URL 可以分为以下几个部分:
- 协议(Scheme):
https
指明使用的协议是 HTTPS,即 HTTP 的加密版本,保障数据的安全性。 - 域名(Host):
example.com
表示服务器的地址,既可以是域名也可以是 IP 地址。 - 端口(Port):
:8443
指定服务器监听的端口号。若省略此部分,将使用协议的默认端口(HTTPS 默认为 443)。 - 路径(Path):
/docs/tutorial/
表示服务器上资源的目录结构,也称为虚拟目录。 - 文件名(File):
index.html
表示请求的具体资源文件,若省略则通常由服务器返回默认首页文件。 - 查询参数(Query):
?user=alice&lang=zh
用于向服务器传递额外信息。多个参数通过&
分隔,键值对之间用=
连接。 - 锚点(Fragment):
#section2
表示页面中的某个位置(例如跳转到 HTML 的某个id
),不会参与服务器通信,仅由前端解析处理。
HTTP 与 HTTPS
概述
HTTP(Hypertext Transfer Protocol,超文本传输协议)
用于从 Web 服务器传输超文本(如 HTML 文件、图片、视频等)到客户端浏览器,是一种基于 TCP/IP 的请求-响应协议,默认端口为 80。
HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)
是 HTTP 的安全版本,在 HTTP 的基础上增加了 SSL/TLS 加密机制,提供数据加密、完整性校验和身份验证,默认端口为 443。
HTTP 工作原理
HTTP 使用“客户端 - 服务器”模型工作:
- 客户端发起请求:浏览器等客户端向服务器发起 HTTP 请求;
- 服务器处理请求:服务器解析请求、读取资源或处理业务逻辑;
- 服务器返回响应:返回 HTML 页面、图片、JSON 数据等内容;
- 客户端渲染页面:浏览器接收响应并渲染出完整页面。
常见的 Web 服务器有:Apache、Nginx、IIS(Internet Information Services) 等。
HTTP 的三个特性:
- 无连接:每次请求/响应后即断开连接;
- 无状态:服务器不保存任何关于客户端的会话状态;
- 媒体独立:只要客户端和服务器能识别 MIME 类型,任何格式的数据都可通过 HTTP 传输。
HTTPS 的作用
HTTPS 通过 SSL/TLS 协议 提供如下安全保障:
- 加密传输:防止数据被第三方窃听;
- 数据完整性:防止传输过程中的数据被篡改;
- 身份验证:确保数据是从真实的服务器发出的。
HTTPS 的信任依赖于操作系统中预装的 CA(证书颁发机构):
- 浏览器需要信任 CA;
- 服务器必须使用有效的证书;
- 证书必须匹配访问的域名;
- 协议加密过程必须完整并有效。
区别总结
对比维度 | HTTP | HTTPS |
---|---|---|
是否加密 | 明文传输 | SSL/TLS 加密传输 |
端口号 | 80 | 443 |
安全性 | 不安全,易被监听或篡改 | 安全,具备加密、认证与完整性校验功能 |
证书要求 | 无需证书 | 需部署 SSL 证书 |
性能 | 较快,无加密开销 | 稍慢,有加解密过程 |
SEO 影响 | 可能被降权 | 更受搜索引擎优待 |
浏览器提示 | 显示“不安全” | 显示“安全锁” |
成本 | 免费 | 需购买或申请 SSL 证书 |
适用场景 | 非敏感信息传输场景(如新闻博客) | 涉及隐私或敏感信息(如电商、登录等) |
请求报文
HTTP 请求报文由三部分组成:
请求行(Request Line)
请求头(Request Header)
请求体(Request Body,可选)
请求报文示例
GET / HTTP/1.1 # 请求方法为GET,请求首页(/),使用HTTP/1.1协议
Host: baidu.com # 指定目标主机(域名)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.6367.60
# 浏览器类型和操作系统信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
# 客户端可接收的内容类型
Accept-Encoding: gzip, deflate, br
# 支持的内容压缩编码方式(节省带宽)
Accept-Language: zh-CN,zh;q=0.9
# 客户端可接受的语言
Connection: keep-alive # 表示使用长连接,保持 TCP 连接不断开
Cookie: BIDUPSID=...; BAIDUID=...; ...
# 携带的 Cookie,用于身份识别、会话保持等
请求行
格式如下:
请求方法 请求资源路径 协议版本
示例:
POST /chapter17/user.html HTTP/1.1
常见请求方法
方法 | 说明 |
---|---|
GET | 请求数据附在 URL 中;不安全,有长度限制;无请求体 |
POST | 数据放在请求体中;适用于表单提交、上传等场景 |
HEAD | 只请求响应头,不返回实体内容 |
PUT | 用于更新或上传资源 |
DELETE | 请求服务器删除资源 |
OPTIONS | 返回服务器支持的请求方法 |
TRACE | 回显服务器收到的请求(用于测试和诊断) |
CONNECT | 用于建立网络隧道(主要用于 HTTPS) |
请求头
请求头用于描述客户端环境和请求内容,常见字段如下:
Header 字段 | 说明 |
---|---|
Host | 请求主机名 |
User-Agent | 客户端软件信息 |
Accept | 可接受的内容类型 |
Content-Type | 请求体数据类型 |
Content-Length | 请求体的字节长度 |
Cookie | 客户端存储的 cookie 数据 |
Referer | 发起请求的源页面地址 |
请求体
请求体通常包含实际发送的数据,仅 POST、PUT 等方法使用。GET 方法没有请求体。
Content-Type 详解
Content-Type 指定了请求体中数据的类型。以下是常见类型说明:
Content-Type | 说明 |
---|---|
text/plain | 纯文本格式 |
text/html | HTML 格式 |
text/css | CSS 格式 |
text/javascript | JavaScript 格式 |
image/gif | GIF 图片 |
image/jpeg | JPEG 图片 |
image/png | PNG 图片 |
application/x-www-form-urlencoded | 表单默认格式,key=value&key2=value2 |
application/json | JSON 格式,常用于 API 请求 |
multipart/form-data | 用于表单上传文件 |
text/xml | 以 XML 格式提交数据 |
application/octet-stream | 任意二进制数据流,如文件下载/上传 |
常见场景 Content-Type 对应关系
场景 | 请求方法 | Content-Type |
---|---|---|
普通表单提交 | POST | application/x-www-form-urlencoded |
上传文件 | POST | multipart/form-data |
提交 JSON 数据 | POST | application/json |
REST 接口 PUT 请求 | PUT | application/json 或其他格式 |
下载文件 | GET | application/octet-stream |
响应报文
HTTP 响应报文由三部分组成:
- 响应行(Status Line)
- 响应头(Response Header)
- 响应体(Response Body)
响应报文示例
HTTP/2 200 OK # 响应协议版本为HTTP/2,状态码200表示请求成功
Server: JSP3/2.0.14 # 服务器软件及版本信息
Date: Fri, 16 May 2025 07:59:09 GMT # 响应生成时间(GMT格式)
Content-Type: text/javascript; charset=utf-8
# 响应内容的类型为JavaScript,字符编码为utf-8
Expires: Mon, 16 Sep 2024 07:12:27 GMT
# 资源过期时间(一般用于缓存)
Last-Modified: Thu, 12 Sep 2024 08:43:04 GMT
# 资源最后修改时间
Etag: "63487d8c50e44137f8b6ce2a04407f8f"
# 资源的唯一标识(方便缓存和验证)
Cache-Control: max-age=31536000
# 缓存控制,表示资源最大缓存时间为31536000秒(1年)
Age: 621073 # 资源在缓存中已经存在的秒数
Accept-Ranges: bytes # 支持客户端的范围请求(断点续传)
Content-Md5: Y0h9jFDkQTf4ts4qBEB/jw==
# 响应内容的MD5校验值(完整性校验)
X-Cache-Status: HIT # 缓存命中,表示资源来自缓存
Timing-Allow-Origin: * # 允许任何源访问资源加载时间数据(用于性能分析)
Access-Control-Allow-Origin: * # 允许跨域访问,任何域都可以访问此资源
// 以下是响应体示例(JavaScript代码)
define("@baidu/aging-tools-pc/dist/index",["san","tslib"],function(n,t){
function e(n){
if(o[n])return o[n].exports;
var t=o[n]={i:n,l:!1,exports:{}};
return i[n].call(t.exports,t,t.exports,e),t.l=!0,t.exports
}
// 省略后续代码
})
响应行
格式如下:
HTTP/协议版本 状态码 状态描述
示例:
HTTP/1.1 200 OK
状态码详解
HTTP 状态码由 3 位数字组成,第一个数字表示响应的类别:
1xx:信息响应(Informational)
- 100 Continue:继续请求
- 101 Switching Protocols:切换协议
2xx:成功(Success)
- 200 OK:请求成功
- 204 No Content:请求成功但无响应体,常用于无需页面刷新的请求
- 206 Partial Content:部分内容响应,用于支持范围请求(Content-Range)
3xx:重定向(Redirection)
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
- 303 See Other:重定向到另一个地址,要求使用 GET 请求
- 307 Temporary Redirect:临时重定向,不会更改请求方法(如 POST 不变)
- 304 Not Modified:资源未修改,使用缓存(与条件请求有关)
4xx:客户端错误(Client Error)
- 400 Bad Request:语法错误,服务器无法理解
- 401 Unauthorized:未授权,需要身份验证(需带 WWW-Authenticate 响应头)
- 403 Forbidden:服务器拒绝请求
- 404 Not Found:请求资源不存在
- 415 Unsupported Media Type:请求类型不支持
5xx:服务器错误(Server Error)
- 500 Internal Server Error:服务器内部错误
- 503 Service Unavailable:服务器暂时无法处理请求
响应头
响应头是由服务器返回的键值对,用于说明响应信息及控制客户端行为。
常见响应头字段
字段名 | 描述 |
---|---|
Location | 重定向地址,需与 3xx 状态码搭配使用 |
Content-Type | 响应体的数据类型,如 text/html;charset=UTF-8 |
Content-Disposition | 文件下载方式,如 attachment;filename=xx.zip |
Set-Cookie | 设置客户端 Cookie |
Content-Encoding | 响应体的压缩方式,如 gzip |
Content-Length | 响应体的字节长度 |
Refresh | 定时刷新页面,如 3;url=http://example.com |
Server | 服务器信息,如 Apache-Coyote/1.1 (可配置) |
Last-Modified | 响应资源的最后修改时间 |
Cache-Control | 缓存控制,如 private 、public 、no-cache 、max-age=秒数 、no-store |
响应体
响应体是服务器真正发送给客户端的“正文”内容,通常为 HTML 页面、JSON 数据、图片或其他资源。
浏览器将响应体加载到内存后,进行解析、渲染并展示页面内容。
参考文章
- http中文文档(https://developer.mozilla.org/zh-CN/docs/Web/HTTP)
- HTTP/HTTPS 简介(https://www.runoob.com/http/http-intro.html)
- Http协议详解(深入理解)(https://blog.csdn.net/weixin_38087538/article/details/82838762)