为啥 HTTP/2 客户端拒绝包含连接头的请求?

Posted

技术标签:

【中文标题】为啥 HTTP/2 客户端拒绝包含连接头的请求?【英文标题】:Why do HTTP/2 clients reject requests containing the connection header?为什么 HTTP/2 客户端拒绝包含连接头的请求? 【发布时间】:2022-01-20 23:51:26 【问题描述】:

查看“在 Burp Suite 中使用 HTTP/2”以找出为什么存在剥离连接标头的选项,我发现原因是“这是因为许多 HTTP/2 服务器会拒绝包含此标头的请求.'.

有什么具体原因吗?

【问题讨论】:

【参考方案1】:

是的,HTTP/2 规范在section 8.1.2.2 中声明:

HTTP/2 不使用 Connection 头域来表示 连接特定的头字段;在这个协议中,连接- 特定元数据通过其他方式传达。端点不得 生成包含连接特定标头的 HTTP/2 消息 字段;任何包含特定连接头字段的消息必须 被视为畸形

话虽如此,许多服务器更宽容,可以容忍Connection 标头存在,尽管它们被忽略了。

此限制的原因是 Connection 标头在 HTTP/1.1 请求中有意义,其中一次通过 TCP 连接发送一个请求。

在像 HTTP/2 这样的多路复用协议中,请求(HTTP/2 流)携带连接头是没有意义的,因为同一个 TCP 连接上可能有多个请求。

举个极端的例子,如果你有一个带有Connection: close 的HTTP/2 流和另一个带有Connection: keep-alive 的并发HTTP/2 流(尽管keep-alive 即使在HTTP/1.1 中也被弃用了),那么应该怎么做? HTTP/2 的实现呢?按照第一个流的建议关闭连接,还是按照第二个流的建议保持连接?

显然这不适用于 HTTP/2 等多路复用协议,这就是实现拒绝此类请求的原因。

【讨论】:

以上是关于为啥 HTTP/2 客户端拒绝包含连接头的请求?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议状态码详解列表

为啥代客共享不像本地代客那样在请求中添加斜线

手机连接家里wifi,显示“连接被拒绝”是啥原因?

在线客服~~

大家为啥会选择优客服的客服系统啊?

为啥使用 HTTP/2 的应用只建立一个 TCP 连接?