精华内容
下载资源
问答
  • 一、WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接。...WebSocket是HTML5中新协议、新API.Http协议...二、WebSocket是什么样的协议,具体有什么优点。首先,相对于Http这种非持久的协议来说,Web...

    一、WebSocket是HTML5中的协议,支持持久连接;而Http协议不支持持久连接。

    首先HTMl5指的是一系列新的API,或者说新规范,新技术。WebSocket是HTML5中新协议、新API.

    Http协议本身只有1.0和1.1,也就是所谓的Keep-alive,把多个Http请求合并为一个。

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

    首先,相对于Http这种非持久的协议来说,WebSocket是一种持久化的协议。

    举例说明:

    (1)Http的生命周期通过Request来界定,也就是Request一个Response,那么在Http1.0协议中,这次Http请求就结束了。

    在Http1.1中进行了改进,是的有一个Keep-alive,也就是说,在一个Http连接中,可以发送多个Request,接收多个Response。

    但是必须记住,在Http中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。

    (2)WebSocket是基于Http协议的,或者说借用了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

    Origin: http://example.com

    熟悉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 101 Switching 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协议的工作。

    展开全文
  • websocket协议

    2018-09-25 21:35:43
    协议升级完成后,后续的数据交换则遵照WebSocket的协议。 1.1 客户端:申请协议升级 首先,客户端发起协议升级请求。可以看到,采用的是标准的HTTP报文格式,且只支持GET方法。 GET / HTTP/1.1 Host: localhost:8080...

    1.连接建立

    WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。

    1.1 客户端:申请协议升级

    首先,客户端发起协议升级请求。可以看到,采用的是标准的HTTP报文格式,且只支持GET方法。

    GET / HTTP/1.1
    Host: localhost:8080
    Origin: http://127.0.0.1:3000
    Connection: Upgrade
    Upgrade: websocket
    Sec-WebSocket-Version: 13
    Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==
    

    重点请求首部意义如下:

    Connection: Upgrade:表示要升级协议
    Upgrade: websocket:表示要升级到websocket协议。
    Sec-WebSocket-Version: 13:表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。
    Sec-WebSocket-Key:与后面服务端响应首部的Sec-WebSocket-Accept是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。

    1.2 服务端:响应协议升级

    服务端返回内容如下,状态代码101表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。

    HTTP/1.1 101 Switching Protocols
    Connection:Upgrade
    Upgrade: websocket
    Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=
    

    备注:每个header都以\r\n结尾,并且最后一行加上一个额外的空行\r\n。此外,服务端回应的HTTP状态码只能在握手阶段使用。过了握手阶段后,就只能采用特定的错误码。

    1.3 Sec-WebSocket-Accept的计算

    Sec-WebSocket-Accept根据客户端请求首部的Sec-WebSocket-Key计算出来。

    计算公式为:

    将Sec-WebSocket-Key跟258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接。
    通过SHA1计算出摘要,并转成base64字符串。
    伪代码如下

    toBase64( sha1( Sec-WebSocket-Key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ) )
    

    2.websocket协议格式

    在这里插入图片描述

    2.1 FIN

    1个bit位,用来标记当前数据帧是不是最后一个数据帧,因为一个消息可能会分成多个数据帧来传递,当然,如果只需要一个数据帧的话,第一个数据帧也就是最后一个。

    2.2 RSV1, RSV2, RSV3

    这三个,各占用一个bit位,根据RFC的介绍,这三个bit位是用做扩展用途,没有这个需求的话设置位0。

    2.3 Opcode

    故名思议,操作码,占用4个bit位,也就是一个16进制数,它用来描述要传递的数据是什么或者用来干嘛的,只能为下面这些值:

    1. 0x0 :denotes a continuation frame 标示当前数据帧为分片的数据帧,也就是当一个消息需要分成多个数据帧来传送的时候,需要将opcode设置位0x0。
    2. 0x1 denotes a text frame 标示当前数据帧传递的内容是文本。
    3. 0x2 denotes a binary frame 标示当前数据帧传递的是二进制内容,不要转换成字符串
    4. 0x8 denotes a connection close 标示请求关闭连接
    5. 0x9 denotes a ping 标示Ping请求
    6. 0xA denotes a pong 标示Pong数据包,当收到Ping请求时自动给回一个Pong

    2.4 MASK

    占用一个bit位,标示数据有没有使用掩码,RFC中有说明,服务端发送给客户端的数据帧不能使用掩码,客户端发送给服务端的数据帧必须使用掩码。
    如果一个帧的数据使用了掩码,那么在Maksing-key部分必须是一个32个bit位的掩码,用来给服务端解码数据。

    2.5 Payload len

    数据的长度,默认位7个bit位。

    如果数据的长度小于125个字节(注意:是字节)则用默认的7个bit来标示数据的长度。

    如果数据的长度为126个字节,则用后面相邻的2个字节来保存一个16bit位的无符号整数作为数据的长度。

    如果数据的长度大于126个字节,则用后面相邻的8个字节来保存一个64bit位的无符号整数作为数据的长度。

    2.6 Masking-key

    数据掩码,如果MASK设置位0,则该部分可以省略,如果MASK设置位1,怎Masking-key位一个32位的掩码。用来解码客户端发送给服务端的数据帧。

    2.7 Payload data

    该部分,也是最后一部分,是帧真正要发送的数据,可以是任意长度。

    展开全文
  • WebSocket协议

    2018-05-21 17:14:12
    特点 应用层协议(七层);... 客户端通过Http发送协议升级请求(增加特殊头信息Upgrade:WebSocket),如下所示:  GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Co...

    特点

    1. 应用层协议(七层);
    2. 全双工通信(双向);
    3. 长连接;

    WebSocket连接建立过程

    1. 客户端发送建立连接请求;
      客户端通过Http发送协议升级请求(增加特殊头信息Upgrade:WebSocket),如下所示:
      GET /chat HTTP/1.1
        Host: server.example.com
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
        Origin: http://example.com
        Sec-WebSocket-Protocol: chat, superchat
        Sec-WebSocket-Version: 13
    1. 服务端返回ACK响应;
      服务端解析头信息,如果确认支持WebSocket协议,则返回如下响应:
        HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
        Sec-WebSocket-Protocol: chat
    

    使用注意

      Http协议升级成为WebSocket协议的关键是“Upgrade”头信息,如果中间链路存在七层代理设备,且不识别Upgrade头部,会导致转发时Upgrade头部信息丢失,协议升级失败;

    Nginx支持WebSocket

    1. Nginx版本:nginx-1.3.13以上;
    2. 增加配置项,
    location /ide.ws {
        proxy_read_timeout 1800s;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8111;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
    展开全文
  • WebSocket协议深入理解

    万次阅读 2016-08-11 20:30:43
    总体来说,WebSocket协议是HTTP协议的升级版。2.研究WebSocket的思路服务器端自己实现WebSocket非常复杂。我们虽然不求能够完全自己实现,但是还是应该了解一下后端实现WebSocket的整体思路。WebSocket的实现主要...

    1.WebSocket和HTTP的关系

    WebSocket只有在建立握手连接的时候借用了HTTP协议的头,连接成功后的通信部分都是基于TCP的连接。总体来说,WebSocket协议是HTTP协议的升级版。


    2.研究WebSocket的思路

    服务器端自己实现WebSocket非常复杂。我们虽然不求能够完全自己实现,但是还是应该了解一下后端实现WebSocket的整体思路。

    WebSocket的实现主要分为两个部分:建立连接(握手)和数据传输。下面对这两个过程分别进行分析。


    3.建立连接

    (1)客户端发送请求

    WebSocket协议的实现首先需要客户端和服务器进行握手连接。首先客户端向服务器发送请求,请求报文中的重点内容如下:

    GET /chat HTTP/1.1

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

    从GET处可以看出,这是一个基于HTTP的请求。接下来的Upgrade字段和Connection字段完成了对HTTP协议的升级(HTTP Upgrade Request)。Upgrade字段通知服务器,现在要使用一个升级版协议——websocket。接下来是Sec-WebSocket-Key字段,这个字段是一串生成的BASE64加密的密钥,它被一同发送到服务器端。

    此外还有诸如Sec-WebSocket-Version、Sec-WebSocket-Protocol等字段,由于是可选字符,对WebSocket协议的实质影响不大,同时为了文章更简洁更容易理解,先不进行介绍。

    (2)服务器端进行处理

    服务器收到客户端请求后要进行响应。首先服务器需要处理客户端传递过来的Sec-WebSocket-Key。服务器端有一个全局唯一标识符GUID,这个是固定的。服务器端将客户端传来的字符串和服务器端的GUID拼接到一起后进行SHA1处理,再进行一次BASE64加密,准备将其返回客户端。

    (3)服务器端返回响应

    服务器端处理完成后,将给客户端返回响应报文,重要部分如下:

    HTTP/1.1 101 Switching Protocols

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    第一行再次表明此次连接的建立是以HTTP协议为基础的。同时返回了101状态码。101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求。那么协议是什么时候升级到WebSocket的呢?当发送完这个响应最后的空行后,服务器就会切换到Upgrade消息头定义的WebSocket协议。至此完成了从HTTP协议升级的WebSocket协议的过程。同时需要注意,如果返回的状态码不是101,就表示握手升级的过程失败了。

    中间两行就不用说了,最后一行Sec-WebSocket-Accept返回的就是服务器端处理后的字符串。只有返回了这个字符串才表明握手成功了,返回其他的字符串都表示握手失败。


    4.数据传输

    WebSocket的数据帧格式如下:


    这里需要对数据帧进行一个解析,需要返回一个由键值对组成对象,这里先不对解析数据帧的方法进行解析。这个对象就是解析后的数据帧,里面有各个字段以及对应的值。对每个字段的含义如下:

    FIN      表示信息的最后一帧,flag,也就是标记符

    RSV 1-3  以后备用的,默认都为 0

    Opcode   帧类型

    Mask     掩码,表示是否加密数据,默认必须置为1 (这里很蛋疼)

    Payload  数据的长度

    Masking-key   掩码

    Payload data  数据

    Extension data   扩展数据

    Application data 程序数据

    将数据帧解析之后,生成的就是上面各个字段加其对应的值。这里面的重点部分是Opcode和Payload data字段。Opcode表示帧类型,每次用户代理接收到数据包时,都要先对Opcode进行判断。Opcode的状态值及其对应含义列表如下:

     0        Continuation Frame                

     1        Text Frame                        

     2        Binary Frame                      

     8        Connection Close Frame            

     9        Ping Frame                        

     10      Pong Frame                       

    判断了Opcode后,根据Opcode的具体状态,决定如何对PayLoad data的数据进行解析,从而进行数据传输。

    展开全文
  • 详解 websocket 协议

    2021-01-13 11:55:56
    一、websocket是什么? websocket 是一个基于应用层的网络协议,建立在...先让它去冲锋陷阵呢,我坐收渔翁之利不是更香 吗,所以一般来说,我们会先用 HTTP 先进行三次握手,再向服务器请求升级websocket 协议,..
  • WebSocket协议简介

    2015-04-01 16:49:34
    为了建立一个WebSocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息“Upgrade:Websocket”表明这是一个申请协议升级的HTTp请求,...
  • websocket协议解析

    2018-03-09 00:44:23
    websocket协议解析 wensocket协议包含两部分:一部分是“握手”,一部分是“数据传输”。 为了便于演示,我们采用swoole建立一个websocket服务器来演示。第一步、握手①客户端向服务端发起连接请求 如图,我们在...
  • 一 复习和目标1 复习上一节使用wireshark抓包分析了WebSocket流量包含连接的建立:HTTP协议升级WebSocket协议使用建立完成的WebSocket协议发送数据2 目标协议对比初始握手和计算响应键值消息格式关闭握手注:...
  • WebSocket协议的目的是为了工作于现有的网络基础设施。作为这一设计原则的一部分,WebSocket连接的协议规范定义了一个HTTP连接作为其开始生命周期,进而保证其与pre-WebSocket世界的完全向后兼容。通常来说从HTTP协议...
  • 因为webSocket协议是基于http协议升级的(见下图),所以可以使用nginx反向代理webSocket。 从这张图片上可以看出,webSocket连接的建立是在http协议的基础上。 GET /chat HTTP/1.1 Host: s.
  • 将用于处理WebSocket HTTP升级握手和其余WebSocket协议的代码尽可能合理地分开。 只需最少的更改,即可将Chrome的现有HTTP实现重用于握手。 背景 WebSocket连接包含两个不同的阶段:握手(使用HTTP语义并借用HTTP...
  • 包含连接的建立:HTTP协议升级WebSocket协议 使用建立完成的WebSocket协议发送数据 2 目标 协议对比 初始握手和计算响应键值 消息格式 关闭握手 注:WebSocket服务器使用《HTML5 WebSocket权威指南》3.4节中使用...
  • 软件包websocket为指定的WebSocket协议实现了客户端和服务器。 特征 升级HTTP / Conn TLS 开始吧 安装 go get github.com/hslam/websocket 进口 import "github.com/hslam/websocket" 用法 例子 server.go ...
  • 一、websocket是什么?...先让它去冲锋陷阵呢,我坐收渔翁之利不是更香吗,所以一般来说,我们会先用HTTP先进性三次握手,再向服务器请求升级websocket协议,这就好比说,嘿兄弟你先去给我排个队占
  • Websocket应用协议已经普及多年了,它是HTTP1.1的内部升级协议,主要作用是补充HTTP1.1无法灵活地主动推送消息给客户端的缺陷问题。在这里主要介绍一下使用组...
  • HTML5实战与剖析之WebSocket协议

    千次阅读 2014-05-26 08:53:57
    WebSocket协议是为了工作与现有的网络基础设施。作为这一设计原则的一部分,WebSocket连接的协议规范定义了开始其生命作为一个HTTP连接,保证与pre-WebSocket世界完全向后兼容。从HTTP协议切换WebSocket称为WebSocket...
  • 在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket...FastHttpApi在实现过程完全支持http协议升级websocket协议,当制定一个基于http请求的接口时,其实已经是完全支持websocket协议;从而...
  • 在这里主要介绍一下使用组件如何扩展一个完整的Websocket协议。协议介绍Websocket并不复杂,但协议文档内容还是很全面的,以下是协议原文https://tools.ietf.org/html/rfc6455。其实一个简单的图可以看出Websoc...
  • websocket协议 draft-10

    2011-09-21 15:39:00
    检查了一圈发现原来是chrome升级到14后,支持的websocket协议改变了,不再是之前的76草案,改为支持draft-10草案了。从75草案开始,这已经是我知道的第三个握手协议方案了。google chrome团队的博客说,这应该是最后...
  • WebSocket_协议

    2018-05-27 00:42:44
    为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP ...
  • WebSocket握手协议

    千次阅读 2016-07-02 16:38:24
    WebSocket握手协议 ... 使得数据可以快速的双向传播 通过一次简单的握手,建立了客户端和服务器的联系后...一个websocket连接是客户端与服务器端在http协议的初始握手阶段将其升级websocket协议来建立的。 其底层
  • 单纯使用ha的tcp或者http负载,会出现链接断开的情况,此处需重点关注Connection: Upgrade头,会让client端知道server端会改变协议,变成如Upgrade: websocketheader中所述的协议。若服务端提供,则会返回: ...
  • 最近发现,WEBWW在chrome14及FF6.5中没法与后台建立连接了,后面经过查找原因,是chrome14中使用最新的websocket协议草案,而chrome12中使用的websocket协议标准还是草案7.5、7.6的标准;现在草案的最新版本是草案10...
  • //where is the websocket server $port = 8080; //ssl $local = "http://localhost/php-websockets-master/"; //url where this script run $data = '{"id": 2,"command": "server_info"}'; //data to be send ...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 295
精华内容 118
关键字:

websocket协议升级