连接的复用: OkHttp 会在使用完连接后,将其保持在连接池中而不立即关闭。当下一次请求需要建立连接时,OkHttp 首先尝试从连接池中获取空闲的连接,而不是重新创建一个新的连接。这样可以节省握手和建立连接的时间开销,提高请求的效率。
最大连接数限制: 为了避免连接过多导致资源浪费,OkHttp 使用连接池来限制同时打开的连接数。这通过设置连接池的最大空闲连接数以及最大连接数来实现,超出这些限制的请求会等待连接可用为止。
连接的复用策略: OkHttp 使用一种智能的策略来管理连接的复用,在服务器支持的情况下,会尽可能地复用已经建立的连接,从而减少重复的连接建立和握手过程。
空闲连接的回收: 对于长时间空闲的连接,OkHttp 会根据连接池的设置进行回收,以保持连接池的健康状态,避免过多的空闲连接占用资源。
请求重试和失败处理: 在网络请求过程中,OkHttp 也会处理连接超时、请求重试等问题,以确保网络请求的稳定性。
补充:同一个服务器的最大连接数默认是5,最大的并发数是64,超过最大并发数的请求将会添加到等待队列中,okhttp会动态地根据系统负载来调整线程池的大小,这样做的目的是为了在不同的系统环境下都能保持良好的性能表现,后面新来的请求都会先添加到等待队列中,按照先进先出的原则执行,当请求的数量超过了线程池的最大处理能力和等待队列的容量时,可能会触发请求失败,返回给客户端某种类型的错误或者超时信息;连接池中最大的空闲链接数是5,如果30s没有新的请求复用链接的话将会关闭当前空闲链接,复用的链接是根据请求的IP和端口来寻找的且连接没有过期可以被重用,
判断连接是否过期的标准:
空闲时间: OkHttp 会根据连接的空闲时间来判断连接是否过期。当一个连接在连接池中空闲一段时间后,OkHttp 会检查这个连接的空闲时间是否超过了预先设定的阈值。如果超过了阈值,OkHttp 可能会认为这个连接已经过期,不再被重用,而是会关闭掉或者进行重新连接。
服务器响应的标头信息: 在 HTTP 协议中,服务器可以发送一个响应头(Response Header)来指示该连接可以被复用的时间。例如,服务器可以发送一个 Keep-Alive 头部,指示客户端可以在一定时间内重用这个连接。OkHttp 会根据这些头部信息来判断连接的有效期。
连接的健康状态: OkHttp 会检查连接的健康状态,例如连接是否已经关闭,是否已经建立了另一个连接,或者其他网络层面的问题,来决定是否继续重用这个连接。
一旦连接池中的连接被认为是过期的,OkHttp 将不会继续重用该连接,而会关闭它并重新建立一个新的连接。这种机制可以有效地避免使用已经失效的连接,保证了请求的可靠性和稳定性
拦截器:
应用拦截器和网络拦截器的区别在于:应用拦截器只会执行一次,网络拦截器会执行多次,所以我们的请求头数据、请求body数据、响应体日志等可以使用应用拦截器,而需要追踪网络请求过程的变化可以使用网络拦截器。
RetryAndFollowUpInterceptor:
请求失败时的重试:当发起的网络请求由于网络问题或服务器错误而失败时,RetryAndFollowUpInterceptor 负责决定是否需要进行请求的重试。根据预先设定的条件,比如网络超时、连接失败等,它会根据策略判断是否需要尝试重新发送请求。
重定向:当服务器返回重定向响应时,RetryAndFollowUpInterceptor 会负责处理重定向操作,比如重新发起请求到重定向的目标地址。
请求跟进:在某些情况下,一个请求可能需要跟随另一个请求,比如在HTTP 301/302响应中进行跟随。RetryAndFollowUpInterceptor 会处理这种请求的跟进操作,确保请求能够达到目标服务器。
BridgeInterceptor:
在客户端和服务器之间传输数据时进行桥接和转换。具体来说,它会处理从应用层到网络层的数据转换工作。
主要功能包括:
添加头信息:在请求发送到服务器之前,BridgeInterceptor 会负责添加必要的头信息(比如 User-Agent 等)以确保请求的正常发送。
请求转换:当一个请求发起时,BridgeInterceptor 可以负责将应用层的请求转换为可以发送到服务器的形式,包括请求方法、头信息等的转换工作。
响应转换:当从服务端接收到响应时,BridgeInterceptor 会将响应进行转换,确保它能够被应用层正常解析和处理。
CacheInterceptor:
OkHttp使用响应中的Cache-Control头部信息来判断缓存是否过期。Cache-Control头部包含了各种指令,其中max-age指令表示了缓存的有效期。当OkHttp收到一个响应时,它会检查max-age指令并基于当前时间和服务器返回的响应时间计算出缓存的有效期。如果缓存过期了,OkHttp会向服务器发起新的请求,如果没有过期,OkHttp会使用缓存的响应数据。
除了max-age,Cache-Control头部中还包含其他指令,比如no-cache、no-store等,它们会影响缓存的行为。此外,响应中的Expires头部也可以提供一个缓存过期的时间点。OkHttp会根据max-age和Expires来判断缓存是否过期。
ConnectInterceptor:
主要用于处理与连接、握手和协议切换相关的操作。具体来说,ConnectInterceptor 承担了以下主要功能:
建立连接:在发起一个请求时,ConnectInterceptor 负责创建与目标服务器的连接,在这个过程中可能涉及到 TLS 握手等操作。
协议切换:ConnectInterceptor 还负责处理在不同协议(如 HTTP/1.1、HTTP/2 等)之间的切换。
连接池管理:它还参与了连接池的管理,确保连接可以被复用,以提高请求的效率。
ConnectInterceptor 在整个请求链中起着重要的作用,它处理了底层网络连接的建立和管理,以确保请求可以顺利发送到服务器并获取响应。通过合理地使用 ConnectInterceptor,OkHttp 能够高效地处理网络连接,从而提升应用的性能和稳定性。
CallServerInterceptor:
发送请求到服务器:拦截器负责将请求发送到目标服务器,并等待服务器的响应。
处理服务器响应:一旦接收到服务器的响应,拦截器会处理并返回响应数据,包括响应头和响应体等信息。
请求重定向:在服务器返回的响应中,如果有重定向的指令,拦截器也会处理相应的重定向操作。
传输压缩:拦截器还可能涉及解压缩响应数据,以便应用程序可以使用解压后的数据。
通过 CallServerInterceptor,OkHttp 能够有效地处理请求到服务器和服务器返回的响应的过程,确保网络请求的顺利执行并处理服务器的响应。