通俗易懂的websocket原理

作者: Viaphlyn | 来源:发表于2017-10-14 19:25 被阅读45次

    一、是什么

    WebSocket 是一种网络通信协议,它规范定义了一种 API,可在网络浏览器和服务器之间建立“套接字”连接。简单地说:客户端和服务器之间存在持久的连接,而且双方都可以随时开始发送数据。

    二、Websocket和ajax轮询,长轮询对比

    • 1.ajax轮询:让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
      • 优点:后端程序编写比较容易。
      • 缺点:请求中有大半是无用,轮询的效率低,浪费带宽和服务器资源(必须不停连接,或者 HTTP 连接始终打开),被动性, 需要服务器有很快的处理速度和资源。(速度)
      • 实例:适于小型应用。

    客户端:啦啦啦,有没有新信息(Request)
    服务端:没有(Response)
    客户端:啦啦啦,有没有新信息(Request)
    服务端:没有。。(Response)
    客户端:啦啦啦,有没有新信息(Request)
    服务端:你好烦啊,没有啊。。(Response)
    客户端:啦啦啦,有没有新消息(Request)
    服务端:好啦好啦,有啦给你。(Response)
    客户端:啦啦啦,有没有新消息(Request)
    服务端:。。。。。没。。。。没。。。没有(Response) ---- loop

    • 2.long poll:采取的是阻塞模型(一直打电话,没收到就不挂)
      客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
      • 优点:在无消息的情况下不会频繁的请求,耗费资源小。
      • 缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
      • 实例:WebQQ、Hi网页版、Facebook IM。

    场景再现客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
    服务端:额。。 等待到有消息的时候。。来 给你(Response)
    客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop

    • ajax轮询和long pull都可能出现以下情况:

    客户端:啦啦啦啦,有新信息么?
    服务端:月线正忙,请稍后再试(503 Server Unavailable)
    客户端:。。。。好吧,啦啦啦,有新信息么?
    服务端:月线正忙,请稍后再试(503 Server Unavailable)

    • HTTP还是一个无状态协议
      通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。
    • 3.websocket:服务端就可以主动推送信息给客户端啦。
      • 优点: 只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你),也避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求

    客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
    服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
    客户端:麻烦你有信息的时候推送给我噢
    服务端:ok,有的时候会告诉你的
    服务端:balabalabalabala
    服务端:哈哈哈哈哈啊哈哈哈哈
    服务端:笑死我了哈哈哈哈哈哈哈

    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 17
    

    相关文章

      网友评论

        本文标题:通俗易懂的websocket原理

        本文链接:https://www.haomeiwen.com/subject/nmktuxtx.html