OSI模型
- 应用层:各种应用层协议,Http、WebSocket、FTP、SMTP等
- 表示层:信息的语法语义以及他们的关联,如加密解密、转换翻译、压缩解压缩
- 会话层:不同机器上的用户之间建立及管理会话
- 传输层:接受上一层的数据,在必要的时候把数据进行分割,并将这些数据提交给网络层,且保证这些数据段有效到达对端。TCP、UDP协议。
- 网络层:控制子网的运行,如逻辑编址、分组传输、路由选择。IP
协议。 - 数据链路层:物理寻址,同时将原始比特流转变为逻辑传输线路。
- 物理层:机械、电子、定时接口通信信道上的原始比特流传输。
Http协议
Http协议,超文本传输协议,web上一问一答的两台计算机之间遵循的通信规则。
- 请求组成:请求行、请求头、请求空行、请求主体
- 响应组成:响应状态行、响应头、响应空行、响应正文
Socket协议
Socket是为了方便开发者直接使用更底层协议(一般是TCP或UDP)而存在的一个抽象层。Socket实际上是对TCP/IP协议的封装,本身并不是协议,而是一个调用接口(API)。
Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write。
主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须需要底层TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻找网络中的主机。我们知道网络层使用IP协议可以帮助我们根据IP地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过TCP或UDP的地址也就是端口号来指定。这样就可以通过一个Socket实例唯一代表一个主机上的一个应用程序的通信链路了。
WebSocket协议
基于Http协议的扩展,支持长连接,用于建立客户端和服务器的双向通道。
而传统的轮询方式(即采用http协议不断发送请求)的缺点:浪费流量(http请求头比较大)、浪费资源(没有更新也要请求)、消耗服务器
CPU占用(没有信息也要接收请求)。
WebSocket是保证只要在服务端和客户端建立连接后任何一端发起消息,相互推送消息,效率也是极大的提高了,并且服务端和客户端之间的标头信息很小,可以降低服务端的资源浪费。
Http、Socket与TCP
TCP协议对应与传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。
Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立起一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。
那么为什么Http是无状态的短连接,而TCP是有状态的长连接?Http不是建立在TCP的基础上吗,为什么还能是短连接?原来,Http就是在每次请求完成后就把TCP连接关了,所以是短连接。而我们通过Socket编程使用TCP协议的时候,我们自己可以通过代码去控制什么时候打开连接,什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着。
Socket实际上是对TCP/IP协议的封装,本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write。
比较形象的比喻:Http协议是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。从编程的角度来讲,为了方便,你可以直接选择已经制造好的轿车Http来与服务器交互。但是有时候往往因为环境因素或者其它的一些定制的请求,必须要使用TCP协议,这时就需要使用Socket编程,然后自己去处理获取的数据。就像是你用已有的发动机,自己造了一辆卡车,去与服务器交互。
WebSocket、HTTP与TCP
Http、WebSocket等协议属于应用层协议,IP协议工作在网络层,TCP协议工作在传输层。HTTP、WebSocket等应用层协议,都是基于TCP协议来传输数据的。
对于WebSocket来说,它必须依赖Http协议进行一次握手,握手成功后,数据就直接从TCP通道传输,与Http无关了。
Socket与WebSocket
Socket其实并不是一个协议,它工作在OSI模型会话层,是为了方便大家直接使用更底层协议(一般是TCP或UDP)而存在的一个抽象层。
而WebSocket是一个完整的应用层协议,包含一套完整的api。
所以WebSocket更方便,而Socket更灵活。