目录
一、基本概念
二、HTTP报文(结构)
(一) 请求报文
(二) 响应报文
三、HTTP请求方法
1. GET方法
2. POST方法
3. PUT方法
4. HEAD方法
5. DELETE
6. OPTIONS
一、知识扩展
7. TRACE
8. CONNECT
四、HTTP持久通信
(一) HTTP keep-alive
(二) HTTP请求并发
1. 管线化
2. 多路复用
(三) Cookie
1. Cookie的由来
2. Cookie的基本概念
3. Cookie的工作流程
五、HTTP状态码
(一) 常见状态码
六、HTTPS概述
(一) SSL/TLS
一、基本概念
HTTP(超文本传输协议)用于在客户端(如浏览器)和服务器之间传输超文本数据,例如网页、图片、视频等。
- HTTP是一种不保存状态(无状态)协议,即每个请求都是独立的,服务器不会自动保留客户端的前次请求信息。
- 通信方式分为:请求(客户端)和响应(服务器端)
- 请求访问文本或图像等资源的一端称为客户端
- 提供资源响应的一端称为服务器端。
- HTTP协议规定,请求由客户端端发出,服务器响应该请求并返回。
- 客户端请求或访问服务器端资源是通过URL/URI的方式去得到相应的资源
- URI用字符串标识某一互联网资源。
- 如:http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
- 在日常使用中,习惯称为URL。
- URL表示资源的地点(URL是URI的子集)
- 如:http://www.iana.org
- 也可以称之为URI,因为URL是URI的子集。
- URI用字符串标识某一互联网资源。
二、HTTP报文(结构)
用于HTTP协议交互的信息被称为HTTP报文。
- 请求端(客户端)的HTTP报文叫做请求报文
- 响应端(服务器端)的HTTP报文叫做响应报文
- HTTP报文本身由多行数据构成的字符串文本。
HTTP报文分为报文首部和报文主体两部分组成,两者由空行来划分,通常,不一定要有报文主体。
- 报文首部:服务器端或客户端需处理的请求或响应的内容及属性。
- 空行(CR+LF)
- CR:回车符 - 16进制0x0d
- LF: 换行符 - 16进制0x0a
- 报文主体:应被发送的数据。
(一) 请求报文
HTTP 请求报文由客户端(如浏览器)发送到服务器,包含以下三个主要部分:
- 请求行(Request Line)
- 格式:方法 请求目标(URL) HTTP版本
- 说明:指定请求的类型、目标资源和使用的 HTTP 协议版本。
- 示例:GET /index.html HTTP/1.1
- 请求头(Headers)
- 格式:键: 值(每行一个键值对)
- 说明:提供请求的元信息,如主机、用户代理、内容类型等。
- 常见头部
- Host:目标服务器的域名。
- Accept:客户端接受的响应内容类型。
- User-Agent:客户端软件信息。
- 请求体(Body,可选)
- 说明:包含客户端发送给服务器的数据,通常用于 POST、PUT 等请求。
- 注:GET 请求通常没有请求体。
- 示例:表单数据、JSON 数据等。
- 说明:包含客户端发送给服务器的数据,通常用于 POST、PUT 等请求。
- 实例:请求报文
此例中为 GET 请求,没有请求体,因为 GET 请求通常只获取资源,不发送数据。
GET /index.html HTTP/1.1 #请求行
Host: www.example.com #此行到底是请求头
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
(二) 响应报文
- 状态行(Status Line)
- 格式:HTTP版本 状态码 状态消息
- 说明:描述响应的协议版本和处理结果。
- 示例:HTTP/1.1 200 OK
- 响应头部(Headers)
- 格式:键: 值(每行一个键值对)
- 说明:提供响应的元信息,如内容类型、内容长度等。
- 常见头部
- Content-Type:响应体的内容类型。
- Server:服务器软件信息。
- Content-Length:响应体的字节长度。
- 响应体(Body,可选)
- 说明:包含服务器返回的实际数据,如 HTML、JSON、图片等。
- 示例:网页内容、API 返回的 JSON 数据等。
- 实例:响应报文
注:响应头部和响应体之间有一个空行,表示头部信息结束。
HTTP/1.1 200 OK #状态行
Date: Sun, 25 May 2025 17:39:00 GMT #响应头
Server: Apache/2.4.41 (Unix)
Content-Type: text/html; charset=UTF-8
Content-Length: 125
Connection: keep-alive#空行(CR+LF,表示头部信息结束)
<!DOCTYPE html> #响应体
<html>
<head><title>Welcome</title>
</head>
<body><h1>Hello, World!</h1>
</body>
</html>
三、HTTP请求方法
向请求URI指定的资源发送请求报文时,采用称为方法的命令。
方法的作用在于,可以指定请求的资源按期望产生某种行为。
注:方法名区分大小写,要用大写字母。。
1. GET方法
- 功能:从服务器获取资源。用于请求数据而不对数据进行更改。
- 支持的HTTP协议版本:HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3
- 示例:
请求
GET /index.html HTTP/1.1
Host:www.baidu.com响应
返回index.html的页面资源
2. POST方法
- 功能:向服务器发送数据以创建新资源。
- 数据位置:数据包含在请求体中(例如JSON、表单数据)。
- 支持的HTTP版本:HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3
- 示例:
请求:
POST /abc.php HTTP/1.1
Host: www.baidu.com
Content-Length: 1560
Content-Type: application/x-www-form-urlencoded[1560字节的请求体数据]响应:
返回abc.php接收数据的处理结果
3. PUT方法
- 功能:向服务器发送数据以更新现有资源。如果资源不存在,则创建新资源。
- 支持的HTTP协议版本:HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3
- 示例:
请求:
PUT /index.html HTTP/1.1
Host: www.baidu.com
Content-Length: 1560
Content-Type: text/html响应:
返回状态码204 No Content(表示服务器成功处理了请求,但不返回任何响应体)
4. HEAD方法
- 功能:用于确认URI的有效性及资源更新的日期时间等。
- 特征:类似于GET,但只返回响应头部,不返回资源内容
- 支持的HTTP协议版本:HTTP/1.0、HTTP/1.1
- 示例:
HEAD /index.html HTTP/1.1
Host:www.baidu.com响应:
返回index.html有关的响应头
5. DELETE
- 功能:从服务器删除指定的资源。
- 支持的HTTP协议版本:HTTP/1.0、HTTP/1.1
- 示例:
请求:
DELETE /index.html HTTP/1.1
Host: www.baidu.com响应:
返回状态码204 No Content(表示服务器成功处理了请求,但不返回任何响应体)
6. OPTIONS
- 功能:返回服务器支持的 HTTP 方法。
- 支持的HTTP协议版本:HTTP/1.1
- 示例:
请求:
OPTIONS * HTTP/1.1
Host: www.baidu.com响应:
HTTP/1.1 200 OK
Allow:GET,POST,HEAD,OPTIONS
一、知识扩展
如果不是访问特定资源而是对服务器本身发起的请求,可以用 * 来代替请求URI。
7. TRACE
- 功能:回显服务器收到的请求,主要用于诊断。
- 支持的HTTP协议版本:HTTP/1.1
- 示例:
请求:
TRACE /index.html HTTP/1.1
Host: www.baidi.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)响应:
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 145#空行
TRACE /index.html HTTP/1.1 #此行以下都是响应体,体现的是客户端的请求内容。
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
8. CONNECT
- 功能:建立一个到服务器的隧道,通常用于 HTTPS 连接。
- 格式:
- CONNECT 目标服务器:端口 HTTP/1.1
- Host: 目标服务器
- 格式:
- 支持的HTTP协议版本:HTTP/1.1
- 注:代理服务器的地址是通过客户端的网络配置指定的,不写在报文中。
- 如:浏览器中的设置-代理,或是curl 的 --proxy 参数。
- 示例:
请求:
CONNECT www.baidu.com:443 HTTP/1.1
Host: www.baidu.com响应:
HTTP/1.1 200 Connection Established
四、HTTP持久通信
(一) HTTP keep-alive
在 HTTP/1.0 中,每次请求都需要重新建立一次 TCP 连接,请求完成后立即关闭(即短连接)。
每个请求都经历完整的连接流程:
TCP 三次握手 → HTTP 请求/响应 → TCP 四次挥手
假如你要请求三个资源,就得重复三次这样的过程,网络开销大、性能低下。
为了解决这个问题,HTTP/1.1 引入了“持久连接”(HTTP Persistent Connection)。通过一个 TCP 连接,客户端可以连续发送多个 HTTP 请求,直到一方显式关闭连接为止:
TCP 三次握手 → 多次 HTTP 请求/响应→ TCP 四次挥手
持久连接的实现方式如下:
- HTTP/1.1 默认开启持久连接,无需额外设置。
- 请求头中添加:Connection: keep-alive
- 为了兼容旧版本或明确表达意图,可以在请求头中添加
- 如果需要关闭连接,需显式设置:Connection: close
(二) HTTP请求并发
HTTP/1.0并不允许连续多个HTTP请求,默认其是请求-响应完成之后再请求-响应。没有并发。
1. 管线化
HTTP 管线化是 HTTP/1.1 引入的特性,它允许客户端在一个持久连接上,连续发送多个 HTTP 请求,而不必等待前一个响应回来。
Request A → Request B → Request C (连续发)
← Response A ← Response B ← Response C(按顺序回)
- 特征与限制
- 请求可以并发发出去,但响应必须按请求顺序返回。
- 如果前一个响应很慢,会阻塞后续所有响应 —— 这叫队头阻塞(Head-of-line blocking)。
- 如果中间有代理服务器(如老式网关、防火墙)不支持管线化,容易出问题。
- 浏览器(Chrome、Firefox、IE)出于兼容性和稳定性考虑,默认禁用管线化。
- 本质缺点:没有真正实现请求/响应并行处理,只是请求发送的顺序变了,但响应必须串行处理。
2. 多路复用
HTTP/2.0引入了多路复用,它允许多个请求和响应在一个 TCP 连接中完全并行交错地传输,互不阻塞、顺序无关,完全解决了 HTTP/1.1 管线化的所有问题。
- 工作机制:
- HTTP/2 使用二进制格式传输,而不是文本。
- 每个请求/响应被划分成多个帧(Frame),这些帧可以交错混合在一条 TCP 连接上。
- 每个请求/响应流都有一个唯一的 Stream ID,可以并发处理。
- 多路复用和管线化的关键区别:
- 客户端发了 A、B、C 三个请求
- 管线化:
- A 响应慢,B 和 C 响应虽然早就准备好了,但不能先发,只能等 A 完成之后再处理后续请求。
- 多路复用:
- 每个请求有独立的 Stream ID,服务端谁准备好了就先返回。
- 比如:
- 去饭店点了4个菜,这四个菜不按顺序上菜,而是谁先做好谁上(多路复用)。
- 去饭店点了4个菜,即便是后几道菜做好了,也要等着第一个菜上了,再跟着上(管线化)。
(三) Cookie
1. Cookie的由来
假设要求登录认证的Web页面本身无法进行状态的管理,那每次跳转新页面就会出现两张情况:
- 再次登录
- 在每次的请求报文中附加参数来管理登录状态。
由于无状态协议的特点可以减少服务器CPU和内存资源的消耗,所以既要保存无状态这个特征又要解决类似的矛盾所以引进了Cookie技术。
2. Cookie的基本概念
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。
当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
- 本质是浏览器保存的一小段文本信息,随每次请求自动带上。
3. Cookie的工作流程
- 第一次请求网站,服务器返回响应时,设置 Cookie:
Set-Cookie: session_id=abc123; Path=/; Expires=Wed, 01 Jun 2025 00:00:00 GMT
- 浏览器保存这个 Cookie
- 之后请求同站点时,浏览器会自动带上这个 Cookie:
Cookie: session_id=abc123
五、HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果,标记服务器端的处理是否正常、通知出现的错误等工作。
状态码如:200 OK,以3位数字和原因短句组成。
数字中第一位指定了响应类别,后两位无分类。响应类别有以下5种。
类别 | 原因短句 | |
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
(一) 常见状态码
- 200 OK
- 请求成功,服务器已成功处理客户端请求并返回预期内容。
- 204 No Content
- 请求成功,服务器已处理请求,但无内容返回。
- 常用于指示服务器成功执行了请求(如DELETE、PUT),但无需返回数据。
- 301 Moved Permanently
- 永久性重定向
- 请求的资源已永久移动到新URL
- 302 Found
- 临时重定向
- 请求的资源暂时移动到新URL,客户端应继续使用原URL。
- 401 Unauthorized
- 需要认证(如登录)。
- 403 Forbidden
- 服务器理解请求,但拒绝授权访问。
- 404 Not Found
- 服务器无法找到请求的资源。
- 500 Internal Server Error
- 服务器在处理请求时发生内部错误,无法完成请求。
六、HTTPS概述
HTTPS并非是应用层的一种新协议,而是HTTP通信接口部分用SSL和TLS协议代替而已。
- 如:
- HTTP通信流程是:HTTP->TCP。
- HTTPS通信流程是:HTTP->SSL->TCP
- 注:目前SSL已被TLS替代(版本进化更名为TLS)但是由于历史原因,“SSL”这个名字仍常被用来泛指SSL/TLS协议。
(一) SSL/TLS
SSL/TLS(Secure Sockets Layer / Transport Layer Security)是一种安全协议,用于在客户端和服务器之间建立加密连接,以保护数据的机密性和完整性。
- SSL(安全套接字层)
- SSL由Netscape公司在1994年开发,旨在保护Web浏览器与服务器之间的通信。它经历了多个版本(1.0、2.0、3.0),但由于安全漏洞,SSL 3.0是最后一个广泛使用的版本,现已逐渐被淘汰。
- TLS(传输层安全协议)
- TLS是SSL的继任者,由IETF(互联网工程任务组)在1999年发布。TLS 1.0基于SSL 3.0改进,随后推出了:
- TLS 1.1(2006年)
- TLS 1.3(2018年)
- TLS 1.2(2008年)
- TLS是SSL的继任者,由IETF(互联网工程任务组)在1999年发布。TLS 1.0基于SSL 3.0改进,随后推出了: