搞懂Socket通信(一)
搞懂Socket通信(一)
Socket 在编程中并不陌生,即时通信、推送的应用场景也都是用到它。对于做Android的小伙伴来说,自己也很少的去写底层的逻辑,相应的是去使用第三方的开源框架,当然在一般场景下,第三方基本都能满足需求了,但对于极端的场景,当第三方框架满足不了的时候,还是需要自己去了解它。
一、七层协议
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型,是国际标准化组织
提出。
在OSI模型中,通信分为七层模型
简单一点,也可以分为TCP/IP四层模型,或者五层模型,看图更方便理解。
(图片来源)
我们知道:IP协议对应网络层、TCP协议和UDP协议对应传输层、HTTP协议对应应用层
那么Socket
在哪里?
(图片来源)
二、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,按下回车之后会经历以下流程:
-
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
-
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
-
浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
-
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
-
释放 TCP连接;
-
浏览器将该 html 文本并显示内容;
三、Android中长连接框架
-
Apache MINA
-
OKHttp中的 webSocket
-
socketIo
...
这是笔者在开发安卓中使用过的长连接框架
后来才开始自己封装Socket,自己实现心跳机制、断线重连机制。
下一篇讲如何实现。