Websocket只是一个网络通讯协议,就像 http、ftp等都是网络通讯的协议同样;
相对于HTTP这种非持久的协议来讲,Websocket是一个持久化网络通讯的协议;html
WebSocket和HTTP的关系web
有交集,可是并非所有。
Websocket只是借用了HTTP的一部分协议来完成一次握手。(HTTP的三次握手,此处只完成一次)ajax
Http 协议浏览器
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求创建联机;服务器
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包websocket
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则链接创建成功。网络
完成三次握手,主机A与主机B开始传送数据。并发
Long poll 和Ajax轮询以及WebSocket的原理app
1、Ajax轮询的原理。socket
场景以下:
客户端:啦啦啦,有没有新信息(Request)
服务端:没有(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:没有。。(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:好啦好啦,有啦给你。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:。。。。。没。。。。没。。。没有(Response) ---- loop
代码:
var polling = function(url, type, data){ var xhr = new XMLHttpRequest(), type = type || "GET", data = data || null; xhr.onreadystatechange = function(){ if(xhr.readyState == 4) { receive(xhr.responseText); xhr.onreadystatechange = null; } }; xhr.open(type, url, true); //IE的ActiveXObject("Microsoft.XMLHTTP")支持GET方法发送数据, //其它浏览器不支持,已测试验证 xhr.send(type == "GET" ? null : data); }; var timer = setInterval(function(){ polling(); }, 1000);
二、long poll的原理。
long poll 其实原理跟 ajax轮询 差很少,都是采用轮询的方式,不过采起的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,
客户端发起链接后,若是没消息,就一直不返回Response给客户端。直到有消息才返回,返回完以后,客户端再次创建链接,周而复始。
场景以下:
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:额。。 (等待到有消息的时候)。。来 给你(Response)
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
客户端:啦啦啦啦,有新信息么?
服务端:月线正忙,请稍后再试(503 Server Unavailable)
客户端:。。。。好吧,啦啦啦,有新信息么?
服务端:月线正忙,请稍后再试(503 Server Unavailable)
客户端:
代码:
var longPoll = function(type, url){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ // 状态为 4,数据传输完毕,从新链接 if(xhr.readyState == 4) { receive(xhr.responseText); xhr.onreadystatechange = null; longPoll(type, url); } }; xhr.open(type, url, true); xhr.send(); }
而后服务端在一旁忙的要死:冰箱,我要更多的冰箱!更多。。更多。。
从上面能够看出其实这两种方式,都是在不断地创建HTTP链接,而后等待服务端处理,能够体现HTTP协议的另一个特色,被动性。
何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。
缺陷:
从上面很容易看出来,无论怎么样,上面这两种都是很是消耗资源的。
ajax轮询 须要服务器有很快的处理速度和资源。(速度)
long poll 须要有很高的并发,也就是说同时接待客户的能力。(场地大小)
因此ajax轮询 和long poll 都有可能发生这种状况。
三、WebSocket的原理。
这时Websocket出现了。
他解决了HTTP的这几个难题。
首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就能够主动推送信息给客户端啦。
因此上面的情景能够作以下修改。
客户端:啦啦啦,我要创建Websocket协议,须要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
服务端:balabalabalabala
服务端:balabalabalabala
服务端:哈哈哈哈哈啊哈哈哈哈
服务端:笑死我了哈哈哈哈哈哈哈
可是Websocket只须要一次HTTP握手,因此说整个通信过程是创建在一次链接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(固然客户端仍是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不须要占用自己速度就慢的客服(Handler)了
父亲节快到了,常回家看看!
树欲静而风不止,子欲孝而亲不在!