【WebSocket】tomcat内部处理websocket的过程

embedded/2024/12/28 22:33:01/

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请求,并且可以根据实际需求调整各种参数以优化性能和安全性。

 

 


http://www.ppmy.cn/embedded/149573.html

相关文章

遇到duilib.dll丢失怎么办?解决duilib.dll文件丢失问题的全面指南

在使用计算机的过程中,您可能会遇到各种各样的错误提示,其中一种常见的问题是“duilib.dll丢失”。这类错误不仅会影响特定程序的正常运行,还可能给用户带来困扰。本文将详细介绍duilib.dll的作用、丢失的原因以及如何有效解决这一问题。 一、…

【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity

文章目录 前言**游戏引擎是什么?****游戏引擎对于我们的意义**1、**降低游戏开发的门槛**2、**提升游戏开发效率** **以前做游戏****现在做游戏****主流的游戏引擎有哪些?**Unity 相比其他游戏引擎的优势?**为什么选择Unity?**Uni…

人工智能与云计算的结合:如何释放数据的无限潜力?

引言:数据时代的契机 在当今数字化社会,数据已成为推动经济与技术发展的核心资源,被誉为“21世纪的石油”。从个人消费行为到企业运营决策,再到城市管理与国家治理,每个环节都在生成和积累海量数据。然而,数…

电商项目-数据同步解决方案(二)首页广告缓存同步

一、案例:首页广告缓存更新 缓存更新 基于canal 完成首页广告缓存数据更新 需求分析:当tb_ad(广告)表的数据发生变化时,更新redis中的广告数据。 二、首页广告缓存更新-实现步骤 (1)修改数据…

音视频入门知识(一):基本概念篇

一、基本概念篇 编码(encode) 通过特定的压缩技术,将某个视频的视频流格式转换成另一种视频格式的视频流方式。 输入:一串连续的图片帧;输出:连续的二进制字节流 编码的本质:压缩 -> 减少占用空间 YUV420/422可通过…

ONNX 转 TensorRT Bug 记录:IIfConditionalOutputLayer

1. 问题描述 环境:TensorRT-8.6.1.6、CUDA-11.8 报错:Error[4]: /If_OutputLayer: IIfConditionalOutputLayer inputs must have the same shape. Shapes are [-1,384] and [-1,1,384]. 复现代码: import os import torch import torch.n…

流架构的读书笔记(2)

流架构的读书笔记(2) 一、建模工具之一沃德利地图 推测技术的发展,交流和辩论思想的最有力的方法是沃德利地图 沃德利地图的制作步骤 1确定范围和用户需求 2确定满足用户需求所需的组件 3在一条范围从全新到被人们接受的演进轴上评估这些组成 部分的演…

【Spring核心思想】IoC容器与依赖倒置(DI)

在日常开发中,我们总会面临一个问题:如何优雅地管理对象的创建和依赖? 你可能会写一堆代码来手动构造对象,但这种方式繁琐且难以维护。而当项目变得复杂,依赖链拉长,手动管理对象的方式很快就会捉襟见肘。 …