美文网首页收藏JavaJava 程序员
一次 HTTP2 通信失败的原因分析

一次 HTTP2 通信失败的原因分析

作者: 马小莫QAQ | 来源:发表于2022-03-14 19:12 被阅读0次

背景

某业务上线 HTTP/2 以后,通过 curl 访问某接口一直失败。

开发人员怀疑可能是运维的 HTTP/2 配置不当导致访问失败,但是同样是配置 HTTP/2 的其它域名却是正常的,于是来一起看了一下这个问题。

排查

排查第一步:遇事不决先抓包,在没有任何先决信息的情况下,先抓包,看看传输了一些啥。因为 HTTP/2 要求通过 HTTPS 通信,所以这里抓包,还需要用到 wireshark 抓取 HTTPS 包的一些技巧。至于这么做,我在之前的 B 站分享有讲过,大家如果感兴趣可以看看。地址在这里:Wireshark 抓取 HTTPS 流量的 N 种方法「 www.bilibili.com/video/BV1ur…

抓取 HTTPS 的包

简单来说,就是通过导出 premaster-secret 来帮助 wireshark 解密数据。wireshark ssl keylog 格式长啥样,具体的定义在 github.com/boundary/wi…

curl 要做的就是把 key 打印到文件里,这部分的源码在: github.com/curl/ lib/vtls/keylog.c ,如下图所示。

对于 curl 而言,我们只需要指定一个环境变量就可以了,抓取的包我们就可以解密出来了。

export SSLKEYLOGFILE=/Users/arthur/keylog.txt

wireshark 解密出来的结果如下。

看起来就是 HTTP2 服务端的问题发了一个错误的包导致客户端回了 rst 帧。

接下来继续看 HTTP/2 服务端回复了什么。通过查看包,果然发现了一些有意思的。

expires 头部后面多了一个空格,其它的 header 都没有。怀疑是这个导致的,通过跟业务确认,确实如此,expires 后面多了一个空格,去掉以后马上访问正常了。

在 HTTP/1.1 时代,curl 是合法的,没有问题,在 HTTP/2 中,这里就有问题了。

当然这依然不能直接证明就是这个原因,除非 curl 亲自告诉我。

进一步分析

为什么有空格会出现问题呢?当然要从 curl 的底层去分析,curl 的 HTTP/2 底层是用 nghttp 这个库来实现的,nghttp 本来也可以通过命令行直接发起请求。

使用 nghttp 访问一下,印证了我们的想法。

探究源码

nghttp 是一个开源项目,可以很方面的把源码 clone 下来编译本地调试,发现他在处理 header 的时候会判定 header 是否合法

合法非法的 ASCII 字符在这里定义

可以看到空格,也就是下图中的 SPC,ASCII 码值是:32(0x20),对应的 VALID 为 0,表示空格是非法的 header 字符。

通过 GDB 同步确认这一点

至此,我们就知道了为什么 curl 在处理带有空格头部时的问题,chrome、safari 也有类似的问题,大家感兴趣可以看看。

作者:挖坑的张师傅
链接:https://juejin.cn/post/7072530260968865805
来源:稀土掘金

相关文章

  • 一次 HTTP2 通信失败的原因分析

    背景 某业务上线 HTTP/2 以后,通过 curl 访问某接口一直失败。 开发人员怀疑可能是运维的 HTTP/2...

  • 失败原因分析

    今天驾考科目二补考又挂科了,这一次挂科让我意想不到,感觉还有点莫名其妙。 刚开始分析是因为昨天模拟考试不理想影响了...

  • 最新关注IT技术

    一、通信协议 SPDY HTTP / 2 gRPC over HTTP2 (google)不同于REST 二、移动...

  • 滴滴2016大赛

    比赛题目 参考博客:Di-Tech2016参赛总结、数据分析过程、一次竞赛失败原因的分析 参考GitHub:gcr...

  • Http2介绍

    标签:http2 iplas 为什么要使用HTTP2 原因就是慢 浏览器阻塞(HOL blocking):浏览器会...

  • 163阿君 第三节课第2次作业 #裂变增长实验室#

    27号作业:在你的目标用户群里实操一次被动引流,把你引流的过程截图记录。并且分析你引流成功或者失败的原因 失败原因...

  • #改变社#晨论20171218

    晨论 流程: 各自的改变,成功或者失败。分析原因。(未来可以延伸为上一周的改变,成功或者失败,分析原因) 大家对于...

  • 全面分析失败原因

    全面分析原因 客观原因 001 大家在完成考核准备期间还有其他任务要承担,导致大部分人比较累; 002 单位目前整...

  • 最近失败原因分析

    佛家讲究因果,讲究来世轮回。我不信轮回,相信因果。 这里的的因果不是来世因果,而是一个事情的前因后果。 就像最近写...

  • 分析跑步失败的原因

    经历了两次下定决心跑步都坚持了一个月左右就慢慢放弃了,分析一下其中的原因 1.急功近利:盲目提高跑步量,身体感觉不...

网友评论

    本文标题:一次 HTTP2 通信失败的原因分析

    本文链接:https://www.haomeiwen.com/subject/wxlsdrtx.html