一、HTTP/1.1 核心概念
HTTP(HyperText Transfer Protocol,超文本传输协议)是客户端与服务器之间的应用层协议 ,基于 TCP 面向连接、可靠传输的特性,核心是 "请求 - 响应" 模型。HTTP/1.1 是目前应用最广泛的版本(替代 HTTP/1.0,兼容大部分场景),其设计目标是高效传输资源(文件、网页、接口数据等),适配多数场景(含嵌入式 OTA 开发)。
| 核心概念 | 定义 / 特点 | 实战关联(如 OTA 开发) |
|---|---|---|
| 无状态协议 | 服务器不保存客户端历史状态,每次请求独立 | 用 ETag/Last-Modified 校验文件版本 |
| 面向连接 | 基于 TCP 三次握手建立连接,四次挥手关闭 | 保证 OTA 固件传输不丢包、按序到达 |
| 长连接(Keep-Alive) | 复用 TCP 连接传输多个请求(HTTP/1.1 默认) | 提升 OTA 分片下载效率,避免重复建立连接 |
| 请求方法 | 定义请求的操作类型(核心:GET/POST/HEAD) | GET 用于 OTA 固件下载,HEAD 用于校验资源存在性 |
| 状态码 | 应答的结果标识(分 5 类) | 206 对应分片下载成功,404 对应固件不存在 |
| 头字段 | 键值对(键: 值),传递元数据(资源大小、类型等) |
Content-Range 用于 OTA 分片规划,Content-Length 校验完整性 |
| URI | 资源唯一标识,指定服务器上目标资源路径 | 指向 OTA 固件在服务器的存储路径 |
| 响应体 | 实际传输的资源数据(如二进制固件、文本等) | OTA 中为固件二进制数据,需按字节保存 |
二、HTTP/1.1 请求语法
1. 请求固定结构
html
请求行 → 请求头 → 空行
2. 请求示例(GET 分片请求,获取资源第 0-1023 字节)
html
GET /firmware/device_v1.2.bin HTTP/1.1\r\n
Host: [服务器域名/IP]\r\n
Connection: Keep-Alive\r\n
Range: bytes=0-1023\r\n
User-Agent: Embedded-Client/1.0\r\n
Accept: */*\r\n
\r\n
3. 语法拆解(表格详解)
| 组成部分 | 示例内容 | 格式要求 | 含义说明 |
|---|---|---|---|
| 请求行(必选) | GET /firmware/device_v1.2.bin HTTP/1.1\r\n |
[请求方法] [URI] [协议版本]\r\n,三要素用空格分隔,结尾必须是 \r\n |
- GET:请求方法(获取资源,安全可重试)- URI:目标固件路径- HTTP/1.1:协议版本 |
| 请求头(可选) | Host: [服务器域名/IP]\r\n |
键: 值\r\n,键名大小写不敏感,值前后可加空格 |
HTTP/1.1 强制要求,指定目标服务器(一台服务器可托管多个资源) |
Connection: Keep-Alive\r\n |
同上 | 启用长连接,复用 TCP 连接传输后续分片请求 | |
Range: bytes=0-1023\r\n |
同上 | 分片下载核心,指定请求资源的字节范围(0 起始计数) | |
User-Agent: Embedded-Client/1.0\r\n |
同上 | 标识客户端类型(嵌入式设备),服务器可适配响应 | |
Accept: */*\r\n |
同上 | 客户端可接收任意资源类型,适配二进制固件 | |
| 空行(必选) | \r\n |
单独的 \r\n,无其他字符 |
分隔请求头与请求体(GET 请求无请求体,仅作为结束标识) |
3.1. 常用 HTTP 请求方法
请求方法决定了 "客户端想对服务器做什么":
| 方法 | 作用 | 例子 |
|---|---|---|
GET |
从服务器获取资源(不修改服务器数据) | 下载 OTA 包(你的请求)、打开网页 |
POST |
向服务器提交数据(可能修改服务器数据) | 登录账号、上传文件 |
HEAD |
和GET一样,但服务器只返回响应头,不返回响应体(比如只校验文件大小,不下载内容) |
嵌入式中常用於 OTA 前置检查 |
PUT |
向服务器上传资源(覆盖原有资源) | 较少用 |
3.2. 关键 HTTP 请求头
请求头是 "客户端告诉服务器的额外信息",键值对格式(键: 值),你的请求用到了 2 个核心头:
| 头字段 | 作用 | 你的用法 |
|---|---|---|
Host |
指定目标服务器域名(HTTP 1.1 强制要求) | Host: www.csdn.net(告诉服务器访问这个域名) |
Range |
请求资源的部分字节(分片下载 / 断点续传) | Range: bytes=0-0(仅要第 0 字节) |
User-Agent |
告诉服务器客户端的身份(比如设备型号、浏览器) | 嵌入式中可能写User-Agent: HLW8012-OTA-Client |
Content-Length |
告诉服务器请求体的大小(POST 请求用) | 比如上传文件时写Content-Length: 1024 |
4. 语法强制规则(避坑)
- 所有字段结尾必须是
\r\n(HTTP 标准换行符,不可用\n替代); - 请求行三要素不可缺失,空格分隔不可少;
- Host 头不可省略(HTTP/1.1 强制要求,缺失返回 400 错误)。
三、HTTP/1.1 应答语法(对应上述请求)
1. 应答固定结构
cs
状态行 → 响应头 → 空行 → 响应体
2. 应答示例(206 分片响应)
html
HTTP/1.1 206 Partial Content\r\n
Date: Thu, 20 Nov 2025 10:00:00 GMT\r\n
Server: [服务器软件]\r\n
Last-Modified: Wed, 08 Oct 2025 15:30:00 GMT\r\n
ETag: "a1b2c3d4-5678"\r\n
Accept-Ranges: bytes\r\n
Content-Length: 1024\r\n
Content-Range: bytes 0-1023/32768\r\n
Content-Type: application/octet-stream\r\n
Connection: Keep-Alive\r\n
\r\n
[二进制数据:资源第 0-1023 字节]
3. 语法拆解(表格详解)
| 组成部分 | 示例内容 | 格式要求 | 含义说明 |
|---|---|---|---|
| 状态行(必选) | HTTP/1.1 206 Partial Content\r\n |
[协议版本] [状态码] [状态短语]\r\n |
- HTTP/1.1:与请求版本一致 - 206:状态码(部分资源请求成功)- Partial Content:状态短语(文字描述) |
| 响应头(核心) | Date: Thu, 20 Nov 2025 10:00:00 GMT\r\n |
键: 值\r\n,顺序可任意 |
服务器处理请求的时间(GMT 标准时间),用于日志记录 |
Last-Modified: Wed, 08 Oct 2025 15:30:00 GMT\r\n |
同上 | 资源最后修改时间,用于 OTA 版本校验(判断是否有新版本) | |
ETag: "a1b2c3d4-5678"\r\n |
同上 | 资源唯一指纹(内容变则 ETag 变),用于断点续传版本校验 | |
Accept-Ranges: bytes\r\n |
同上 | 服务器支持按字节分片(值为 bytes),不支持则返回 none |
|
Content-Length: 1024\r\n |
同上 | 响应体字节数(本次分片大小),用于校验接收完整性 | |
Content-Range: bytes 0-1023/32768\r\n |
同上 | 分片核心:bytes [当前范围]/[总大小],提取总大小规划后续分片 |
|
Content-Type: application/octet-stream\r\n |
同上 | 响应体 MIME 类型,application/octet-stream 表示二进制文件(OTA 需按二进制保存) |
|
Connection: Keep-Alive\r\n |
同上 | 确认长连接,允许复用 TCP 连接 | |
| 空行(必选) | \r\n |
单独的 \r\n |
分隔响应头与响应体,标识响应头结束 |
| 响应体(可选) | [二进制数据:第 0-1023 字节] |
格式由 Content-Type 决定(此处为二进制流) | 实际请求的资源数据,OTA 需写入本地文件对应偏移位置 |
四、核心状态码分类
| 状态码范围 | 类别 | 核心含义 | 常用状态码及说明 |
|---|---|---|---|
| 1xx | 信息提示 | 服务器接收请求,需进一步处理 | - 100 Continue:客户端可继续发送请求 |
| 2xx | 成功 | 请求正常处理完毕 | - 200 OK:完整资源请求成功- 206 Partial Content:分片请求成功 |
| 3xx | 重定向 | 需客户端进一步操作才能获取资源 | - 301 Moved Permanently:资源永久迁移- 304 Not Modified:资源未修改(可使用缓存) |
| 4xx | 客户端错误 | 请求格式 / 参数错误,服务器无法处理 | - 400 Bad Request:请求格式错误- 404 Not Found:资源不存在- 416 Requested Range Not Satisfiable:分片范围无效 |
| 5xx | 服务器错误 | 服务器处理请求时发生故障 | - 500 Internal Server Error:服务器内部故障- 503 Service Unavailable:服务器暂时不可用 |
五、OTA 开发核心关联字段
| 字段类型 | 字段名 | 作用 | 开发操作要点 |
|---|---|---|---|
| 请求头 | Range | 指定分片字节范围 | 格式:bytes=start-end,如 bytes=1024-2047 |
| Connection | 启用长连接 | 显式声明 Keep-Alive,提升下载效率 |
|
| 响应头 | Content-Range | 获取分片范围 + 文件总大小 | 提取总大小(如 32768),计算分片数量 |
| Content-Length | 校验分片接收完整性 | 接收字节数需等于该值,否则重传 | |
| Accept-Ranges | 判断是否支持分片 | 仅当值为 bytes 时,可使用 Range 分片 |
|
| Last-Modified | 校验资源版本 | 对比本地文件修改时间,判断是否需要更新 | |
| ETag | 断点续传版本校验 | 确保分片属于同一版本资源,避免篡改 | |
| Content-Type | 确定数据存储格式 | 二进制类型(application/octet-stream)需按字节保存 |
六、常见错误排查
| 错误现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 400 Bad Request | 请求行格式错误、Host 头缺失、头字段格式错误 | 1. 检查请求行三要素空格是否完整2. 确认 Host 头存在3. 核对所有头字段是否符合 键: 值 格式 |
| 404 Not Found | URI 路径错误、资源不存在 | 1. 核对 URI 路径与服务器存储路径一致2. 确认服务器上资源已上传 |
| 416 错误 | 分片范围超出总大小、Range 格式错误 | 1. 检查 Range 格式是否正确2. 基于 Content-Range 重新计算分片范围 |
| 提取文件总大小失败 | 未解析 Content-Range 字段、响应头不完整 | 1. 确保接收完整响应头2. 按 bytes 0-xxx/总大小 格式提取 |
| 固件保存后无法运行 | 按文本格式存储、分片顺序错误 | 1. 按二进制模式写入文件2. 按分片范围顺序写入对应偏移位置 |