学习资料链接

RxJava

参考文章
中文文档
Flowable
RxLifecycle
面试题

  • 内部线程切换原理
  • 操作符有哪些
  • 如何解决内存泄漏
  • RxJava 中 Observable、Flowable、Single、Maybe、Completable 使用时如何选择?
  • 为什么 subscribeOn() 只有第一次切换有效
  • 操作符 map 和 flatmap 的区别?

Okhttp

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. 缓存实现

Okhttp缓存

1、如果在 OKHttpClient 中配置了 cache,则从缓存中获取,但是不保证就存在

2、拿到当前请求,缓存拿到缓存策略对象

3、缓存检测

4、禁止使用网络(根据缓存策略),缓存又无效,直接返回

5、缓存有效,不使用网络

6、缓存无效,执行下一个拦截器

7、本地有缓存,根具条件选择使用哪个响应

8、使用网络响应

9、 缓存到本地

6. 连接池

  • 通过 ConnectInterceptor 拦截器实现连接操作,Recall的initExchange方法寻找一个可用的连接

  • ConnectionPool代理类RealConnectionPool控制所有的连接操作,默认最大连接数5个,默认保活时间5分钟

7.Http连接保活

http长连接

TCP

TCP总结大全

跟着动画来学习TCP三次握手和四次挥手

TCP面试题

TCP滑动窗口

理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

  • TCP如何保证数据包的顺序

    1. 发送机在每次发送数据时,会给每个数据包分配一个序列号,并在特定的时间内等待接收机对发送机分配序列号的确认。

    2. 发送机将已经发送的数据存储在缓存中,如果特定时间内没有收到接收机对发送机分配序列号的确认,则重复发送此数据包,如果在定时器超时之前收到确认,则将数据包占用的缓存释放。

    3. 接收机收到数据包后按照序列号将数据包按顺序重组,并传给上层使用。

  • 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传输过程中服务器挂了会发生什么

    1. 服务器主机崩溃

      模拟操作:当客户端和服务器成功连接之后,拔掉服务器的网线,此时从客户端发送数据分节。这样同时也模拟了客户端发送的数据不可达服务端的情景(即建立连接后某些中间路由器不工作)。

      产生后果:客户端会持续重传未收到确认的数据分节(TCP软件负责),持续一段时间后仍未收到确认则放弃(通常是9分钟)。如果是服务器崩溃则本机TCP软件会向用户进程显示套接字错误并置错误码,如果是中间路由器判定服务器主机不可达则会返回一个ICMP消息,那么TCP软件收到该ICMP消息会向用户进程显示套接子错误并置错误码。我们可以通过错误码来判断到底是哪种错误。

    2. 服务器崩溃后重启

      模拟操作:当客户端和服务器成功连接之后,拔掉服务器的网线,然后将该服务器关机重启。再重新插上网线。

      产生后果:当服务器崩溃后重启时,它已经丢失了崩溃前所有的连接信息,因此服务器对于所收到的客户数据分节响应一个RST分节。客户端的TCP软件收到RST分节之后会向 用户进程显示套接字错误并置错误码。

    3. 服务器主机关机

      Unix系统关机时,init进程通常会给所有的进程发送SIGTERM信号,等待一段时间后如果还有一些进程仍在运行,init进程会发送SIGKILL信号强行终止。当服务器进程被终止时,其所有打开的文件描述符被关闭,会发送FIN分节给对端。设计良好的客户程序可以立即监视该种情况的发生。

Http/Https

参考文章

Http面试题

  • 现代浏览器在与服务器建立了一个 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 连接。不同的浏览器有一些区别。

Retrofit

你可能感兴趣的:(学习资料链接)