我正在尝试了解有关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,还是我错过了什么?
答案 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 }}