OkHttp源代码分析(三)——代理和路由

第一眼看的时候没有看懂OkHttp的源代码,因为地址、路由、代理、ProxySelector、RouteSelector等我都没看懂。阅读源代码非常困难。看了好几遍,还是不明白找复用连接,创建连接,连接服务器,连接代理服务器,创建隧道连接的逻辑。本文决定对相关概念和基本原则进行梳理。

● HTTP/1.1(HTTPS)

● HTTP/2

● SPDY

A /p/63ba15d8877a

1.构造地址对象。

2.阅读代理配置:resetNextProxy

3.解析目标服务器的套接字地址。

4.选择路由以创建RealConnection。

5、确定协议

测试方法:

●在PC端打开Charles,设置端口,如何设置代理。网上有教程,比较简单;

●打开手机WIFI,选择连接的WIFI修改网络,在高级选项设置中指定代理服务器,PC的ip和Charles刚刚设置的端口;

● OkHttpClient不指定代理,发起请求。

1.构造地址对象。

2.阅读代理配置:resetNextProxy

3.解析目标服务器的套接字地址。

4.选择路由以创建RealConnection。

5.创建隧道

因为是代理https请求,所以需要隧道代理。

从图中可以看出,建立隧道实际上是发送一个CONNECT请求,头部包括字段Proxy-Connection和目标主机名,请求的内容类似:

6、确定协议,SSL握手

1,代理可以分为HTTP代理和SOCK代理;

2.HTTP代理分为普通代理和隧道代理。普通代理适合明文传输,即http请求;隧道代理只转发TCP包,适合加密传输,即https/http 2;

3.SOCK代理分为SOCK4和SOCK5。不同的是后者支持UDP传输,适用于QQ等代理聊天工具。

4.不设置代理(不指定OkHttpClient,不设置系统),客户端直接与目标服务器建立TCP连接;

5.设置了代理。当http请求被代理时,客户机与代理服务器建立TCP连接。如果代理服务器是域名,则代理服务器域名被解释,而目标服务器域名由代理服务器解析。

6.代理已设置。当代理用于https/http2请求时,客户端与代理服务器建立TCP连接,发送CONNECT请求与代理服务器建立隧道,并进行SSL握手。代理服务器不解析数据,只转发TCP数据包。

如何正确使用HTTP代理

OkHttp3中的代理和路由

HTTP代理的原理与实现(1)