如何绕开运营商的 QoS 限制

news/2024/5/18 11:52:47 标签: 网络, tcp/ip, udp

运营商针对 UDP 进行限制,这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一,上了线很多问题,丢包,慢等的问题严重增加运维,运营成本。

按照运营商五元组 QoS 这种简单粗暴不惹事的原则,只要换一个端口就可绕开限制。很多 UDP 服务,用久了就慢,往往重启一下就好了,大概就是这原因,我不是运营商,所以不能确定。

此外,若限制单 IP 或源 IP/目标 IP 二元组,考虑到 NAT,可能引起用户投诉,所以如果要限制 IP 二元组,一般发生在 NAT 之前。

千万不要觉得运营商在公网大流量下解析 TCP,UDP 报头是什么难事,TCP 和 UDP 报头均将两个端口号放在前 32 位,解析两个协议可用同一套代码,从固定位置取值 hash 即可。如果 TCP 当初将端口号安排在报头变长部分,或者干脆和 payload 一起加密,就真没法解析了,运营商就没办法将数据包映射到流。但这也损害了端主机的分层模型-必须在解密后才能解复用(密钥从何协商而来?),或至少要先 “理解” 上层逻辑,从 TLV 中解出端口…

UDP-Based 协议的优势是可随便换端口,可这么好的特性往往大家都不用,偏偏把 UDP 视作 “连接”。QUIC 头有个 Connection ID 字段,这个才标识 “连接”,UDP packet 只是一个箱子,所以 QUIC 可以通过不断换端口来避开 QoS 限制。若是自研协议,可以学 QUIC 的样子换端口,加个 “会话层” 而已。

我此前的经验,换端口有时没有效果有时有,限速发生在不同位置效果不同。举个例子,如果运营商对你的流量做了 NAT,且在 NAT 之前针对你的源 IP/目标 IP 二元组限制,那换端口也没用,但在 NAT 之后,多 inner IP 共享少得多的 outer IP,典型的 NAPT 场景,运营商一般不会对 IP 二元组进行限制以免误伤招致投诉甚至客户流失,这种情况下,你换端口,基本上就绕过了。

此外,IPv6 可能还不太一样,虽然 IPv6 号称可以点到点,但同时也可以更精细定位到谁是谁。

在 QoS 限制五元组之外,运营商还可能针对目标端口进行限制。由于 UDP 无连接,易打洞的特点,在公网私搭服务器是相对容易的,但凡运营商发现有大流量发向同一端口,可能就会限制了。关于目标端口要不要换的问题,能换就换。
我倾向于在传输层以上实现自己的换端口协议,无论换源端口还是换目标端口,就像 QUIC 那样。

再看 TCP。

TCP 自带拥塞控制,sender 发太猛会丢包,丢包会乘法比例减少 cwnd,似乎不需要额外 QoS 限制。但运营商的事该做还得做,且谁也不能保证 sender 的 TCP 实现一定标准,现在有很多魔改,如一个报文发两遍,所谓 FEC 就是这样跟运营商对着干,抢带宽。

运营商 QoS 手段很简单,跟 UDP 一样,直接针对元组限速或丢包(也可能是管理员疏忽或懒惰,加上的限制策略忘删了)。应对方案也一样,断开重连,换个端口。但由于很多应用都没断点续传,TCP 重连成本很高,虽有 fastopen 新特性,但运营商设备往往不支持。

但可构建 TCP 隧道,实现类似直播的延时 buffer,断点续传,通过这个方法重连 TCP 隧道,达到换端口的目的。或构建多条隧道实现平滑切端口。

TCP 四次挥手太昂贵,Time-Wait 没现实意义,为降低 TCP 断连成本,选择 RST 而不是优雅断开是高尚的。

TCP 为闭环,处理 SYN/FIN 状态机最麻烦,如果经常和 TCP 打交道,80%+ 的问题都和连接管理相关,但 TCP 连接管理标准中想避开的问题发生概率极低。不为小概率事件付出太多,这是 RST 断连的依据。fastopen 运营商不支持也没办法,但还是要试一下 SYN 报文携带一些数据能不能过去,我用该手段做过一个敲门方案,完全可以通过(但不能保证所有线路都可通过),如果对端是自己的,那就收了,省掉握手开销。

换端口,RST 重连,SYN 捎带,这些都是简单常见的绕开限制的方法,至于别的一些奇技淫巧,参考 TCP 不可靠传输 和 假 TCP。

浙江温州皮鞋湿,下雨进水不会胖。


http://www.niftyadmin.cn/n/143722.html

相关文章

【Android笔记82】Android之Room操作SQLite数据库及其使用方法

这篇文章,主要介绍Android之Room操作SQLite数据库及其使用方法。 目录 一、Room操作数据库 1.1、什么是Room 1.2、Room中的三个角色 1.3、Room的简单使用

windows server服务器卡死,无法进行任何操作,如何远程进行重启?

目录 添加Windows凭据 命令 添加Windows凭据 在进行远程操作之前先添加一下凭据,免得在执行远程重启服务器的命令时提示拒绝访问,操作如下: 先打开控制面板 进入用户账户,接着找到管理windows凭据的选项 选择添加 如果觉得这种方式麻烦的话可以直接使用以下命令…

智能指针:weak_ptr

weak_ptr(弱引用智能指针)弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手,它不管理shared_ptr 内部的指针。std::weak_prt没有重载操作符 * 和 ->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数&a…

机器学习方法基础与概论(一)(机器学习方法分类)

文章目录机器学习的分类监督学习无监督学习半监督学习强化学习按模型分类概率模型与非概率模型线性模型与非线性模型参数化模型和非参数化模型按技巧分类贝叶斯学习核方法References机器学习方法可以概括如下,从给定的、有限的、用于学习的训练数据集合出发&#xf…

【算法】最直接的算法——穷举法详解

第三章 穷举法 一、基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环。 穷举法以来的基本技术是遍历,也…

Python循环结构

文章详细介绍了Python中的循环结构,包括for循环、while循环以及range()函数的使用方法。 Python提供了很多种循环结构,其中最常用的是for循环和while循环。 当我们写代码的时候,有时候需要重复执行同一个或一些指令。例如,如果我…

常见编程语言的异同

以下给出 C、C、Java、JavaScript、PHP、Python 这些常见编程语言的异同 语言特点 脚本语言(scripting language):JavaScript、Python、PHP 程序执行 编译型(compiled):C、C、Java解释型(inter…

学习从USGS中下载真实世界高度图并导入Houdini

目标 参考 Downloading Digital Elevation Data (SRTM) from USGS EarthExplorer - YouTube 学习从USGS上下载真实世界高度图数据。并尝试导入Houdini。 USGS:https://earthexplorer.usgs.gov/ 0. 注册账号并登录 如果还没有账号,需要在这里注册账号…