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

news2025/1/1 20:52:25

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.coloradmin.cn/o/2267675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解LRMOP1-LRMOP6及工程应用---盘式制动器设计,提供完整MATLAB代码

一、麋鹿优化算法 麋鹿优化算法(Elephant Herding Optimization,EHO)是2024年提出的一种启发式优化算法,该算法的灵感来源于麋鹿群的繁殖过程,包括发情期和产犊期。在发情期,麋鹿群根据公麋鹿之间的争斗分…

螺杆支撑座在运用中会出现哪些问题?

螺杆支撑座是一种用于支撑滚珠螺杆的零件,通常用于机床、数控机床、自动化生产线等高精度机械设备中。在运用中可能会出现多种问题,这些问题源于多个方面,以下是对可能出现的问题简单了解下: 1、安装不当:安装过程中没…

Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)

前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统,并不内置像Web前端(例如 Vue.js或React中)那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统&#xff…

从0入门自主空中机器人-2-2【无人机硬件选型-PX4篇】

1. 常用资料以及官方网站 无人机飞控PX4用户使用手册(无人机基本设置、地面站使用教程、软硬件搭建等):https://docs.px4.io/main/en/ PX4固件开源地址:https://github.com/PX4/PX4-Autopilot 飞控硬件、数传模块、GPS、分电板等…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题:Windows上缺少xaudio2_9.dll是什么原因? xaudio2_9.dll是DirectX音频处理库的一个组件,它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时,如果系统提示缺少xaudio2_9.dll文件&#xf…

冥想的实践

这是我某一天的正念和冥想实践,我对正念练习、冥想练习进行了分别的统计。 正念练习:1分钟**5次 冥想:15分钟10分钟 正念练习,基本在工作休息时间练习。当然,工作过程中,也有一部分时间会有正念的状态&am…

一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类

机器学习实战通常是将理论与实践结合,通过实际的项目或案例,帮助你理解并应用各种机器学习算法。下面是一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的…

Redis 实战篇 ——《黑马点评》(上)

《引言》 在进行了前面关于 Redis 基础篇及其客户端的学习之后,开始着手进行实战篇的学习。因内容很多,所以将会分为【 上 中 下 】三篇记录学习的内容与在学习的过程中解决问题的方法。Redis 实战篇的内容我写的很详细,为了能写的更好也付出…

Intent--组件通信

组件通信1 获取子活动的返回值 创建Activity时实现自动注册!【Activity必须要注册才能使用】 默认 LinearLayout 布局,注意 xml 中约束布局的使用; 若需要更改 线性布局 只需要将标签更改为 LinearLayout 即可,记得 设置线性布局…

word参考文献第二行缩进对齐

刚添加完参考文献的格式是这样: ”段落“—>缩进修改、取消孤行控制 就可以变成

UE(虚幻)学习(一) UE5.3.2和VS2022的安装以及遇到的问题和一些CS8604、CA2017报错问题.

最近工作很多东西是UE搞的,工作安排上也稍微缓口气,来学学UE,因为同事都用的UE5.3,所以就从UE5.3开始吧,之前学习过UE4,放上两年什么都不记得了。还是需要做一些记录。 本来安装不想写什么,谁知…

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…

systemverilog语法:assertion summary

topics assertion 介绍 Property在验证中的应用 ended表示sequence执行结束。 property 立即断言不消耗时间,好像if…else…,关键字不含property. 并发断言消耗时间,关键字含property. 立即断言 并发断言

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

描述:在blender中合并的模型导出为glb,在threejs中导入仍显示多个mesh,并不是统一的整体,导致需要整体高亮或者使用DragControls等不能统一控制。 原因:模型有多个材质,在blender中合并的时候,…

关于最新MySQL9.0.1版本zip自配(通用)版下载、安装、环境配置

一、下载 从MySQL官网进行下载MySQL最新版本,滑到页面最下面点击社区免费版,(不是企业版) 点击完成后选择自己想要下载的版本,选择下载zip压缩,不用debug和其他的东西。 下载完成后进入解压,注…

4.银河麒麟V10(ARM) 离线安装 MySQL

1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…

InfoNCE Loss详解(上)

引言 InfoNCE对比学习损失是学习句嵌入绕不开的知识点,本文就从头开始来探讨一下它是怎么来的。 先验知识 数学期望与大数定律 期望(expectation,expected value,数学期望,mathematical expectation)是随机变量的平均值&#…

机器人C++开源库The Robotics Library (RL)使用手册(一)

强大的、完整的C机器人开源库 1、是否可以免费商用?2、支持什么平台?3、下载地址4、开始! 1、是否可以免费商用? Robotics Library(RL)是一个独立的C库,用于机器人运动学、运动规划和控制。它涵…

超快速的路径优化IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解

IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解 今天本博主王婆卖瓜自卖自夸😄,介绍自己paper中的算法,本算法已经持续开源中(部分关键内容)Github,之前很多读者朋友一直说要详细讲讲路径优化算法&#x…

meshy的文本到3d的使用

Meshy官方网站: 中文官网: Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…