1 WebSocket本质上是一种计算机网络应用层的协议,用来弥补HTTP协议在持久通信能力上的不足,它的握手是以HTTP的形式发起的,通过第一个request建立连接,之后交换的数据都不需要发送HTTP header就能交换数据。
客户端开始建立 WebSocket 连接时要发送一个 header 标记了 Upgrade 的 HTTP 请求,表示请求协议升级。
所以服务器端做出响应的简便方法是,直接在现有的 HTTP 服务器软件和现有的端口上实现 WebSocket 协议,重用现有代码(比如解析和认证这个 HTTP 请求。如果在 TCP 协议上实现,这两个功能就要重新实现),然后再回一个状态码为 101 的 HTTP 响应完成握手,再往后发送数据时就没 HTTP 的事了。
客户端发送的数据格式如下:
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080Sec-
WebSocket-Version: 13
ps1:计算机网络里还有socket关键字,这里的socket指的是运输层协议的某一端,泛指某个应用程序。
ps2: unix编程里还有一个socket接口,这里的译名是套接字,泛指应用层协议的端口号。
2 不同的UTL可以复用同一个WebSocket连接。
3 WebSocket 是以类似Socket 的TCP 长连接通讯模式,是全双工方式, 和HTTP一样都是基于TCP协议。
4 客户端与服务器之间的中间网络链路节点可能会认为一份连接在第一段时间内没有数据发送就等于失效,会自作主张的切断这些连接。解决方法:WebSocket让服务器和客户端能够发送Ping/Pong Frame,这种Frame是一种特殊的Frame,它只包含一些元数据而不需要真正的Data PayLoad,可以在不影响Application 的情况下维持住中间网络的连接状态。
5 a. Http1.1 中Http Keep-alive: 是指在一次TCP连接中完成多个HTTP请求,但是每个请求要单独发送Header。
b. Polling(轮训) 是指客户端(一般指浏览器)不断主动的向服务器发送HTTP请求查询是否有新数据 。
c. 这两种模式共同的缺点:除了真正的数据外,服务器和客户端还要大量交换HTTP Header, 信息交换效率很低。
好处:不需要对现有HTTP Server和浏览器架构做修改就能实现。
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求。
缺点:服务器hold连接会消耗资源。
实例:WebQQ、Hi网页版、Facebook IM.
polling code:
(function poll(){
setTimeout(function(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
//Setup the next poll recursively
poll();
}, dataType: "json"});
}, 30000);
})();
long polling code:
(function poll() {
setTimeout(function() {
$.ajax({ url: "server", success: function(data) {
sales.setValue(data.value);
}, dataType: "json", complete: poll });
}, 30000);
})();
另外,对于长连接和socket连接也有区分:
长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天
Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。
参考文档https://www.zhihu.com/question/20215561
(sanyaoxu_2) |