Chrome TLS 握手包已经超过一个帧了,如果不是我自己写的工具出现问题了,我都不知道。

最开始的时候,我直接使用 peek 读取头部数据,一般这里能获取到 tls hello packet 里面的 SNI 扩展字段。但是最近一直失败,排查之后发现 tls 的起手握手包已经超过 2k 字节,一个 tcp 帧容不下,如果运气好的话能在前半部分找到 SNI 信息就不用处理后续内容,但是如果找不到,就需要读取剩下的内容。

我同样测试了 Firefox,工作起来没有问题,也许 Firefox 把 SNI 扩展信息放在非常前面,或是 Firefox 浏览器的 tls hello 包没有超过一个 tcp 帧大小,所以能读取到。

这里有几种情况:

  1. tls hello 包非常小,能在一个 tcp 帧内传输完,所以我写的程序正确运行。
  2. tls hello 包超过一个 tcp 帧容量,但是 SNI 放在第一个 tcp 帧里面,程序正确运行。
  3. tls hello 包超过一个 tcp 帧容量,并且 SNI 信息已经挤压到后续的 tcp 帧里面,程序运行异常。

以 1 和 2 情况来处理,代码敷衍一下,可以写的非常简洁明了,但是因为出现了 3 情况,我不得不重构了一大段代码,变的啰嗦了。