OKHTTP 超时时间

        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)

你可能感兴趣的:(android)