为啥 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 客户端拒绝包含连接头的请求?的主要内容,如果未能解决你的问题,请参考以下文章