注册

搞懂Socket通信(一)



搞懂Socket通信(一)



Socket 在编程中并不陌生,即时通信、推送的应用场景也都是用到它。对于做Android的小伙伴来说,自己也很少的去写底层的逻辑,相应的是去使用第三方的开源框架,当然在一般场景下,第三方基本都能满足需求了,但对于极端的场景,当第三方框架满足不了的时候,还是需要自己去了解它。



一、七层协议


开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型,是国际标准化组织提出。


在OSI模型中,通信分为七层模型


简单一点,也可以分为TCP/IP四层模型,或者五层模型,看图更方便理解。


1.png


图片来源


我们知道:IP协议对应网络层、TCP协议和UDP协议对应传输层、HTTP协议对应应用层


那么Socket在哪里?


2.jpg


图片来源


二、Socket 是什么


Socket 不是协议,是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。


它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。


我们仅需要操作Socket来处理数据,而无需关心复杂的TCP/IP


三、有哪些基于Socket的协议


Socket是应用层与TCP/IP协议族通信的中间软件抽象层。


所以基于TCP/IP的协议都是基于Socket


比如HTTP协议,是基于TCP/IP协议之上的应用层协议


3.1 疑问


既然都是基于TCP/IP,那么我们知道Http访问完毕之后,是一次性访问,为什么我们用Socket实现TCP却是长连接,以流的形式发送数据呢。


3.2 解答


这是因为Http在请求时去建立TCP连接,完毕之后,就释放了TCP连接。


下面这个例子可以诠释http的流程。


例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:



  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;


  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;


  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;


  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;


  5. 释放 TCP连接;


  6. 浏览器将该 html 文本并显示内容;  



三、Android中长连接框架



  1. Apache MINA


  2. OKHttp中的 webSocket


  3. socketIo



...


这是笔者在开发安卓中使用过的长连接框架


后来才开始自己封装Socket,自己实现心跳机制、断线重连机制。


下一篇讲如何实现。

0 个评论

要回复文章请先登录注册