okhttp源码解析-HTTP协议通信

534 阅读3分钟

       最近做了较多与其他外部系统对接的工作,其中大部分都是通过okhttp工具类对接完成的,作为资深用户对okhttp框架的简单实用赞叹不已。借此机会,我想好好复习下以前的知识,结合踩到的几个坑对框架的实现原理探索一番。

其实okhttp框架面世其实有一段年头,但我还是想通过这些业务实现对okhttp做一个总的概括总结。这个系列包括了: http的相关知识原理、okhttp的简单应用、框架与核心功能模块的实现原理、实战踩坑等内容组成。

概括起来说OkHttp是一款优秀的HTTP通信框架,它支持get请求和post请求,支持基于Http/Https的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。官网网站: square.github.io/okhttp/,里面你想要得到的内容应有尽有。

作为常年crud的后台开发, 我们首先先回忆下网络通信(HTTP/TCP)等相关内容,比如网络的分层结构是怎样的?一次完整的HTTP请求过程发生了什么?http协议包里面有什么东西?

     以ISO的四层网络模型来分析HTTP协议。作为发送端的客户端在应用层发出一个想看某个WEB页面的请求,为了传输方便,在传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在每个报文上打上标记序号以及端口发送到网络层。在网络层(IP协议),增加作为的目的地地址的MAC地址后转发给链路层,这样以来,发送网络的通信就准备齐全了。接收端在链路层收到数据后,按序往上层发送,一直到应用层。

        从上面看到HTTP协议跟TCP/IP协议是密切相关的,其实一个完整的HTTP网络请求,还是有很多协议相关的,我们通过下图可以了解到TCP/IP协议和DNS服务在HTTP协议的通信中是怎样配合起来的呢?其实可以看到客户端在请求时是先要去DNS服务器拿到目标服务器的IP地址的,然后在使用TCP/IP协议进行通信的。

       我们了解了HTTP协议整个通信过程,更了解下HTTP协议交互的信息(HTTP报文) ,其中报文是HTTP通信的最小单位,由8位组字节流组成,通过HTTP通信传输,HTTP报文可以分为报文首和报文主体两块,两者由最初出现的空行(CR回车符+LF换行符)来划分。报文主体主要用于传输请求或响应的实体主体,实体作为请求或响应的有效负荷数据被传输,其内容由实体首部和主体组成。

        这面几个图能够帮大家简单、快速地重拾起HTTP协议通信的相关内容,可以更加快速地理解okhttp框架的实现原理。