一、HTTP报文概述
HTTP协议的核心在于客户端(如浏览器)与服务器之间通过交换报文进行通信。这些报文主要分为两类:请求报文(由客户端向服务器发起)和响应报文(由服务器返回给客户端)。
所有HTTP报文都遵循一个统一的基本结构:
- 起始行 - 描述请求或响应的基本信息。
- 头部字段 - 包含零个或多个键值对,每行一个,提供元数据。
- 空行 - 即回车换行符(CRLF),标志着头部域的结束。
- 消息主体 - 可选部分,包含实际传输的数据。
二、HTTP请求报文详解
1. 请求起始行
请求起始行是请求报文的第一行,格式如下:
<方法> <请求目标> <HTTP版本>
- 方法:表示要对资源执行的操作。常见方法包括:
GET:请求获取指定资源。POST:向指定资源提交数据。PUT:替换目标资源的当前表示。DELETE:请求删除指定资源。HEAD:类似GET,但只返回头部。OPTIONS、PATCH等。
- 请求目标:通常是资源的路径,例如
/index.html或/api/users?id=123。 - HTTP版本:如
HTTP/1.1或HTTP/2。
2. 请求头字段
请求头字段传递关于请求和客户端的附加信息。以下是关键的请求头字段分类说明:
| 分类 | 关键字段 | 说明与示例 |
|---|---|---|
| 基础信息 | Host | 请求资源所在的主机名和端口号,HTTP/1.1规范中必须包含。示例:Host: www.example.com:8080 |
User-Agent | 描述发起请求的客户端(如浏览器、应用程序)的信息。示例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 | |
| 内容协商 | Accept | 告知服务器客户端能够处理的响应内容类型(MIME类型)及优先级。示例:Accept: text/html, application/json;q=0.9 |
Accept-Language | 客户端偏好的自然语言。示例:Accept-Language: zh-CN, en;q=0.8 | |
Accept-Encoding | 客户端支持的响应内容压缩编码方式。示例:Accept-Encoding: gzip, deflate | |
| 条件请求 | If-Modified-Since | 如果请求的资源在指定时间后未被修改,则返回304状态码,表示可使用缓存。示例:If-Modified-Since: Tue, 15 Aug 2023 10:30:00 GMT |
If-None-Match | 如果提供的ETag与服务器当前资源的ETag不匹配,才返回完整资源。通常与响应头ETag配合使用。 | |
| 认证与状态 | Authorization | 包含访问受保护资源的凭证。示例:Authorization: Bearer <token> |
Cookie | 将之前由服务器通过Set-Cookie发送的Cookie回传给服务器。 | |
| 请求体相关 | Content-Type | 指定请求消息主体的媒体类型(MIME类型),适用于POST、PUT等方法。示例:Content-Type: application/json |
Content-Length | 指明请求消息主体的长度(字节数)。 |
3. 请求消息主体
对于GET、HEAD等方法,通常没有消息主体。对于POST、PUT等方法,主体包含要发送给服务器的数据,其格式由Content-Type定义。
三、HTTP响应报文详解
1. 响应起始行(状态行)
响应起始行的格式如下:
<HTTP版本> <状态码> <原因短语>
- 状态码:一个三位数字代码,表示请求的处理结果。
- 1xx:信息性状态码,表示请求已接收,继续处理。
- 2xx:成功状态码,表示请求被成功处理。例如
200 OK。 - 3xx:重定向状态码,表示需要进一步操作。例如
301 Moved Permanently(永久重定向),302 Found(临时重定向)。 - 4xx:客户端错误状态码。例如
404 Not Found(请求的资源未找到)。 - 5xx:服务器错误状态码。例如
500 Internal Server Error(服务器内部错误)。
- 原因短语:对状态码的简短文字描述,如
OK,Not Found。
2. 响应头字段
响应头字段允许服务器传递关于响应的附加信息。以下是关键的响应头字段分类说明:
| 分类 | 关键字段 | 说明与示例 |
|---|---|---|
| 服务器信息 | Server | 标识处理请求的服务器软件信息。示例:Server: nginx/1.18.0 |
| 内容相关 | Content-Type | 指明响应消息主体的媒体类型和字符集。示例:Content-Type: text/html; charset=UTF-8 |
Content-Encoding | 指明对响应主体应用的压缩编码。示例:Content-Encoding: gzip | |
Content-Length | 响应消息主体的长度(字节数)。 | |
| 缓存控制 | Cache-Control | 指定请求/响应链中所有缓存机制必须遵守的指令。示例:Cache-Control: public, max-age=3600(缓存1小时) |
Expires | 指定响应的过期日期/时间(较旧的缓存方式)。示例:Expires: Wed, 16 Aug 2023 14:28:00 GMT | |
ETag | 资源的特定版本标识符,用于缓存验证。示例:ETag: "33a64df551425fcc55e4d42a148795d9" | |
Last-Modified | 资源最后修改的日期/时间,用于缓存验证。 | |
| 会话与安全 | Set-Cookie | 由服务器发送,指示客户端存储一个或多个cookie。可设置安全属性如HttpOnly、Secure。示例:Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure |
Strict-Transport-Security | 强制使用HTTPS访问(HSTS策略)。示例:Strict-Transport-Security: max-age=31536000; includeSubDomains | |
| 特殊功能 | Location | 在3xx重定向响应中指定客户端应转向的URL。示例:Location: https://www.example.com/new-page |
| CORS | Access-Control-Allow-Origin | 指定哪些源(域)可以访问该资源。示例:Access-Control-Allow-Origin: *(允许所有源)或 Access-Control-Allow-Origin: https://trusted.com |
3. 响应消息主体
包含服务器返回的实际数据,如HTML内容、JSON数据等。其格式由Content-Type指明。
四、通用头字段
有些头字段既可用于请求消息,也可用于响应消息,称为通用头字段。
Cache-Control:控制缓存行为。Connection:管理连接,如keep-alive(保持连接)或close(关闭连接)。Date:报文创建的日期和时间。Pragma:历史遗留字段,通常设置为no-cache,与Cache-Control: no-cache功能类似。Transfer-Encoding:指定传输编码方式,如chunked(分块传输)。
五、完整报文示例
一个完整的HTTP请求示例(POST JSON数据):
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 49
User-Agent: Mozilla/5.0 (compatible; MyApp/1.0)
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{"name": "Alice", "email": "alice@example.com"}
一个完整的HTTP响应示例(成功返回HTML):
HTTP/1.1 200 OK
Date: Tue, 15 Aug 2023 14:28:00 GMT
Server: Apache/2.4.41
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Cache-Control: max-age=3600
Connection: keep-alive
<!DOCTYPE html>
<html>
<head><title>Example Page</title></head>
<body><h1>Hello, World!</h1></body>
</html>
六、查看与调试HTTP头部
- 浏览器开发者工具:按F12打开,在"Network"(网络)标签页中,点击某个请求即可查看其详细的请求头(Request Headers)和响应头(Response Headers)。
- 命令行工具(如cURL):使用
curl -I URL可以获取资源的响应头。使用curl -v URL可以查看更详细的请求和响应信息。 - 抓包工具:使用Wireshark、Fiddler等专业工具可以捕获和分析网络层面的HTTP报文。
七、核心要点总结
- 结构统一:请求和响应报文都遵循
起始行 -> 头部 -> 空行 -> [主体]的结构,空行至关重要,严格分隔头部和主体。 - 头部是元数据:头部字段提供了关于报文或所传输主体的关键元信息,不包含应用数据本身。
- 内容协商:通过
Accept*系列请求头与Content-*系列响应头配合,实现客户端与服务器就内容类型、语言、编码等进行协商。 - 缓存机制:通过
Cache-Control、ETag、Last-Modified等头部字段共同管理缓存,提升性能。 - 连接管理:
Connection头字段影响TCP连接在请求/响应后的行为(保持或关闭),影响性能。 - 状态与安全:通过
Cookie/Set-Cookie、Authorization等处理会话状态和认证。通过CORS相关头部处理跨域资源共享。
理解HTTP请求头和响应头的结构与含义,是进行Web开发、API调试、性能优化和安全配置的基础。希望这篇教程能为您提供清晰的指引。
951

被折叠的 条评论
为什么被折叠?



