数码工坊
白蓝主题五 · 清爽阅读
首页  > 数据备份

客户端请求支持长连接吗?数据备份时别让连接反复断开

数据备份时,你有没有遇到过这样的情况:备份到一半卡住,重试几次才成功;或者明明网络没问题,但备份任务老是中断重连?背后可能就藏着一个被忽略的细节——客户端请求到底支不支持连接

长连接不是“高级功能”,而是备份流畅的关键

HTTP/1.1 默认开启长连接(Keep-Alive),意思是同一个 TCP 连接可以复用多次请求响应,不用每次备份一个小文件都新建一次连接。而很多轻量级备份工具或自研脚本,默认用的是短连接,每传一个文件就建立、关闭一次连接,光握手和挥手就耗掉几十毫秒。100个文件?光连接开销就多出好几秒,还容易触发服务端连接数限制或防火墙超时拦截。

怎么判断你的客户端是否支持长连接?

看请求头最直接。用浏览器开发者工具或 curl 抓一下备份发起的请求:

curl -v https://backup.example.com/upload

如果响应头里有 Connection: keep-alive,且请求头也带了 Connection: keep-alive,说明当前这一路走通了。但如果看到 Connection: close,哪怕协议是 HTTP/1.1,实际也在用短连接。

常见客户端的表现

Python 的 requests 库默认支持长连接,只要复用同一个 Session 对象:

import requests
s = requests.Session()
for file in backup_files:
  s.post("https://api.backup.com/upload", files={"data": open(file, "rb")})

而用 urllib.request.urlopen() 每次新建请求,就默认不复用连接,得手动加 headers 才行。

手机 App 做自动备份时,有些老版本 SDK 会把每个上传请求当成独立调用,没配连接池,结果凌晨批量备份时,服务器日志里全是 TIME_WAIT 状态连接暴增——这不是网不好,是客户端“太老实”,不会续着用。

服务端配合也很重要

光客户端支持不够。比如 Nginx 默认 keepalive_timeout 是 65 秒,如果你的单个大文件上传要花 2 分钟,中间没任何数据交互,连接就被关了。这时候得调长超时,或让客户端在空闲时发个轻量心跳包(比如 OPTIONS 请求),维持连接活性。

备份不是拼速度,而是拼稳定。一次完整的长连接跑完 50 个文件,比 50 次短连接更少出错、更省资源,也更不容易被误判为异常流量。