Scoket是基于TCP/IP的封装使用,所以我们先简单了解一下TCP/IP。
TCP/IP协议简介
IP
IP协议提供了主机到主机之间的通信,为了完成不同主机之间的通信,我们需要给每个主机提供一个唯一的身份标识,这个标识就是IP地址,有了地址,IP协议就可以把数据发送给对应的主机。
TCP
TCP协议是在IP协议的基础上,通过端口号来区别主机上的进程,实现了进程到进程间的通信。
特点:面向连接、面向字节流、全双工通信、可靠
面向连接:使用TCP传输数据,就必须要先建立TCP连接,数据发送完成后要结束TCP连接。
面向字节流:传输的数据流过大的话,TCP报文长度有限,需要分成几块发送,接收方要按顺序接收并且重组数据流。
双全工通信:建立TCP连接之后,通信双方都可以随时发送数据。
可靠:通过TCP连接传送的数据,不会丢失,保持发送的顺序。
TCP的连接建立:
- 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。
- 第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认。
- 第三次握手:客户端收到服务器的(SYN+ACK)报文段,并向服务器发送ACK报文段。
端口
端口号规定为16位,即允许IP主机拥有65535个不同的端口号。
其中:
- 0~1023:分配给系统的端口号。
- 1024~49151:登记端口号,主要是让第三方应用使用
- 49152~65535:短暂端口号,是留给客户进程选择暂时使用,一个进程使用完就可以供其他进程使用
在Socket使用时,可以用1024~65535的端口号
Scoket
- 套接字,是对TCP/IP协议进行封装的接口。
- 成对出现,一对套接字, Socket ={(IP地址1:PORT端口号),(IP地址2:PORT端口号)}
Scoket和Http的对比
- Socket:采用服务器主动发送数据的方式,即服务端可以主动向客户端发送信息。
- Http:采用请求—响应方式,即客户端先向服务端发送请求,客户端才响应返回数据。
WebScoket
- WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据。
- 通常它表示为:ws://echo.websocket.org/?encoding=text HTTP/1.1,可以看到除了前面的协议名和http不同之外,它的表示地址就是传统的url地址。
基于浏览器端的web技术,那么它的通信肯定少不了http,websocket本身虽然也是一种新的应用层协议,但是它也不能够脱离http而单独存在。
具体来讲,我们在客户端构建一个websocket实例,并且为它绑定一个需要连接到的服务器地址,当客户端连接服务端的时候,会向服务端发送一个类似下面的http报文,注意该报文中有一个upgrade首部,它的作用是告诉服务端需要将通信协议切换到websocket,如果服务端支持websocket协议,那么它就会将自己的通信协议切换到websocket,同时发给客户端类似于以下的一个响应报文头,返回的状态码为101,表示同意客户端协议转换请求,并将它转换为websocket协议。
以上过程都是利用http通信完成的,称之为websocket协议握手(websocket Protocol handshake),进过这握手之后,客户端和服务端就建立了websocket连接,以后的通信走的都是websocket协议了。所以总结为websocket握手需要借助于http协议,建立连接后通信过程使用websocket协议。同时需要了解的是,该websocket连接还是基于我们刚才发起http连接的那个TCP连接。一旦建立连接之后,我们就可以进行数据传输了,websocket提供两种数据传输:文本数据和二进制数据。
基于以上分析,我们可以看到,websocket能够提供低延迟,高性能的客户端与服务端的双向数据通信。它颠覆了之前web开发的请求处理响应模式,并且提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发。