ws+socket.io 精读Websocket原理大全需知,以及具体使用


ws+socket.io 精读Websocket原理大全需知,以及具体使用

文章插图
 
前言服务器和客户端保持长连接通信,实现方式比较多 。有很多成熟的框架可以完成,底层无非都是对Socket流的封装和使用 。
一、SOCKET原理Socket大致是指在端到端的一个连接中,这两个端叫做Socket 。
HTTP是基于传输层的TCP协议的,而Socket API也是,所以只是从使用上说,可以认为Socket和HTTP类似(HTTP是成文的互联网协议,Socket是一直沿用的一种编程概念),是对于传输层协议的另一种直接使用 。
1.1套接字(socket)概念套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元 。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:
  • 连接使用的协议,
  • 本地主机的IP地址,
  • 本地进程的协议端口,
  • 远地主机的IP地址,
  • 远地进程的协议端口
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题 。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据 。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口 。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务 。
1.2 建立socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认 。
服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求 。
客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字 。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求 。
连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接 。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求 。
注意,Socket并不是一种协议,更多的是为了方便开发者提供友好的编程方式 。Socket通过门面模式实现了对TCP/IP的封装,它实际对上层提供了一系列的接口,以方便我们在自己的应用中操作,而不必理会复杂的TCP/IP处理 。这一网络层次属于数据传输层 。
 
ws+socket.io 精读Websocket原理大全需知,以及具体使用

文章插图
 
二、WebSocketWebSocket protocol 是html5一种新的协议 。目前除了IE浏览器,其他浏览器都基本支持 。它实现了浏览器与服务器全双工通信(full-duplex) 。一开始的握手需要借助HTTP请求完成 。
他的目的是,即时通讯,替代轮询 。网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等 。按照以往的技术能力通常是采用轮询、Comet技术解决 。
2.1 轮询的缺点:HTTP协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据 。当需要即时通讯时,通过轮询在特定的时间间隔(如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器 。
这样的方法最明显的缺点就是需要不断的发送请求,而且通常HTTP request的Header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带 。
HTTP1.1默认使用长连接,使用长连接的HTTP协议,会在响应头中加入下面这行信息: Connection:keep-alive
然而WebSocket的出现可以弥补这一缺点 。在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送 。
2.2 WebSocket原理WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的 。
WebSocket是一种在单个TCP连接上进行全双工通信的协议 。WebSocket API也被W3C定为标准 。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 。


推荐阅读