websocket请求格式
浏览器请求
GET /webfin/websocket/ HTTP/1.1。
Host: localhost。
Upgrade: websocket。
Connection: Upgrade。
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==。
Origin: http://服务器地址。
Sec-WebSocket-Version: 13。
服务器响应
HTTP/1.1 101 Switching Protocols。
Upgrade: websocket。
Connection: Upgrade。
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=。
WebSocket借用http请求进行握手,相比正常的http请求,多了一些内容。其中:
Upgrade: websocket。
Connection: Upgrade。
表示希望将http协议升级到Websocket协议。Sec-WebSocket-Key是浏览器随机生成的base64 encode的值,用来询问服务器是否是支持WebSocket。
响应字段解释
Upgrade: websocket。
Connection: Upgrade。
告诉浏览器即将升级的是Websocket协议
Sec-WebSocket-Accept是将请求包“Sec-WebSocket-Key”的值,与”258EAFA5-E914-47DA-95CA-C5AB0DC85B11″这个字符串进行拼接,然后对拼接后的字符串进行sha-1运算,再进行base64编码得到的。用来说明自己是WebSocket助理服务器。
在Apache Tomcat中,WebSocket通讯会经过Connector组件,处理方式与传统的HTTP请求有所不同。以下是Tomcat中WebSocket通讯的简要流程:
### Connector的作用
- **Connector** 是Tomcat的一个组件,它负责监听客户端的连接请求,并将这些请求转发给Tomcat内部进行处理。对于HTTP和WebSocket请求,Tomcat使用不同的协议处理器(Protocol Handler)来处理它们。
### WebSocket在Tomcat中的处理
1. **初始握手**:当一个WebSocket客户端尝试建立连接时,它首先通过HTTP发起一个特殊的请求,这个请求包含了升级到WebSocket协议的意图。此时,请求会像普通的HTTP请求一样被Connector接收。
2. **协议升级**:Tomcat中的Connector接收到这个HTTP请求后,会识别出这是一个WebSocket升级请求。如果配置正确并且服务器端支持WebSocket,那么Connector将会执行协议升级过程,从HTTP切换到WebSocket协议。
3. **持久连接**:一旦协议升级完成,原本基于HTTP的连接就会转换成一个持久的、全双工的WebSocket连接。在这个阶段,虽然数据传输仍然通过原来的网络套接字(Socket),但是不再由HTTP协议处理器处理,而是转交给专门的WebSocket处理器来管理。
4. **消息传递**:在WebSocket连接期间,所有进出的消息都会由WebSocket处理器负责解析和封装,确保数据能够按照WebSocket协议正确地发送和接收。
5. **连接关闭**:无论是正常关闭还是异常断开,最终的连接终止也是由WebSocket处理器处理的。
### 配置注意事项
为了确保WebSocket功能正常工作,在配置Tomcat时需要保证所使用的Connector支持WebSocket协议。例如,如果你使用的是HTTP/1.1协议的Connector,那么默认情况下它是支持WebSocket的。而对于AJP或HTTP/2等其他类型的Connector,则可能需要额外配置或者不支持WebSocket。
总之,虽然WebSocket通讯在Tomcat中确实会经过Connector组件,但实际的数据处理是在协议升级完成后由专门的WebSocket处理器接管的。这意味着,尽管底层的网络连接是由Connector管理的,但具体的WebSocket通信逻辑是独立于标准的HTTP请求处理流程的。
nginx代理websocket
Nginx作为反向代理服务器可以有效地将WebSocket请求转发给后端的应用服务器(如Tomcat、Node.js等),并保持连接的持久性和双向通信能力。下面是Nginx代理WebSocket的工作原理和配置要点:
### Nginx代理WebSocket的原理
1. **HTTP升级机制**:WebSocket连接始于一个HTTP请求,该请求包含了特殊的HTTP头信息,表明这是一个希望升级到WebSocket协议的请求。Nginx接收这个HTTP请求,并识别出它是一个WebSocket升级请求。
2. **协议升级处理**:当Nginx识别出WebSocket升级请求时,它会检查配置文件中是否有匹配的location块来处理这类请求。如果有正确的配置,Nginx会执行协议升级过程,从HTTP切换到WebSocket协议,并将升级后的连接转发给指定的后端服务器。
3. **持久连接管理**:一旦协议升级完成,Nginx会维持住这个持久的、全双工的WebSocket连接,使得客户端和服务器可以独立地发送数据,而不需要重新建立连接。Nginx在此过程中充当透明代理的角色,确保数据包能够正确地在客户端和后端服务器之间传输。
4. **心跳检测与超时设置**:为了确保连接的活跃性,Nginx可以通过配置来定期发送ping/pong帧进行心跳检测,同时也可以设置适当的超时参数以应对网络故障或长时间不活跃的情况。
5. **SSL/TLS支持**:如果需要通过wss://(WebSocket Secure)提供安全的WebSocket连接,Nginx可以作为SSL终止点,解密来自客户端的加密流量,然后将明文流量转发给后端应用服务器。反之亦然,对于从后端发往客户端的数据,Nginx会先加密再发送。
### Nginx配置要点
要让Nginx正确代理WebSocket请求,你需要在`nginx.conf`或相关虚拟主机配置文件中添加特定的配置指令。以下是一个基本的配置示例:
```nginx
http {
# ...其他配置...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# map的作用是 根据$http_upgrade内部变量来设置 $connection_upgrade变量。如果$http_upgrade有值 $connection_upgrade就设置为upgrade否则就是close
server {
listen 80;
server_name your_domain.com;
location /ws/ {
proxy_pass http://backend_server; # 后端WebSocket服务器地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 如果使用了WebSockets over TLS, 需要配置SSL
# proxy_ssl_certificate /path/to/cert.pem;
# proxy_ssl_certificate_key /path/to/key.pem;
# proxy_ssl_protocols TLSv1.2 TLSv1.3;
# 心跳检测设置 (可选)
# proxy_read_timeout 86400s;
# proxy_send_timeout 86400s;
# 其他必要的header设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
```
### 关键配置解释
- `map $http_upgrade $connection_upgrade`:根据HTTP请求中的`Upgrade`头设置`Connection`响应头。
- `proxy_http_version 1.1`:确保使用HTTP/1.1版本,因为WebSocket依赖于它。
- `proxy_set_header Upgrade $http_upgrade` 和 `proxy_set_header Connection $connection_upgrade`:这两个指令是关键,它们告诉Nginx这是一个WebSocket升级请求,并且应该保留连接而不关闭。
- `proxy_read_timeout` 和 `proxy_send_timeout`:设置读取和发送操作的超时时间,防止连接因长时间无活动而被意外关闭。
- SSL相关的配置(如`proxy_ssl_certificate`)仅在使用wss://时需要。
通过以上配置,Nginx可以成功地代理WebSocket请求,并且可以根据实际需求调整各种参数以优化性能和安全性。