最近在研究 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
可以用 tcpdump +wireshark 来看下
adb shell tcpdump -i wlan0 -w /sdcard/capture2.pcap
然后在 wireshark 中过滤 出 connect 请求 http.request.method == "CONNECT"
代理服务器 dns 解析失败的时候
dns 解析失败时 会发现 客户端和代理服务器之间的 tcp 连接会关闭
这个关闭以后,tls 的 client hello 请求都不会发出,作为 tls 握手流程中的一部分,webview 报错 ssl 握手失败,也是情理之中。
解析成功的时候
后续都是 syn,ack的 tcp 报文,流程正常,之后还会有 tls 的 client Hello 和 server hello 的报文