SocketIO websocket握手与RFC 6455描述的不同

时间:2015-09-25 03:10:47

标签: websocket socket.io

我正在尝试了解有关websockets协议的更多信息。根据RFC 6455,此协议的步骤是握手,它以HTTP升级请求开始:

.container2 {
    width:100%;
    height: 100px;
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    align-content: stretch;
}

.box {
    border: 1px solid purple;
    background: blue;
    align-self: stretch;
    min-width: 100px;
    max-width: 150px;
}

<div class="container2">
    <div class="box box1">
    </div>
    <div class="box box2">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
    <div class="box box3">
    </div>
</div>

服务器使用HTTP Switching Protocols消息响应:

 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 

我试图使用一个基于socketIO的简单程序(nodeJS websockets库)观察到这一点。在捕获流量后,我注意到客户端发送服务器的第一条消息是:

HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat
服务器响应的

GET /socket.io/?EIO=3&transport=polling&t=1443149751115-0 HTTP/1.1
Host: localhost
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36            (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
Origin: null
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

是SocketIO没有关注websockets的RFC,还是我错过了什么?

3 个答案:

答案 0 :(得分:6)

socket.io拥有它自己的连接管理功能,它在连接到webSocket之前允许它协商它实际要对服务器进行哪种类型的连接,并允许它向客户端发送一些配置选项。如果您正在尝试研究普通的webSocket,这会让您感到困惑。

socket.io是webSocket上的附加协议。它最终会使用下面的标准webSocket,但它会有额外的东西。如果你继续遵循socket.io连接,你最终会看到一个标准的webSocket连接。

我建议您首先从客户端创建一个简单的webSocket连接(无socket.io)并研究该网络跟踪。

答案 1 :(得分:3)

在js客户端,使用websocket传输连接到服务器。这使默认的websocket机制与RFC 6455相同。

var socket = io.connect('http://localhost:8080', {
   transports: [
     'websocket',
     'polling'
   ]
});

答案 2 :(得分:1)

我相信你是对的,socket.io不尊重RFC 6455.为了测试这个我在ubuntu虚拟机中运行了一个javascript服务器,并且在主机上ubuntu执行了与服务器的成功socket.io交互。我使用sudo tcpdump -i vboxnet1 -w dump.out捕获了网络流量,并使用wireshark分析了结果。

socket.io握手就像原始海报所代表的那样,整个脚本成功完成(客户端收到websocket消息),tcpdump没有显示带有升级头的HTTP请求{{3 }}