大家在做项目时,网络库肯定是必备的,在早期还会有各种网络库对比与选择,直至 okhttp 的出现,打破了对比的格局,大部分项目都齐刷刷的使用okhttp,即便后期又出了非常火的retrofit,本质也只是对 okhttp 的使用的封装。
既然是开发中必用,那么掌握好相关原理可以让我们用好 okhttp,学好网络优化的知识也可以打磨App,当然:
okhttp 原理以及网络相关优化也几乎是现在高阶面试必问的问题了。
一些同学可能觉得 okhttp,不就是网络请求嘛,不就是准备好url,参数,然后等个结果就好了。
这样就始终停留在使用的视角了,长期这样极其不利于自己成长,长期就变成了熟练的工具人,发个请求、等个结果换个新人来做有什么区别吗?
那么,如何破局,沉淀个人技术能力呢?
一个简单的转变:始终以原理视角&多思考:
-
它本质要解决什么问题?
-
执行的大体流程是?每个环节要解决哪些问题?
-
它这个环节为什么这样设计?设计好在哪?
-
基于它各个环节的实现,我可以做哪些优化?
-
优化的实际效果咋样,适用于哪些场景,沉淀实际的优化经验;
例如 okhttp本质上是做网络请求,那么okhttp必须要要完成:DNS,建立 TCP/IP 链接,HTTPS 握手与证书校验,构建、发送、接收 HTTP 报文等。
那么okhttp 分别是如何实现上述环节呢?这些环节中哪些部分可以优化呢?
我们原理视角,可以做几个提问:
-
DNS的原理是什么,我们常说的 HTTP DNS 原理是什么?
-
建立连接比较耗时,那么可不可以搞连接池?okhttp 内部是如何实现的?
-
okhttp 为什么最终要通过socket来完成请求?
-
HTTPS 证书校验流程规范应该如何做?如果我想做双向认证该如何做?
-
又例如我一些核心的请求,我能不能提前把连接创建好,称之为「预连接」?
-
对于低频更新的请求能否做缓存?缓存是否要遵循 HTTP 缓存协议?HTTP 缓存协议需要后端配合吗?
可以看到仅观察其一个流程,就有这么多知识需要我们去掌握。
如果再看看其架构,那又要面临新一波的思考了:
-
okhttp 的拦截器设计的非常好,扩展性极强,那么这部分它是基于哪些设计模式?具体如何实现的呢?
-
okhttp 其内部多个请求的任务管理,返回结果的分发是如何设计的?
-
okhttp 内部的连接池是如何实现的?缓存多少连接,缓存多久,何时释放资源?
把上述问题弄清楚,基本也就覆盖了高阶面试环节中的各种相关问题了。
可以看到基于原理视角,我们甚至可以走在面试官的前面。
当然仅仅靠一个okhttp 的源码,自己完整的学会其中的原理、架构剖析、一些细节的魅力是很困难的,至于优化就更困难了,因为需要相关问题背景,所以在此面对面试难题,面对Okhttp底层原理,为了帮助大家彻底掌握我们Okhttp的具体使用方法,本次特邀腾讯课堂前三星/小米高级研发经理整理了一份《网络协议》学习资料,手把手带大家深入Okhttp源码层探究原理,带你玩转不一样的Okhttp
《网络协议》
一、5 层协议体系结构
- 各层作用
- 数据封装与解封装
二、TCP、UDP 协议
- TCP
- UDP
三、HTTP
- HTTP 的连接方式
四、TCP/IP 协议简介
- IP
- TCP
五、跟 TCP/IP 学协议设计
- 协议版本如何升级?
- 如何发送不定长数据的数据包
- 上传多个文件,只有所有文件都上传成功时才算成功
- 如何保证数据的有序性
- 如何保证对方收到了消息
六、Socket
- Socket 基本用法
- Socket、ServerSocket 傻傻分不清楚
- Socket 长连接的实现
七、WebSocket
- WebSocket 握手
- 客户端的简单示例
- 客户端 API
- 构造函数
- WebSocket 服务器
…
…
…
十、Retrofit 使用
- Retrofit 入门
- Retrofit 注解详解
- Gson 与 Converter
- RxJava 与 CallAdapter
- 自定义 Converter
- 自定义 CallAdapter
- 其它说明
十一、Retrofit 原理
- 什么是动态代理?
- 源码解析
- Retrofit 是如何将子线程切换到主线程?
- Retrofit 为什么要使用动态代理?
- 总结
十二、Retrofit 面试
十三、Netty 之搭建服务端与客户端
十四、Netty 之 Encoder、Decoder、Handler 的使用
十五、Netty 之心跳处理、断线重连
十六、Netty 之粘包、拆包,处理
十七、Netty 之创建 Web 服务、作为 HTTP 服务器
由于篇幅原因,就不多加展示了,有需要的同学,可以点击下方卡片扫码免费领取