IP直连的好处
- 省去DNS解析过程,减少耗时;
- 就近接入,减少耗时;
- 避免DNS劫持;
- 终端有多个IP接入时,有容灾能力;
回顾网络请求握手过程
HTTP TCP三次握手流程

握手目的:
为了保证通讯双方建立的连接是可靠的。
同时,为了保证性能,握手的次数要求尽可能少。
那么什么才算是连接可靠?
通讯双方建立的连接可靠”就是要确保双方的发送和接收功能都正常。
在握手前,双方的发送和接收能力尚未确认。三次最可靠;
握手过程
-
第一次握手:
客户端向服务端发送信息。当服务端接收到信息后,服务端可以明确接收功能是正常的。 -
第二次握手:
服务端向客户端发送信息作为应答。当客户端接收到信息后,客户端可以明确发送和接受功能都正常。 -
第三次握手:
客户端向服务端发送信息,当服务端接收到信息后,服务端可以明确发送功能是正常的。 -
通过三次握手,就能明确双方的收发功能均正常,也就是说,保证了建立的连接是可靠的。而且,由上可见,三次是确保连接可靠的最3少次数,再就多余。
HTTPS连接过程
三次握手之后,连接请求ca证书

- 第一步:
客户端向服务端发送请求,表明客户端支持的加密协议及版本SSL,TLS; - 第二步:
服务端返回公钥和证书要客户端; - 第三步:
客户端接收后验证证书的安全性如果通过则会生成一个随机数,用公钥加密,发送到服务端; - 第四步:
服务端接收到加密后的随机数,用私钥解密得到解密后的随机数,再用这个随机数当做私钥,对需要发送的数据进行对称加密; - 第五步:
客户端收到加密后的数据,使用私钥(生成的随机数)对数据进行解密,并解析数据呈现;
SSL加密建立
问题
- 证书HOST校验问题;
证书校验用的是域名校验,而不是iP地址,OkHostnameVerifier替换为域名; - SNI问题;
一个域名对应多个iP地址,证书校验时没有找到自己设置的IP地址,报错,在SSLSocketFactory的实现类中设置自己的域名; - 连接复用问题;
具体判断是否可复用问题在RealConnection#isEligible();
boolean equalsNonHost(Address that) {
return this.dns.equals(that.dns)
&& this.proxyAuthenticator.equals(that.proxyAuthenticator)
&& this.protocols.equals(that.protocols)
&& this.connectionSpecs.equals(that.connectionSpecs)
&& this.proxySelector.equals(that.proxySelector)
&& equal(this.proxy, that.proxy)
&& equal(this.sslSocketFactory, that.sslSocketFactory)
&& equal(this.hostnameVerifier, that.hostnameVerifier)
&& equal(this.certificatePinner, that.certificatePinner)
&& this.url().port() == that.url().port();
}
&& equal(this.sslSocketFactory, that.sslSocketFactory)
&& equal(this.hostnameVerifier, that.hostnameVerifier)
修改equals方法
- 兼容性问题;
- Session复用问题
参考文档:
HTTPS IP直连问题小结
HTTPS和TCP协议三次握手设计
网友评论