目录
1. HTTP 概述
HTTP(HyperText Transfer Protocol)是一种应用层协议,用于分布式、协作式和超媒体信息系统的应用。它是万维网(WWW)数据通信的基础。HTTP 协议定义了客户端(如浏览器)如何向服务器请求资源(如网页、图片),以及服务器如何响应这些请求。
- 无状态协议:HTTP 本身是无状态的,意味着服务器不会在不同请求之间保留任何状态信息。为了维持状态(如用户登录信息),通常使用 Cookie 或 Session 等技术。
- 请求/响应模型:通信总是由客户端发起一个请求开始,服务器返回一个响应结束。
- 基于 TCP/IP:HTTP 通常运行在 TCP/IP 协议栈之上。默认端口是 80(HTTP)和 443(HTTPS)。
- 客户端/服务器模型:客户端发起请求,服务器提供响应。
2. URL(统一资源定位符)
URL 用于指定 Web 上资源的位置。一个典型的 URL 结构如下:
http://www.example.com:80/path/to/resource?name=value&name2=value2#fragment
- 协议 (Scheme):
http://或https://。 - 主机名 (Host):
www.example.com,服务器的域名或 IP 地址。 - 端口 (Port):
:80,可选,默认是协议对应的标准端口(HTTP:80, HTTPS:443)。 - 路径 (Path):
/path/to/resource,指定服务器上的资源路径。 - 查询字符串 (Query String):
?name=value&name2=value2,可选,用于向服务器传递额外参数。 - 片段标识符 (Fragment):
#fragment,可选,通常用于定位页面内的特定部分。
3. HTTP 请求 (Request)
客户端向服务器发送 HTTP 请求报文。一个请求报文通常包含以下部分:
- 请求行 (Request Line):
- 请求方法 (Method):如
GET,POST,PUT,DELETE等。 - 请求目标 (URI):如
/index.html。 - HTTP 版本:如
HTTP/1.1或HTTP/2。 - 示例:
GET /index.html HTTP/1.1
- 请求方法 (Method):如
- 请求头部 (Headers):包含关于请求的附加信息,键值对形式。常见头部:
Host: www.example.com:目标主机名(必需)。User-Agent: Mozilla/5.0 ...:客户端软件信息。Accept: text/html,application/xhtml+xml,...:客户端可接受的响应内容类型。Accept-Language: zh-CN,zh;q=0.9:客户端偏好的语言。Cookie: name=value:发送给服务器的 Cookie。Content-Type: application/x-www-form-urlencoded:请求体内容的类型(常用于POST)。Content-Length: 348:请求体的长度(字节)。Authorization: Basic dXNlcjpwYXNz:身份验证凭证。
- 空行 (CRLF):头部结束后有一个空行(回车换行)。
- 请求体 (Body):可选。用于
POST,PUT等方法,包含要发送给服务器的数据(如表单数据、JSON、XML)。
4. HTTP 响应 (Response)
服务器收到请求后,发送 HTTP 响应报文。一个响应报文通常包含以下部分:
- 状态行 (Status Line):
- HTTP 版本:如
HTTP/1.1。 - 状态码 (Status Code):三位数字,表示请求处理结果。
- 原因短语 (Reason Phrase):状态码的文本描述。
- 示例:
HTTP/1.1 200 OK
- HTTP 版本:如
- 响应头部 (Headers):包含关于响应的附加信息,键值对形式。常见头部:
Server: Apache/2.4.1:服务器软件信息。Date: Tue, 15 Nov 2022 08:12:31 GMT:响应生成的日期和时间。Content-Type: text/html; charset=UTF-8:响应体的内容类型和字符集。Content-Length: 348:响应体的长度(字节)。Set-Cookie: name=value; expires=...:服务器设置的 Cookie。Location: https://www.example.com/newpage:重定向目标地址(常用于3xx状态码)。Cache-Control: max-age=3600:缓存控制指令。
- 空行 (CRLF):头部结束后有一个空行(回车换行)。
- 响应体 (Body):可选。包含服务器返回给客户端的实际数据(如 HTML 页面、图片、JSON 数据)。
5. HTTP 方法 (Methods)
定义了要对资源执行的操作类型:
GET:请求指定的资源。主要用于获取数据,不应该有副作用(幂等)。POST:向指定资源提交数据进行处理(如提交表单、上传文件)。通常会产生副作用或服务器状态变化。PUT:用请求中的有效载荷替换目标资源的所有当前表示(更新或创建)。DELETE:删除指定的资源。HEAD:与GET类似,但只请求资源的头部信息(不返回响应体),用于检查资源是否存在或获取元数据。OPTIONS:查询服务器支持的 HTTP 方法或通信选项。PATCH:对资源进行部分修改。CONNECT:建立隧道连接(用于 HTTPS 代理)。TRACE:回显收到的请求(用于诊断)。
6. HTTP 状态码 (Status Codes)
状态码指示请求的处理结果,分为五类:
1xx(信息性):接收的请求正在处理。100 Continue:客户端应继续发送请求的剩余部分。101 Switching Protocols:服务器同意切换协议(如升级到 WebSocket)。
2xx(成功):请求被成功接收、理解、接受。200 OK:请求成功。GET 返回资源,POST 返回操作结果。201 Created:请求成功并在服务器创建了新的资源(常用于POST/PUT)。204 No Content:服务器成功处理了请求,但不需要返回任何实体内容。206 Partial Content:服务器成功处理了部分GET请求(用于断点续传)。
3xx(重定向):需要客户端采取进一步的操作来完成请求。301 Moved Permanently:请求的资源已永久移动到新位置(浏览器会缓存)。302 Found(或303 See Other):请求的资源临时从不同 URI 响应(浏览器不会缓存)。304 Not Modified:资源未修改,可使用缓存的版本(用于条件请求)。307 Temporary Redirect:类似302,但要求使用相同的 HTTP 方法重定向。308 Permanent Redirect:类似301,但要求使用相同的 HTTP 方法重定向。
4xx(客户端错误):请求包含语法错误或无法完成。400 Bad Request:服务器无法理解请求(语法错误)。401 Unauthorized:请求需要身份验证。403 Forbidden:服务器理解请求但拒绝执行(无权限)。404 Not Found:服务器找不到请求的资源。405 Method Not Allowed:请求方法不被目标资源支持。408 Request Timeout:服务器等待请求超时。429 Too Many Requests:客户端发送过多请求(限流)。
5xx(服务器错误):服务器处理请求失败。500 Internal Server Error:服务器内部错误(通用错误)。501 Not Implemented:服务器不支持完成请求所需的功能。502 Bad Gateway:作为网关或代理的服务器,从上游服务器收到无效响应。503 Service Unavailable:服务器暂时不可用(过载或维护)。504 Gateway Timeout:作为网关或代理的服务器,未能及时从上游服务器收到响应。
7. HTTP 头部 (Headers)
HTTP 头部传递请求和响应的元数据。它们可以出现在请求和响应中(有些是专用的)。
- 通用头部 (General Headers):可用于请求和响应。
Cache-Control:指定缓存指令(如max-age,no-cache,no-store)。Connection:控制连接选项(如keep-alive,close)。Date:报文创建时间。Pragma:遗留的缓存控制(如no-cache)。Trailer:表示报文尾部包含哪些头部。Transfer-Encoding:指定传输编码(如chunked)。Upgrade:请求切换到另一个协议。Via:追踪代理路径。Warning:关于报文状态的警告信息。
- 请求头部 (Request Headers):仅用于请求。
Accept:客户端可接受的响应内容类型(MIME 类型)。Accept-Charset:客户端可接受的字符集(如utf-8)。Accept-Encoding:客户端可接受的内容编码(如gzip,deflate)。Accept-Language:客户端偏好的语言(如zh-CN)。Authorization:身份验证凭证(如Basic,Bearer)。Cookie:发送给服务器的 Cookie。Expect:客户端期望服务器满足的特定行为。From:用户代理用户的电子邮件地址(不常用)。Host:目标服务器的主机名和端口(必需)。If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since:条件请求。Max-Forwards:限制请求经过的代理或网关数量(用于TRACE)。Proxy-Authorization:用于代理服务器的身份验证。Range:请求部分内容(用于断点续传)。Referer:发起请求的页面的 URL。TE:客户端可接受的传输编码扩展。User-Agent:客户端软件信息。
- 响应头部 (Response Headers):仅用于响应。
Accept-Ranges:服务器支持的范围请求(如bytes)。Age:从原始服务器生成响应起经过的时间(秒)。ETag:资源的特定版本标识符(用于缓存验证)。Location:重定向目标地址(用于3xx状态码)。Proxy-Authenticate:代理服务器要求的身份验证方式。Retry-After:客户端应多久后重试(用于503或429)。Server:服务器软件信息。Set-Cookie:服务器设置的 Cookie。Vary:指示根据哪些请求头部来缓存不同的响应版本。WWW-Authenticate:服务器要求的身份验证方式(用于401)。
- 实体头部 (Entity Headers):描述请求或响应体中内容的元数据(可用于请求和响应)。
Allow:资源支持的 HTTP 方法(用于405响应)。Content-Encoding:内容使用的编码(如gzip)。Content-Language:内容使用的语言(如zh-CN)。Content-Length:内容长度(字节)。Content-Location:内容的实际位置(可能与请求的 URI 不同)。Content-MD5:内容的 MD5 摘要(用于校验)。Content-Range:部分内容在整个资源中的位置(用于206响应)。Content-Type:内容的媒体类型(MIME 类型,如text/html; charset=UTF-8)。Expires:响应过期的日期/时间。Last-Modified:资源最后修改的日期/时间。
8. HTTP 连接管理
- 短连接 (HTTP/1.0 默认):每个请求/响应后关闭 TCP 连接。开销大。
- 持久连接 / Keep-Alive (HTTP/1.1 默认):在同一个 TCP 连接上发送多个请求/响应。通过
Connection: keep-alive头部启用(在 HTTP/1.1 中是隐式的)。服务器可能会设置Keep-Alive: timeout=5, max=100头部来指定空闲超时和最大请求数。 - 管道化 (Pipelining):允许客户端在收到上一个响应之前发送多个请求(理论上提高效率,但实践中问题多,很少使用)。
- HTTP/2:使用二进制分帧、多路复用、头部压缩、服务器推送等特性显著提升性能和效率。在单个 TCP 连接上并行处理多个请求和响应。
- HTTP/3:基于 QUIC 协议(UDP),解决 TCP 队头阻塞问题,提供更快的连接建立和更好的移动网络性能。
9. 安全传输 (HTTPS)
HTTPS(HTTP Secure)是 HTTP 协议的安全版本。它在 HTTP 和 TCP 之间增加了 TLS(Transport Layer Security)或 SSL(Secure Sockets Layer)协议层,提供:
- 加密 (Encryption):防止窃听,保护数据隐私。
- 数据完整性 (Data Integrity):防止数据在传输中被篡改。
- 身份认证 (Authentication):通过数字证书验证服务器(有时也验证客户端)的身份,防止中间人攻击。
$$ \text{HTTP} + \text{TLS/SSL} = \text{HTTPS} $$
访问 HTTPS 网站时,浏览器地址栏通常显示锁图标。证书由受信任的证书颁发机构(CA)签发。
10. 实际操作与工具
- 浏览器开发者工具 (Network Tab):查看浏览器发出的 HTTP 请求和接收的响应(方法、URL、状态码、头部、时间线、响应体预览)。
- 命令行工具:
curl -v http://example.com:详细输出请求和响应信息。telnet example.com 80:手动输入 HTTP 请求(按回车两次发送)。
- API 测试工具:如 Postman、Insomnia,用于构建和发送复杂的 HTTP 请求(设置方法、头部、Body),查看响应。
- 编程语言 HTTP 客户端库:如 Python 的
requests, Java 的HttpClient, JavaScript 的fetchAPI 或axios。
# Python 使用 requests 库发送 GET 请求示例
import requests
response = requests.get('https://api.example.com/data', params={'key': 'value'}, headers={'Authorization': 'Bearer token'})
print(response.status_code) # 打印状态码
print(response.headers) # 打印响应头部
print(response.text) # 打印响应体文本
print(response.json()) # 如果响应是 JSON,解析为字典
# Python 使用 requests 库发送 POST 请求示例
import requests
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://api.example.com/login', data=data)
# 或者发送 JSON
# response = requests.post('https://api.example.com/login', json=data)
print(response.status_code)
print(response.json())
总结
HTTP 是 Web 的核心通信协议。理解其工作原理(请求/响应模型、方法、状态码、头部)、连接管理机制以及安全版本 HTTPS,对于 Web 开发、API 设计、网络调试和性能优化都至关重要。熟练使用浏览器开发者工具或命令行/API 测试工具观察和分析 HTTP 流量是掌握该协议的有效途径。
1万+

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



