简而言之 curl -H 'Upgrade: websocket' -H "Sec-WebSocket-Key: `openssl rand -base64 16`" -H 'Sec-WebSocket-Version: 13' --http1.1 -sSv https://ws.ifelse.io
(根据服务器的不同,您可能需要提供Origin
和/或Connection: Upgrade
)
首先,websocket协议是如何工作的?客户端连接到服务器,发送握手请求,接收“101 Switching Protocols”(握手响应),然后他们来回发送frames。
握手大致如下:
GET / HTTP/1.1
Host: ws.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
Origin: http://example.com
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
升级
使其从HTTP(s)切换到websocket协议。
连接
指定升级
是一个跳站头(中间人应该消耗而不是转发的头)。但我的实验表明,如果服务器前面有反向代理(例如nginx
),则可以在没有此头的情况下工作。或者更准确地说,它可能是可选的。
Sec-WebSocket-Key
/Sec-WebSocket-Accept
是一种安全措施,详见此处, 此处和此处。
Sec-WebSocket-Version
指定了websocket协议的版本。根据RFC 6455规定,它应该等于13。
当客户端是浏览器且请求页面的来源与websocket服务器URL的来源不匹配时,需要使用Origin
。
有关应构成websocket握手请求的详细说明可以在此处找到。
这就是HTTP/1.1的工作方式。HTTP/2则是另一回事。
了解这一点以使用curl
建立websocket连接:
$ curl -H 'Upgrade: websocket' \
-H "Sec-WebSocket-Key: `openssl rand -base64 16`" \
-H 'Sec-WebSocket-Version: 13' \
--http1.1 \
-sSv \
https://ws.ifelse.io
...
> GET / HTTP/1.1
> Host: ws.ifelse.io
> Upgrade: websocket
> Sec-WebSocket-Key: e2dujvcbYbN747lapeH+WA==
> Sec-WebSocket-Version: 13
...
< HTTP/1.1 101 Switching Protocols
< Connection: upgrade
< upgrade: websocket
< sec-websocket-accept: 6wmMGMtN00aWw3loYd6P36EHKMI=
其他选项包括
wscat
,
websocat
。