当前位置: 首页 > news >正文

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

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

 

 

相关文章:

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

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 Swi…...

【踩坑/Linux】Vmware中的Ubuntu虚拟机无法访问互联网

Vmware中的Ubuntu虚拟机无法访问互联网 首先前提是我的系统是Ubuntu 16.04系统,vmware workstation选择的是NAT模式,虚拟机内连不上网络 ping www.baidu.com ping: unknown host www.baidu.com首先检查 DNS 解析服务:在虚拟机中打开命令提示…...

overleaf中的includegraphics设置图片缩放,居中显示

overleaf中的includegraphics设置图片缩放,居中显示 \includegraphics[width=0.5\textwidth]{example.jpg} \centering 在使用 \includegraphics 命令插入图片时,可以通过设置其参数来缩小图片的显示尺寸,以下是几种常见的方法: 设置宽度或高度 按比例缩小宽度:可以使用…...

IPv6的地址类型

IPv6地址总长度为128bit,被分为8组,每组为4个十六进制数,用冒号分隔: 例如:FC00:0123:4567:8901:ABFD:0987:0000:0023 可缩写为:FC00:0123:4567:8901:ABFD:0987::23 IPv6中取消了v4中的广播,新…...

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语: 添加到倒排索引中,以便文档可搜索。级查询(如 生成搜索词的 match查询)使用。 分析器分为内置分析器和自定义的分析器,它们都是由若干个字符过滤器(chara…...

【工作感悟】

1、不返工 - 复述任务 避免返工的前提是先把事情弄清楚,怎么弄清楚,要问到每个细节,怎么确保每个细节都问到了,把要做的事情复述一遍,有必要的话再讲述一下自己打算怎么做;及时对齐工作进度可以避免出错 …...

事件(event) SystemVerilog

1.定义 在数字逻辑仿真中,事件(event) 是一种机制,用于触发模型中的更新或计算。这种机制是仿真器用来追踪信号的变化以及调度进程执行的核心。 2.分类 事件可以分为以下两种类型: 更新事件(Update Even…...

【MySQL学习笔记】关于索引

文章目录 【MySQL学习笔记】关于索引1.索引数据结构2.索引存储3.联合索引3.1 联合索引的b树结构3.2 索引覆盖?回表?3.3 联合索引最左匹配原则3.5 索引下推 4.索引失效 【MySQL学习笔记】关于索引 1.索引数据结构 索引是一种能提高查询速度的数据结构。…...

APIs-day3

1.全选反选案例 <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>练习</title><style>*{margin: 0;padding: 0;}table{margin: 100px auto;width: …...

7-1求逆序对数目

目录 题目描述 输入样例: 输出样例: 逆序对的含义&#xff1a; 具体思路&#xff1a; 归并排序&#xff1a; 求逆序对&#xff1a; 代码实现&#xff1a; 对于mid-z1举个例子 题目描述 注意&#xff1a;本问题算法的时间复杂度要求为O(nlogn), 否则得分无效 题目来源&#xff…...

C# 中 Webclient和Httpclient

在C#中&#xff0c;WebClient和HttpClient&#xff0c;这两个类都是用于发起HTTP请求的客户端&#xff0c;它们在使用API上传文件或数据时有不同的优缺点和应用场景。在C#中WebClient是一种较早的网络客户端&#xff0c;而HttpClient是后期提供的更现代的、功能更强大的HTTP客户…...

cesium入门学习三

这期主要学习一下鼠标点击事件以及鼠标滚轮事件。 学习目录总结&#xff1a; cesium入门学习一-CSDN博客 cesium入门学习二-CSDN博客 1.鼠标事件 1.1 点击鼠标左键显示经度、纬度、高度 效果&#xff1a; js代码&#xff1a; var viewer new Cesium.Viewer(cesiumConta…...

swagger,showdoc,apifox,Mock 服务,dubbo,ZooKeeper和dubbo的关系

Swagger、ShowDoc 和 Apifox 之间的区别与优势 Swagger、ShowDoc 和 Apifox 都是用于 API 文档管理和测试的工具&#xff0c;但它们各有特色和适用场景。以下是详细的比较&#xff0c;并附上每个工具的具体用法示例。 1. Swagger 特点与优势&#xff1a; 广泛采用: Swagger…...

【自信息、信息熵、联合熵、条件熵、互信息】

文章目录 一、自信息 I(X)二、信息熵&#xff1a;衡量系统的混乱程度信息熵 H(X)联合熵 H(X,Y) 三、条件熵H(Y|X) 联合熵H(X,Y) - 信息熵H(X)四、互信息 I(X,Y)五、总结References 一、自信息 I(X) 自信息(Self-information) 是由香农提出的&#xff0c;用来衡量单一事件发生…...

免费资源网站

记录一下 音效 爱给网制片帮素材...

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…...

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具&#xff0c;可在PDF中加入Watermark标识的PDF水印&#xff0c;如下图&#xff1a; 该类水印特点 这类型的水印&#xff0c;会在文件的字节流中出现/Watermark、EMC等标识&#xff0c;那么&#xff0c;我们可以通过改变文件字节内容&#xff0c;清理掉…...

改进爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)

概率爬山法(Probabilistic Hill Climbing,PHC)是一种局部搜索算法,它结合了随机性和贪婪搜索的特点,是对爬山算法(Hill Climbing Algorithm)的一种变体或扩展。与传统的爬山法不同,PHC不是总是选择最优的邻居作为下一步的移动,而是以一定的概率选择最优邻居,同时以一…...

解读DeepseekV3

本年度还剩几天&#xff0c;Deepseek就发布了这么值得惊喜的产品&#xff0c;我觉得是真正做AI&#xff0c;也喜欢AI同学&#xff0c;对这个魔幻的2024年12月&#xff0c;一定是未来多少年想起都能回忆起这波澜壮阔的岁月。 我见过的最省的GPT4o&#xff0c;Claude&#xff0c…...

【网络安全 | 漏洞挖掘】如何通过竞态条件发现账户接管漏洞

未经许可,不得转载。 文章目录 背景正文设置竞态条件实现漏洞背景 目标应用允许用户创建项目。这些项目中包含多个用户角色,每个角色权限不同(如所有者、管理员、成员管理者等)。用户可通过接受邀请来加入项目,而只有项目所有者才能通过输入邮箱将项目所有权转移给其他用…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...