【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求逆序对数目
目录 题目描述 输入样例: 输出样例: 逆序对的含义: 具体思路: 归并排序: 求逆序对: 代码实现: 对于mid-z1举个例子 题目描述 注意:本问题算法的时间复杂度要求为O(nlogn), 否则得分无效 题目来源ÿ…...
C# 中 Webclient和Httpclient
在C#中,WebClient和HttpClient,这两个类都是用于发起HTTP请求的客户端,它们在使用API上传文件或数据时有不同的优缺点和应用场景。在C#中WebClient是一种较早的网络客户端,而HttpClient是后期提供的更现代的、功能更强大的HTTP客户…...
cesium入门学习三
这期主要学习一下鼠标点击事件以及鼠标滚轮事件。 学习目录总结: cesium入门学习一-CSDN博客 cesium入门学习二-CSDN博客 1.鼠标事件 1.1 点击鼠标左键显示经度、纬度、高度 效果: js代码: var viewer new Cesium.Viewer(cesiumConta…...
swagger,showdoc,apifox,Mock 服务,dubbo,ZooKeeper和dubbo的关系
Swagger、ShowDoc 和 Apifox 之间的区别与优势 Swagger、ShowDoc 和 Apifox 都是用于 API 文档管理和测试的工具,但它们各有特色和适用场景。以下是详细的比较,并附上每个工具的具体用法示例。 1. Swagger 特点与优势: 广泛采用: Swagger…...
【自信息、信息熵、联合熵、条件熵、互信息】
文章目录 一、自信息 I(X)二、信息熵:衡量系统的混乱程度信息熵 H(X)联合熵 H(X,Y) 三、条件熵H(Y|X) 联合熵H(X,Y) - 信息熵H(X)四、互信息 I(X,Y)五、总结References 一、自信息 I(X) 自信息(Self-information) 是由香农提出的,用来衡量单一事件发生…...
免费资源网站
记录一下 音效 爱给网制片帮素材...
C++--------继承
一、继承的基本概念 继承是 C 中的一个重要特性,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…...
Python PyMupdf 去除PDF文档中Watermark标识水印
通过PDF阅读或编辑工具,可在PDF中加入Watermark标识的PDF水印,如下图: 该类水印特点 这类型的水印,会在文件的字节流中出现/Watermark、EMC等标识,那么,我们可以通过改变文件字节内容,清理掉…...
改进爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)
概率爬山法(Probabilistic Hill Climbing,PHC)是一种局部搜索算法,它结合了随机性和贪婪搜索的特点,是对爬山算法(Hill Climbing Algorithm)的一种变体或扩展。与传统的爬山法不同,PHC不是总是选择最优的邻居作为下一步的移动,而是以一定的概率选择最优邻居,同时以一…...
解读DeepseekV3
本年度还剩几天,Deepseek就发布了这么值得惊喜的产品,我觉得是真正做AI,也喜欢AI同学,对这个魔幻的2024年12月,一定是未来多少年想起都能回忆起这波澜壮阔的岁月。 我见过的最省的GPT4o,Claude,…...
【网络安全 | 漏洞挖掘】如何通过竞态条件发现账户接管漏洞
未经许可,不得转载。 文章目录 背景正文设置竞态条件实现漏洞背景 目标应用允许用户创建项目。这些项目中包含多个用户角色,每个角色权限不同(如所有者、管理员、成员管理者等)。用户可通过接受邀请来加入项目,而只有项目所有者才能通过输入邮箱将项目所有权转移给其他用…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
