RxJava
参考文章
中文文档
Flowable
RxLifecycle
面试题
- 内部线程切换原理
- 操作符有哪些
- 如何解决内存泄漏
- RxJava 中 Observable、Flowable、Single、Maybe、Completable 使用时如何选择?
- 为什么 subscribeOn() 只有第一次切换有效
- 操作符 map 和 flatmap 的区别?
Okhttp
1. 拦截器顺序?
自定义拦截器——>RetryAndFollowUpInterceptor——>BridgeInterceptor——>CacheInterceptor——>ConnectInterceptor
——>NetworkInterceptors——>CallServerInterceptor
2. 网络拦截器和普通拦截器有什么区别?
网络拦截器:
网络拦截器可以操作重定向和失败重连的返回值
取缓存中的数据就不会去执行Chain.proceed().所以就不能执行网络拦截器
通过网络拦截器可以观察到所有通过网络传输的数据
请求服务连接的拦截器先于网络拦截器执行,所以在进行网络拦截器执行时,就可以看到Request中服务器请求连接信息,因为应用拦截器是获取不到对应的连接信息的。
普通拦截器:
应用拦截器只会调用一次,即使数据来源于缓存
不需要关心是否重定向或者失败重连
只考虑应用的初始意图,不去考虑Okhhtp注入的Header比如:if-None-Match,意思就是不管其他外在因素只考虑最终的返回结果
应用拦截器可以决定是否执行其他的拦截器,通过Chain.proceed().
可以执行多次调用其他拦截器,通过Chain.proceed().
3. 它的线程池是怎样的?如何管理的?
核心线程:0
非核心线程:Int.MAX_VALUE
Keeplive:60s
4. 缓存实现
1、如果在 OKHttpClient 中配置了 cache,则从缓存中获取,但是不保证就存在
2、拿到当前请求,缓存拿到缓存策略对象
3、缓存检测
4、禁止使用网络(根据缓存策略),缓存又无效,直接返回
5、缓存有效,不使用网络
6、缓存无效,执行下一个拦截器
7、本地有缓存,根具条件选择使用哪个响应
8、使用网络响应
9、 缓存到本地
6. 连接池
通过 ConnectInterceptor 拦截器实现连接操作,Recall的initExchange方法寻找一个可用的连接
ConnectionPool代理类RealConnectionPool控制所有的连接操作,默认最大连接数5个,默认保活时间5分钟
7.Http连接保活
http长连接
TCP
理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
-
TCP如何保证数据包的顺序
发送机在每次发送数据时,会给每个数据包分配一个序列号,并在特定的时间内等待接收机对发送机分配序列号的确认。
发送机将已经发送的数据存储在缓存中,如果特定时间内没有收到接收机对发送机分配序列号的确认,则重复发送此数据包,如果在定时器超时之前收到确认,则将数据包占用的缓存释放。
接收机收到数据包后按照序列号将数据包按顺序重组,并传给上层使用。
-
TCP如何实现可靠性传输?
1.应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。
2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。
3.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
4.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
5.既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。[2]
6.TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
-
如果TCP传输过程中服务器挂了会发生什么
-
服务器主机崩溃
模拟操作:当客户端和服务器成功连接之后,拔掉服务器的网线,此时从客户端发送数据分节。这样同时也模拟了客户端发送的数据不可达服务端的情景(即建立连接后某些中间路由器不工作)。
产生后果:客户端会持续重传未收到确认的数据分节(TCP软件负责),持续一段时间后仍未收到确认则放弃(通常是9分钟)。如果是服务器崩溃则本机TCP软件会向用户进程显示套接字错误并置错误码,如果是中间路由器判定服务器主机不可达则会返回一个ICMP消息,那么TCP软件收到该ICMP消息会向用户进程显示套接子错误并置错误码。我们可以通过错误码来判断到底是哪种错误。
-
服务器崩溃后重启
模拟操作:当客户端和服务器成功连接之后,拔掉服务器的网线,然后将该服务器关机重启。再重新插上网线。
产生后果:当服务器崩溃后重启时,它已经丢失了崩溃前所有的连接信息,因此服务器对于所收到的客户数据分节响应一个RST分节。客户端的TCP软件收到RST分节之后会向 用户进程显示套接字错误并置错误码。
-
服务器主机关机
Unix系统关机时,init进程通常会给所有的进程发送SIGTERM信号,等待一段时间后如果还有一些进程仍在运行,init进程会发送SIGKILL信号强行终止。当服务器进程被终止时,其所有打开的文件描述符被关闭,会发送FIN分节给对端。设计良好的客户程序可以立即监视该种情况的发生。
-
Http/Https
-
现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
答:现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开? 在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免
-
一个 TCP 连接可以对应几个 HTTP 请求?
答:一个 TCP 连接是可以发送多个 HTTP 请求的。
-
一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
答:HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两个请求的生命周期不能重叠,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。
虽然 HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。
HTTP2 提供了 Multiplexing 多路传输特性,可以在一个 TCP 连接中同时完成多个 HTTP 请求。
-
为什么有的时候刷新页面不需要重新建立 SSL 连接?
答:TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也会用之前的。
-
浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
答:有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。