首页/网络/协议速查/100 Continue 继续发送
HTTP 方法与状态码91 条

100 Continue 继续发送

客户端用 Expect: 100-continue 征求服务器同意后再发送请求体,避免上传被拒绝的大文件白白占用带宽。

协议速查网络更新于 2026-10-13

100 的定位

100 Continue 是一个「中间响应」:客户端发出带 Expect: 100-continue 的请求头后暂停发送请求体,等服务器回 100 再上传;若服务器直接回 4xx/5xx,客户端就不必白白上传。它是 HTTP/1.1 引入的机制(RFC 9110 §15.2.1),HTTP/2 与 HTTP/3 保留同样语义,只是换成 :status 100 的 HEADERS 帧。

基本信息

名称100 Continue
类型1xx 中间响应(不是最终响应)
规范RFC 9110 §15.2.1;Expect 见 §10.1.1
触发条件请求头 Expect: 100-continue
HTTP/2、3服务器以 HEADERS 帧发送 :status 100

典型使用场景

  • 大文件上传前先让服务器校验:路径不存在、配额不足、类型不允许时直接拒绝,省掉整段上传
  • 网关或对象存储先验身份再收正文:token 无效就不必收几百 MB 数据
  • 弱网移动端上传:一次往返换取「不白传」的机会
  • 排障与压测:观察 100 是否出现,判断链路中的代理有没有吞掉 Expect

交互时序

交互时序
客户端: POST /upload HTTP/1.1
        Expect: 100-continue
服务器: HTTP/1.1 100 Continue
客户端: (开始发送请求体)
服务器: HTTP/1.1 200 OK
        # 若校验不通过,服务器可直接回 4xx/5xx,客户端随即丢弃请求体

三方行为对照

角色校验通过校验不通过
客户端收到 100 后发送请求体收到最终 4xx/5xx,不发请求体
服务器先回 100,再读正文跳过 100,直接回最终状态码
中间代理转发 100,或按自身策略缓冲不支持时可能直接放行正文,预检失效
客户端等约一秒仍未收到 100 时,RFC 9110 的实现建议是仍可继续发送请求体,避免死等;服务器也可以完全不发 100 直接给最终响应。

和直接上传的差别

不加 Expect 时,客户端会先把整个请求体推给服务器,服务器读到一半才发现配额不足或路径非法,带宽已经花掉;加了 Expect 则把「是否接受」的判断提前到一次极小的往返上。代价是多一个往返,以及在部分代理上被吞掉的不确定性,所以只有体积较大的上传才划算。

排障观察点

现象可能原因确认方式
没看到 100 就直接失败服务器校验未通过,属正常路径抓包看服务器是否跳过 100 直接给最终状态码
上传长时间卡住服务器既未回 100 也未回最终响应两端同时抓包,看 100 是否真的发出
经代理后预检失效中间设备吞掉 Expect 或直接转发正文同一脚本分别直连与经代理各跑一次对比
很久之后才收到 100服务端校验逻辑本身很慢比较 100 与最终响应之间的时间差
部分老旧代理与 WAF 对 1xx 的处理不完整:既可能不发 100,也不保证请求体被正确转发。上线前用同一份上传脚本分别直连与经代理各跑一次,比对结果。

易错点

  • 中间代理不支持 Expect 时会直接转发请求体,预检价值下降:大文件上传超时的排查要把这一层行为算进去
  • 手写 HTTP 解析时把 100 当成最终响应(多数成熟库会自动跳过 1xx):会误判响应结束,后续读取错位
  • 服务器发了 100 但请求体迟迟不到,会占用连接与临时文件:必须设置请求体读取超时
  • 为小请求加 Expect 只会多一次往返、收益为零:正文不够大时不要加
  • 服务器回了 100 之后连接若被中间设备重置,客户端会卡在等待:要给上传设整体超时,别只依赖库的默认值

数据来源与参考

  • RFC 9110 §15.2.1 100 Continue
  • RFC 9110 §10.1.1 Expect

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌