财富坊cff888
  • 删除
  • 一、websocket与http

    WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)
    首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解
    有交集,但是并不是全部。
    另外html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样。
    再简单来说,层级不一样。

    二、Websocket是什么样的协议,具体有什么优点

    首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
    HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。
    在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。
    教练,你BB了这么多,跟Websocket有什么关系呢?(:з」∠)好吧,我正准备说Websocket呢。。
    首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
    首先我们来看个典型的 Websocket 握手(借用Wikipedia的。。)
    GET /chat HTTP/1.1
    Host:server.example.com
    Upgrade: websocket
    Connection:Upgrade
    Sec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol:chat, superchat
    Sec-WebSocket-Version:13
    熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。
    Upgrade: websocket
    Connection:Upgrade
    这个就是Websocket的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。
    Sec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol:chat, superchat
    Sec-WebSocket-Version:13
    首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。
    然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~
    最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦~大家都使用的一个东西~ 脱水: 服务员,我要的是13岁的噢→_→
    然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦!
    HTTP/1.1 101Switching Protocols
    Upgrade: websocket
    Connection:Upgrade
    Sec-WebSocket-Accept:HSmrc0sMlYUkAGmm5OPpG2HaGWk=
    Sec-WebSocket-Protocol:chat
    这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~
    Upgrade: websocket
    Connection:Upgrade
    依然是固定的,告诉客户端即将升级的是 Websocket 协议,而不是mozillasocket,lurnarsocket或者shitsocket。
    然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。
    后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。
    至此,HTTP已经完成它所有工作了,接下来就是完全按照Websocket协议进行了。具体的协议就不在这阐述了。
    ——————技术解析部分完毕——————
    那到底Websocket有什么鬼用, http long poll ,或者ajax轮询 不都可以实现实时信息传递么?

    三、Websocket的作用

    在讲Websocket之前,我就顺带着讲下 long poll 和 ajax轮询 的原理。
    ajax轮询
    ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
    long poll
    long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

    从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。

    ajax轮询 需要服务器有很快的处理速度和资源。(速度)long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
    所以 ajax轮询 和 long poll 都有可能发生这种情况。
    客户端:啦啦啦啦,有新信息么?
    服务端:月线正忙,请稍后再试(503 Server Unavailable)
    其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(php等)来处理。简单地说,我们有一个非常快速的 接线员(Nginx) ,他负责把问题转交给相应的 客服(Handler) 。

    本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
    这样就可以解决客服处理速度过慢的问题了。
    同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info (鉴别信息),来告诉服务端你是谁。
    虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
    但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
    同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了

    阅读全文

    Websocket协议概念、技术背景和原理介绍

    WebSocket是一种在单个 TCP 连接上进行全双工通讯的协议。本篇主要对websocket的概念和技术背景和原理做一个介绍。...
    • u013067629
    • u013067629
    • 2016年09月10日 10:00
    • 2625

    WebSocket原理及技术简介

    WebSocket原理及技术简介 目录 1????引言????1 2????WebSocket技术及协议????2 2.1????WebSocket API????2 2.1.1????...
    • yinqingwang
    • yinqingwang
    • 2016年09月17日 20:32
    • 15061

    Websocket——Websocket原理

    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有。所以转到我博客里,分享一下。比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗...
    • yu17310133443
    • yu17310133443
    • 2017年04月17日 17:04
    • 1571

    Websocket原理

    一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1...
    • guozhiyingguo
    • guozhiyingguo
    • 2016年11月03日 14:49
    • 114

    Spring WebSocket详解

    Spring WebSocket详解作者:chszs,转载需注明。博客主页:/bc5/chszsSpring框架从4.0版开始支持WebSocket,下面我将详述Spr...
    • chszs
    • chszs
    • 2015年06月21日 11:57
    • 6215

    WebSocket原理

    作者:Ovear 链接:https://www.zhihu.com/question/20215561/answer/40316953 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 ...
    • simba_1986
    • simba_1986
    • 2017年01月15日 18:41
    • 164

    Websocket原理及与httpl跟 ajax轮询的区别

    一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的...
    • zp17764507932
    • zp17764507932
    • 2016年12月01日 12:00
    • 1660

    WebSocket 原理

    https://www.zhihu.com/question/20215561
    • sandyqin08
    • sandyqin08
    • 2016年03月03日 12:08
    • 303

    websocket原理

    一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先H...
    • poxiao58
    • poxiao58
    • 2016年09月01日 16:42
    • 222

    Websocket原理概述

    Html5提供了WebSocket来支持浏览器与服务器的全双工通讯。 WebSocket在TCP之上定义了帧协议,从而能够支持双向的通信。由于WebSocket本质上是一个基于TCP的协议,在建立W...
    • MaggieDorami
    • MaggieDorami
    • 2012年08月30日 02:00
    • 5329
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:websocket原理
    举报原因:
    原因补充:

    (最多只允许输入30个字)