代理服务器dns 解析失败的场景分析

87 阅读1分钟

最近在研究 webview 使用ProxyController 来代理请求的东西,发现一个很有意思的现象, 如果你的 app 不使用任何代理,如果出现dns 错误,那么 webview 会报错 一般情况下 是报错:

public static final int ERROR_HOST_LOOKUP = -2;

如果你使用了代理服务器,代理服务器上出现 dns 错误,那么 webview 报错

public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;

这个很让人困惑,为什么会这样?

查了一下在代理服务器不解析 https 报文只做流量转发的情况下,实际上是用的 http 协议中的隧道机制 也就是 tunnel

image.png

可以用 tcpdump +wireshark 来看下

adb shell tcpdump -i wlan0 -w /sdcard/capture2.pcap

然后在 wireshark 中过滤 出 connect 请求 http.request.method == "CONNECT"

代理服务器 dns 解析失败的时候

image.png

dns 解析失败时 会发现 客户端和代理服务器之间的 tcp 连接会关闭

image.png

这个关闭以后,tls 的 client hello 请求都不会发出,作为 tls 握手流程中的一部分,webview 报错 ssl 握手失败,也是情理之中。

解析成功的时候

image.png

后续都是 syn,ack的 tcp 报文,流程正常,之后还会有 tls 的 client Hello 和 server hello 的报文