OTA的HTTP笔记

一、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. 按分片范围顺序写入对应偏移位置
相关推荐
('-')2 小时前
《从根上理解MySQL是怎样运行的》第三章学习笔记
笔记·学习·mysql
LaoZhangGong1232 小时前
TCP数据包格式分析
网络·网络协议·tcp/ip·以太网
老蒋新思维2 小时前
创客匠人 2025 高峰论谈(11.22-25):AI 智能体重构创始人 IP 打造与知识变现的管理逻辑
大数据·网络·人工智能·网络协议·tcp/ip·重构·知识付费
柳一航2 小时前
HTML笔记
前端·笔记·html
诸葛思颖3 小时前
【论文阅读笔记】FL+HC(联邦学习+层次聚类)
论文阅读·笔记·聚类
序属秋秋秋4 小时前
《Linux系统编程之进程基础》【进程优先级】
linux·运维·c语言·c++·笔记·进程·优先级
草莓熊Lotso4 小时前
C++ STL map 系列全方位解析:从基础使用到实战进阶
java·开发语言·c++·人工智能·经验分享·网络协议·everything
河铃旅鹿7 小时前
Android开发-java版:Framgent
android·java·笔记·学习
AA陈超10 小时前
ASC学习笔记0020:用于定义角色或Actor的默认属性值
c++·笔记·学习·ue5·虚幻引擎