问题描述:
最近在研究rosbridge,其原理如下图,浏览器与rosbridge server也是通过WebSocket连接的,但发现有连接不上的情况。
原因:
情况 1: 做服务器的PC IP地址变更,导致原IP连接不上。是因为做服务器的PC用了DHCP自动分配IP的方式,自动分配的IP有一定的时限,超过一定时限后变更IP。改为手动设置IP,设为固定IP地址可以解决此问题。
情况2: 有一台PC做服务器,发现无论如何都连接不上,发现是防火墙的原因,防火墙只开放了有限的端口给外部访问,通过关闭防火墙或者开发要访问的接口后,该问题得到解决。
WebSocket握手阶段,client端发送http GET请求,如果服务器防火墙进行了拦截,将无法发出此请求,client端或者server端都将抓不到此http请求数据
CURL工具发送http请求
WebSocket协议
WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接。我们来看看WebSocket连接是如何创建的。
首先,WebSocket连接必须由浏览器发起,因为请求协议是一个标准的HTTP请求,格式如下:
GET ws://localhost:3000/ws/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:3000
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13
该请求和普通的HTTP请求有几点不同:
GET请求的地址不是类似/path/,而是以ws://开头的地址;
请求头Upgrade: websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接;
Sec-WebSocket-Key是用于标识这个连接,并非用于加密数据;
Sec-WebSocket-Version指定了WebSocket的协议版本。
随后,服务器如果接受该请求,就会返回如下响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string
该响应代码101表示本次连接的HTTP协议即将被更改,更改后的协议就是Upgrade: websocket指定的WebSocket协议。
现在,一个WebSocket连接就建立成功,浏览器和服务器就可以随时主动发送消息给对方。消息有两种,一种是文本,一种是二进制数据。通常,我们可以发送JSON格式的文本,这样,在浏览器处理起来就十分容易。
来源: WebSocket
wireshark抓取到的数据
WebSocket握手阶段,发出的请求与回应信息
请求:
回应:
遗留问题:
更换服务器端口后,可以建立连接,但是抓取不到请求与回应数据,暂无解