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

SocketIO websocket握手与RFC 6455描述的握手不同,websocket,socket.io,Websocket,Socket.io,我试图了解更多关于websockets协议的信息。根据RFC 6455,该协议的步骤是握手,握手从HTTP升级请求开始: GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSoc

我试图了解更多关于websockets协议的信息。根据RFC 6455,该协议的步骤是握手,握手从HTTP升级请求开始:

 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 
服务器通过HTTP交换协议消息对其进行响应:

HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat
我尝试使用一个基于socketIO(nodeJS websockets库)的简单程序来观察这一点。捕获流量后,我注意到客户端向服务器发送的第一条消息是:

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
服务器将以以下方式响应:

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 101
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: null
Set-Cookie: io=3Z_TCqv9LKKXcWCjAAAD
Date: Fri, 25 Sep 2015 02:55:51 GMT
Connection: keep-alive

....0{"sid":"3Z_TCqv9LKKXcWCjAAAD","upgrades":    ["websocket"],"pingInterval":25000,"pingTimeout":60000}

SocketIO是不遵循webSocket的RFC,还是我遗漏了什么?

socket.io在连接到webSocket之前有自己的连接管理功能,允许它协商实际要与服务器建立的连接类型,并允许它向客户端发送一些配置选项。这将如果您试图学习普通webSocket,请使用您

socket.io是webSocket之上的一个附加协议。它最终将在下面使用标准webSocket,但它周围会有其他内容。如果您继续遵循socket.io连接,您将最终看到标准webSocket连接


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

我相信你是正确的,socket.io不尊重RFC6455。为了测试这一点,我在ubuntu virtualbox中运行了一个javascript服务器,ubuntu在主机上成功地与服务器进行了socket.io交互。我用
sudo tcpdump-I vboxnet1-w dump.out
和analyz捕获了网络流量用wireshark编辑结果


io握手正如原始海报所示,整个脚本成功完成(客户端接收websocket消息)在js客户端中,如果没有
tcpdump
显示带有升级头的HTTP请求,请使用websocket传输连接到服务器。这将启用与RFC 6455相同的默认websocket机制

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

这些差异在任何地方都有记录吗?@SivaDotRender-有记录,除了最初的实现者自己编写的以外,还有许多其他语言的socket.io实现。我不确定最好的文档在哪里,但有一些和。谢谢,这就是我要找的!