WebSocket
WebSocket
TCP的三次握手与四次分手
三次握手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
握手过程:
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认; 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手;

四次分手:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
操作:
客户端A发送一个
FIN,用来关闭客户A到服务器B的数据传送。服务器B收到这个
FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。服务器B关闭与客户端A的连接,发送一个
FIN给客户端A。客户端A发回
ACK报文确认,并将确认序号设置为收到序号加1。

参考: 1. http://www.cnblogs.com/Jessy/p/3535612.html 2. https://www.zhihu.com/question/24853633
WebSocket简介
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——可以通俗的解释为服务器主动发送信息给客户端。 只需要经过一次HTTP请求,就可以做到源源不断的信息传送了(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我)。
客户端请求:
Upgrade: websocket、Connection: Upgrade表示希望将http协议升级到Websocket协议。 Sec-WebSocket-Key是一个经过base64编码的随机字节。 Sec-WebSocket-Protocol表示客户端支持的协议列表。 Sec-WebSocket-Version:是告诉服务器所使用的Websocket Draft(协议版本)。 Origin字段是可选的,表示在浏览器中发起此Websocket连接所在的页面。
服务端响应:
Sec-WebSocket-Accept:是把Sec-WebSocket-Key加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进行BASE-64编码,将结果做为Sec-WebSocket-Accept头的值,返回给客户端。
实例
服务器端:
客户端:
运行后:
参考:websocket
WebSocket原生事件
事件
事件处理程序
描述
open
Socket.onopen
连接建立时触发
message
Socket.onmessage
客户端接收服务端数据时触发
error
Socket.onerror
通信发生错误时触发
close
Socket.onclose
连接关闭时触发
WebSocket原生方法
方法
描述
Socket.send()
使用连接发送数据
Socket.close()
关闭连接
readyState
特性常量
取值
状态
WebSocket.CONNECTING
0
连接正在进行中,但还未建立
WebSocket.OPEN
1
连接已建立,消息可以开始传递
WebSocket.CLOSING
2
连接正在进行关闭
WebSocket.CLOSED
3
连接已关闭
连接池
每一个连接都放到一个数组中,组成连接池。
为了区分每个连接,可以添加UUID ,通用唯一识别码(Universally Unique Identifier)
Last updated
Was this helpful?