okhttp3.OkHttpClient.Builder clientBuilder = new okhttp3.OkHttpClient.Builder();
//读取超时
clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
//连接超时
clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
//写入超时
clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
//总超时时间
clientBuilder.callTimeout(CALL_TIMEOUT, TimeUnit.SECONDS);
CONNECT_TIMEOUT:
三次握手 + SSL建立耗时
超时时间:默认10s
测试方法:请求 www.facebook.com 触发 SocketTimeoutException
READ_TIMEOUT:
连接建立后,从远端获取数据。TCP 传输
WRITE_TIMEOUT:
连接建立后,向远端发送数据。TCP 传输
CALL_TIMEOUT:
从发起到结束的总时长。其中不包括 UnknownHostException 情况
UnknownHostException:
测试方法:拔掉路由外部网线,但是保持设备与路由的连接。
超时时间:20s
耗时段介绍「从上往下」
耗时操作 | 调用位置 |
DNS解析 | 「ConnectInterceptor」streamAllocation.newStream 「RouteSelector」address.dns().lookup() |
连接时间 | 「ConnectInterceptor」streamAllocation.newStream 「Platform」socket.connect() |
写入request | 「CallServerInterceptor」httpCodec.writeRequestHeaders |
服务器响应 | 「ConnectInterceptor」streamAllocation.newStream 「RealConnection」socket.connect() |
读取response | 「CallServerInterceptor」httpCodec.readResponseHeaders |
4个超时设置「OkHttpClient.Builder」
api | 简介 | 生效机制 |
callTimeout() | 整个流程耗费的超时时间 | RealCall.execute方法,设置进入 AsyncTimeout + WatchDog实现 |
connectTimeout() | 三次握手 + SSL建立耗时 | socket.connect(address, connectTimeout) |
readTimeout() | source读取耗时 | source.timeout(readTimeout) AsyncTimeout + WatchDog实现 |
rawSocket读取耗时 | rawSocket.setSoTimeout(readTimeout) | |
writeTimeout() | sink写入耗时 | sink.timeout(writeTimeout) AsyncTimeout + WatchDog实现 |
耗时操作之间的关联
route.requiresTunnel() | callTimeout = dns + connection + readTimeout + readTimeout + writeTimeout + 其它 |
无 | callTimeout = dns + connectTime + readTimeout + 其它 |
1,基本耗时:dns + 三次握手耗时 + 服务器响应耗时
2,若有渠道,则增加 source.timeout().(readTimeout) + sink.timeout.(writeTimeout)