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