HTTP 超文本传输协议
2026/7/19大约 5 分钟通信协议网络协议HTTPWebREST
HTTP 超文本传输协议
一、概述
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广的应用层协议,基于请求/响应模型,运行在 TCP 之上。浏览器访问网页、设备对接 REST API、云平台上报数据,本质都是 HTTP 交互。
一句话核心:客户端(Client)向服务器(Server)发一个请求(方法 + URL + 头 + 体),服务器处理并回一个响应(状态码 + 头 + 体)——一问一答,无状态。
二、请求/响应模型
客户端 服务器
── HTTP请求 ─────────────►
(方法+URL+头+体)
◄─ HTTP响应 ──────────────
(状态码+头+体)HTTP 是无状态:服务器不记忆两次请求之间的关系,每次请求独立处理(状态靠 Cookie/Token 维持)。
三、URL 结构
http://www.example.com:8080/path/to/page?name=value#frag
└┬─┘ └───┬────────┘└┬┘└────┬───────┘└────┬─────┘└───┘
scheme host port path query fragment| 部分 | 说明 |
|---|---|
| scheme | 协议(http/https) |
| host | 主机名或 IP |
| port | 端口(http 默认 80,https 默认 443) |
| path | 资源路径 |
| query | 查询参数(?k=v&k2=v2) |
| fragment | 片段标识(不发给服务器) |
四、HTTP 请求报文
请求行: 方法 SP URL SP 版本 CRLF
请求头: 头名: 值 CRLF
... (多行)
空行 CRLF
请求体: 可选例:GET 请求
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive例:POST 请求(带表单体)
POST /api/login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
username=alice&password=123456五、HTTP 请求方法
| 方法 | 语义 | 幂等 | 典型场景 |
|---|---|---|---|
| GET | 获取资源 | 是 | 查询/下载 |
| POST | 创建资源/提交 | 否 | 提交表单、上传 |
| PUT | 更新资源 | 是 | 覆盖更新 |
| DELETE | 删除资源 | 是 | 删除 |
| HEAD | 只取响应头 | 是 | 检查资源存在 |
| OPTIONS | 询问支持的方法 | 是 | CORS 预检 |
| PATCH | 部分更新 | 否 | 局部修改 |
幂等:重复执行结果相同(GET/PUT/DELETE 幂等,POST 不幂等)。
六、HTTP 响应报文
状态行: 版本 SP 状态码 SP 原因短语 CRLF
响应头: 头名: 值 CRLF
空行 CRLF
响应体: 可选例:成功响应
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 13
Hello, World6.1 状态码分类
| 分类 | 范围 | 含义 |
|---|---|---|
| 1xx | 100-199 | 信息(继续处理) |
| 2xx | 200-299 | 成功 |
| 3xx | 300-399 | 重定向 |
| 4xx | 400-499 | 客户端错误 |
| 5xx | 500-599 | 服务器错误 |
6.2 常用状态码
| 状态码 | 含义 |
|---|---|
200 OK | 成功 |
201 Created | 创建成功 |
204 No Content | 成功但无内容 |
301/302 | 永久/临时重定向 |
304 Not Modified | 未修改(缓存) |
400 Bad Request | 请求格式错 |
401 Unauthorized | 未认证 |
403 Forbidden | 禁止访问 |
404 Not Found | 资源不存在 |
405 Method Not Allowed | 方法不允许 |
500 Internal Server Error | 服务器内部错误 |
502/503/504 | 网关/服务/超时错误 |
七、常用请求头 / 响应头
7.1 请求头
| 头 | 作用 |
|---|---|
Host | 目标主机(必须) |
Content-Type | 请求体类型 |
Content-Length | 请求体长度 |
Authorization | 认证凭据(Token/Basic) |
Cookie | 携带会话信息 |
User-Agent | 客户端标识 |
Accept | 接受的响应类型 |
7.2 响应头
| 头 | 作用 |
|---|---|
Content-Type | 响应体类型 |
Content-Length | 响应体长度 |
Set-Cookie | 设置 Cookie |
Location | 重定向目标地址 |
Cache-Control | 缓存策略 |
Content-Type 常见值:application/json、application/x-www-form-urlencoded、multipart/form-data、text/html、text/plain。
八、Cookie 与 Session(会话维持)
HTTP 无状态,用 Cookie/Session 维持登录态:
客户端 服务器
登录(POST) ──────────────────► 生成 Session,回 Set-Cookie
◄─ Set-Cookie: sessionid=abc
后续请求带 Cookie: sessionid=abc ─► 识别用户Token 方式(现代 API 常用):登录后服务器返回 Token,客户端在 Authorization: Bearer <token> 携带,无状态认证。
九、HTTP vs HTTPS
| 维度 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 明文 | TLS 加密 |
| 安全 | 可被窃听/篡改 | 加密+完整性+身份验证 |
| 证书 | 无 | 需要 CA 证书 |
| 场景 | 测试/非敏感 | 登录/支付/敏感数据 |
HTTPS 原理:HTTP 数据在 TLS 隧道中传输(TCP 之上加 TLS 层,再跑 HTTP)——TLS 握手协商密钥,后续数据加密。
应用: HTTP 数据
安全: TLS 加密层
传输: TCP → IP → 链路十、HTTP 与物联网设备
设备对接云平台 API 常用 GET/POST + JSON:
| 场景 | 方法 + URL | 示例 |
|---|---|---|
| 上报数据 | POST /api/data + JSON | 温湿度 |
| 查询状态 | GET /api/status | 设备状态 |
| 下载固件 | GET /ota/version.bin | OTA |
| 鉴权 | POST /api/auth 得 Token | 登录 |
十一、具体例子
11.1 例 1:HTTP GET 请求
GET /weather?city=beijing HTTP/1.1
Host: api.weather.com
Accept: application/json响应:
HTTP/1.1 200 OK
Content-Type: application/json
{"city":"beijing","temp":25,"humidity":60}11.2 例 2:HTTP POST 上报 JSON
请求:
POST /api/device/report HTTP/1.1
Host: iot.example.com
Content-Type: application/json
Content-Length: 38
{"device":"d1","temp":25.5,"battery":80}响应:
HTTP/1.1 200 OK
Content-Type: application/json
{"code":0,"msg":"success"}11.3 例 3:伪代码实现 HTTP GET
/* 通过 Socket 手动拼 HTTP 请求(概念示例) */
char req[] =
"GET /data HTTP/1.1\r\n"
"Host: api.example.com\r\n"
"Connection: close\r\n"
"\r\n";
tcp_send(sock, req, strlen(req)); // 发请求
tcp_recv(sock, resp, &len); // 收响应
// 解析响应:状态码 + 头 + 体
int code = parse_status_code(resp); // 如 200
char *body = parse_body(resp); // 如 {"data":...}11.4 例 4:用 curl 调试(命令行)
curl http://api.example.com/data # GET
curl -X POST -H "Content-Type: application/json" \
-d '{"temp":25}' http://api.example.com/report # POST
curl -v http://example.com # 显示完整报文十二、常见坑与排查
| 问题 | 可能原因 | 排查 |
|---|---|---|
| 404 | URL/路径错 | 核对请求 URL 和服务器路由 |
| 405 | 方法不允许 | 确认用对 GET/POST |
| 415 | Content-Type 不支持 | 设正确的 Content-Type |
| 401/403 | 认证失败/无权限 | 带正确的 Authorization/Token |
| 超时 | 服务器慢/网络 | 加超时,查服务器负载 |
| 中文乱码 | 编码/Content-Type 未指定 | 设 charset=utf-8 |
| 数据没到达 | 请求体长度错误 | 核对 Content-Length |