WebSocket实战之三遇上PAC

一、前言

前两天销售数据实时刷新功能开发测试完成,开开心心部署到生产环境,然后直接懵逼傻眼了,竟然连接不上WebSocket服务端,浏览器端请求头报 Provisional headers are shown 信息,然后采用一系列操作排查问题。

友情链接

1、WebSocket实战之一

2、WebSocket实战之二协议分析

二、排查问题步骤

1、怀疑服务端WebSocket对应的8098端口被防火墙关闭了,登录AWS查看出入站规则,入站允许8098,出站允许所有端口。

2、在服务端检测8098端口启动情况,netstat -anp | grep :8098,然后发现监听在8098端口的协议是TCP6,核对出入站访问规则发现只有IP4没有IP6但出入站规则无法设置IP6,然后在在java 命令参数中加入  -Djava.net.preferIPv4Stack=true,重新启动,但仍然无效。

注:其实监听在TCP6上是正常的,TCP6很好兼容TCP4.

3、在本地机器直接使用 telnet  服务器地址 8098,可以正常连接,说明远程服务器端口没有被限制,这时又傻眼了。

4、怀疑是Java写的WebSocket服务端代码有问题,然后用WebSocket实战之一 极简node.js服务端例子部署上去,发现同样无法连接。。

5、这时开始怀疑服务端到底有没有收到数据包,使用tcpdump监听8098端口,发现根本没有数据包进来,命令如下:tcpdump -ieth0 port 8098.

6、代码回滚,回家睡觉,反正数据没有实时刷新也没啥大不了的。

7、第二天忙完一些事情后,想想换一下浏览器试试,用了Safari,额竟然可以连接。。

8、最后发现我们技术所有人都配置了PAC,因为我们应用部署在AWS悉尼,不配置VPN是访问不了的,把VPN关掉就完全正常。

注:这里一个奇怪问题是VPN的配置应该是针对整台电脑的,不知为何safari没有走VPN

三、PAC文件

我们在使用一些VPN时,它会提供一个PAC文件,然后你在自动代理配置把该文件URL配置进去,一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url, host)”。这个函数返回包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理或者直接访问。当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。浏览器在访问其他页面以前,首先访问这个PAC文件.一个PAC文件大致如下。

四、websocket与PAC

如果是未加密的WebSocket信息流通过透明的代理传输到WebSocket服务器,实践中连接很可能失败,因为在这种情况下,当代理服务器将请求转发到(WebSocket)服务器时,将会被剥去一些特定的消息头,包括 Connection消息头。

但并非所有的代理服务器在所期待的代理行为方面都遵循HTTP标准。比如一些代理服务器被配置为不删除Connection: Upgrade消息头,并将其传送给WebSocket服务器,反过来服务器又会发送101 Web Socket Protocol Handshake响应。而当客户端或服务器开始发送第一个WebSocket帧时问题就出现了。因为这帧数据与代理服务器所期待的任何事物(比如常规的 HTTP流量)都不相同,就可能会产生一些异常,除非代理服务器被特别配置为处理WebSocket流量。

注:后来邮件VPN提供方他们答应调整了代理规则,但还是无效。有人有相关经验的微信我提供一下解决方案,是否在客户端代码可以指定websocket流量绕过所有代理,谢谢啦。有空要读一下RFC6455.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/93865.shtml

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

相关文章

89、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Zset 相关命令

本次讲解要点: ** Set相关命令:是指value中的数据类型** 启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe …

创建型设计模式 原型模式 建造者模式 创建者模式对比

创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色: 抽象原型类:规定了…

excel中将一个sheet表根据条件分成多个sheet表

有如下excel表,要求:按月份将每月的情况放在一个sheet中。 目测有6个月,就应该有6个sheet,每个sheet中体现本月的情况。 一、首先增加一个辅助列,月份,使用month函数即可。 填充此列所有。然后复制【月份】…

力扣练习——链表在线OJ

目录 提示: 一、移除链表元素 题目: 解答: 二、反转链表 题目: 解答: 三、找到链表的中间结点 题目: 解答: 四、合并两个有序链表(经典) 题目: 解…

Android之startActivityForResult过时升级替换方法

一。旧版回调 startActivityForResult(intent, 3);//注意要求码 //接收其它页面回传结果和显示图片Overridepublic void onActivityResult(int requestCode, int resultCode, Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);//页面传回来的值i…

Python之json的dump和dumps方法

一&#xff0c;dumps 将字典转换为字符串 info_dcit {foo1:a, foo2:b, foo3:c, } data_dumps json.dumps(info_dcit, indent4) print(data_dumps) # data_dumps: <class str>data_dumps: {"foo1": "a","foo2": "b","…

Redis与分布式-分布式锁

接上文 Redis与分布式-集群搭建 1.分布式锁 为了解决上述问题&#xff0c;可以利用分布式锁来实现。 重新复制一份redis&#xff0c;配置文件都是刚下载时候的不用更改&#xff0c;然后启动redis服务和redis客户。 redis存在这样的命令&#xff1a;和set命令差不多&#xff0…

十四天学会C++之第二天(函数和库)

1. 函数的定义和调用 在C中&#xff0c;函数是组织和结构化代码的关键工具之一。它们允许您将一段代码封装成一个可重复使用的模块&#xff0c;这有助于提高代码的可读性和维护性。 为什么使用函数&#xff1f; 函数在编程中的作用不可小觑。它们有以下几个重要用途&#xf…

ASUS华硕飞行堡垒5笔记本FX504GM_FX80GM原装出厂Windows10系统

系统自带所有驱动、出厂主题壁纸、系统属性华硕专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1C8vPvqiwqoUY3PxC915LXg?pwdv079

基于被囊群优化的BP神经网络(分类应用) - 附代码

基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于被囊群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.被囊群优化BP神经网络3.1 BP神经网络参数设置3.2 被囊群算法应用 4.测试结果&#x…

小白自己​制作一个苹果.ios安卓.apk文件app应用手机下载的代码合并文件一码双端的落地页面详细教程

小白自己制作一个苹果.ios安卓.apk文件app应用手机下载的代码落地页面详细教程 图片取自这里哈 我们在这篇文章中教你如何制作一个手机下载引导落地页。这个落地页将可以自动识别访问者使用的是安卓还是苹果设备&#xff0c;并引导下载相应的应用程序。让我们按照以下步骤一…

Selenium 浏览器坐标转桌面坐标

背景&#xff1a; 做图表自动化项目需要做拖拽操作&#xff0c;但是selenium提供的拖拽API无效&#xff0c;因此借用pyautogui实现拖拽&#xff0c;但是pyautogui的拖拽是基于Windows桌面坐标实现的&#xff0c;另外浏览器中的坐标与windows桌面坐标并不是一比一对应的关系&am…

P1223 排队接水 【贪心】

P1223 排队接水 【贪心】 题目描述 有 n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 Ti &#xff0c;请编程找出这 n 个人排队的一种顺序&#xff0c;使得 n 个人的平均等待时间最小。 输入格式 第一行为一个整数 n。 第二行 n 个整数&#xff0c;第 i 个整…

【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 1 篇:计算机系统概述

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术有限&#xff…

基于SpringBoot+MyBatis实现的个人博客系统(一)

这篇主要讲解一下如何基于SpringBoot和MyBatis技术实现一个简易的博客系统(前端页面主要是利用CSS,HTML进行布局书写),前端的静态页面代码可以直接复制粘贴,后端的接口以及前端发送的Ajax请求需要自己书写. 博客系统需要完成的接口: 注册登录博客列表页展示博客详情页展示发布博…

如何在 Google Earth 中创建轨迹、路线并制作动画

如何创建航迹 https://kurviger.de/en Google 地球飞行教程(天桥动画) 选择合适的点 &#xff08;可调整视图快照&#xff09;点击录制&#xff0c;依次点击图标即可

WebSocket实战之六心跳重连机制

一、前言 WebSocket应用部署到生产环境&#xff0c;我们除了会碰到因为经过代理服务器无法连接的问题&#xff08;注&#xff1a;该问题可以通过搭建WSS来解决&#xff0c;具体配置请看 WebSocket实战之四WSS配置 &#xff09;&#xff0c;另外一个问题就是外网环境不稳定经常…

操作系统原理实验四:管道通信、消息通信程序

实验四&#xff1a;管道通信、消息通信程序 课程名称&#xff1a;操作系统原理 项目名称&#xff1a;管道通信、消息通信程序 实验&#xff08;实训&#xff09;类型&#xff1a;综合性实验 实验&#xff08;实训&#xff09;课时&#xff1a;2 [目的和要求] 目的&#xff1…

基于SSM的餐厅点菜管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

使用select实现服务器并发

select函数介绍&#xff1a; select 函数是一个用于在一组文件描述符上进行异步I/O多路复用的系统调用。它可以同时监视多个文件描述符&#xff0c;等待其中任何一个文件描述符准备就绪&#xff0c;然后进行相应的操作。 以下是select函数的原型&#xff1a; #include <…