我的目标:通过HTTP逐块传输一个大的(〜200k)二进制文件,并通过某种类型的错误检测验证我接收到的块(客户端)与从服务器发送的块完全相同。
所以我有一个二进制文件(用于微控制器的固件更新),该文件试图从服务器(带有Express的nodejs)发送到设备。我可以成功地对字符串和其他小东西发出HTTP请求,并且可以很好地读取响应,但是现在我想发送文件。
该文件大约200kb,在服务器端,我正在使用fseek
将文件拆分为512字节的块(这是将写入更新的板载NAND闪存的页面大小至)。在客户端(我的微控制器)上,我正在发出一个get请求并指定我所在的当前块的索引(例如,我从?index=0
开始,逐块增加直到?index=400
)。
对于我收到的每个块,我想验证我是否具有与服务器相同的数据。我目前的想法是在客户端执行CRC检查,并将其与服务器中的CRC进行比较,并将其存储在GET响应的标头中。这是一个好方法吗?对于我要完成的工作,是否有更好的标准?
额外:微控制器使用STM32处理器,2MB的NAND闪存,256KB的SRAM。使用Mbed-OS 5.12编写我的图像
答案 0 :(得分:1)
如果要通过单个TCP套接字发送数据,则该通道可确保所有发送的数据到达远程端,并且将自动从大多数错误中恢复,而无需使用校验和和序列号进行干预。
像这样将数据拆分成块,只会以昂贵且低效的方式复制TCP堆栈中已经存在的功能。
只要您检查接收端是否没有不可恢复的错误,并且在TCP之上运行的协议可以识别文件的开头和结尾(假设您使用的协议可能通过同一个套接字发送其他信息),您唯一需要担心的是中间人袭击。在中间攻击中如何与男人打交道是一个更为复杂的主张,正确的解决方案取决于您的威胁模型。
OTOH,如果您使用的是基于数据报的传输(例如UDP),则使用前向纠错比依靠校验和更有效。
答案 1 :(得分:0)
通过HTTP(S),您无法验证块(除非它们不是单独的请求)=您只能在文件中添加CRC或MD5,并且服务器端的脚本可以对其进行检查并在出现时向您发送回复。
您有两个选择: 1.将块作为单独的请求(或文件)并检查块的完整性 2.建立非HTTP连接并实现自己的协议发送 3.通过TCP / IP使用其他文件传输协议