谈谈 Wi-Fi 的 RTS/CTS 设计
我不是专业的 Wi-Fi 技术工作者。但我可以谈谈作为统计复用网络的 Wi-Fi,通用的网络分布式协调功能在底层是相通的。
从一个图展开:

基于这底层逻辑,共享以太网可以用 CSMA/CD,而 Wi-Fi 只能用 CSMA/CA,区别在 CD(冲突检测) 和 CA(冲突避免)。
以太网做冲突检测很简单,直观讲,假设把信号电压约束在 0~5V,只要检测到大于 5 + δV 电压就意味着冲突,但 Wi-Fi 就没这么简单,于是隐藏节点和暴露节点问题被拎出来。
在调查评估这些问题事实上有多大影响,需不需要花大力气解决之前,工人的思路往往是先解决它们。因为无法 CD,则只能 CA。从另一个更合理的角度看,如果不能 CD,最简单的方法应只保留 CSMA,而不是解决不能 CD 的问题。没有了 CD,Wi-Fi 的 MAC 逻辑变得更加简洁:直接随机二进制退避发送,直到成功或彻底失败。
但这种极简的 MAC 逻辑会带来比较大的冲突概率,显然无法满足性能需求,那么接下来的起点应从物理层入手,从此步入正轨。但即使 802.11 也有犯糊涂的时候,产出了 RTS/CTS 这种复杂但没卵用的设计。同样的故事在 TCP 演进过程中经常发生,降低物理层误码率,很多拥塞控制层面复杂的丢包检测机制和算法就不再需要。在物理层尚未做出改变前,等待好于折腾。典型的本末倒置设计一般都是希望其外的金玉掩盖其中的败絮开始。
回到上图,信号特征的区别是有线无线网络的最本质区别,RTS/CTS 的思路也简单,见招拆招,既然信号在接收端看起来比较拉,就从 receiver 而不是 sender 入手来检测或避免冲突,流程就顺理成章了。
但欲发送数据帧的 sender 根本不知道 receiver 的情况,既不知道距离多远,也不知道 receiver 附近是否有自己检测不到的其它传输正在发生,唯一能做的就是低成本询问。由于共享介质特征,询问结果至少需要保留一帧成功接收的时间,这次询问才有意义,于是询问必须带有 “资源预留” 的含义:
- sender 附近的节点均可收到信号强度不弱的 RTS,获知了 sender 的资源预留申请;
- receiver 如果能收到 RTS 并回复 CTS,CTS 足够强到让其附近节点收到,它们也获知 sender 的资源申请;
- CTS 回到 sender,sender 开始发送帧;
- receiver 如果收不到 RTS,sender 将超时重试发送 RTS;
这样一来,sender,receiver 附近的所有相关节点都知道了 sender 将有帧要发往 receiver,并主动避让,避让时间包含在 RTS,CTS 帧头字段中,大约为 sender 成功发帧的时间。这一切看起来就是这么顺理成章。
理论上,RTS 中应该包含两个 “避让时间”,一个是 sender 附近节点需要避让的时间 D1,另一个是 receiver 附近节点需要避让的时间 D2,由 receiver 在 CTS 中 echo 回来被其附近节点收到,D1 < D2。原因也不难理解,D1 只是 RTS/CTS 这种短帧来回的时间,而 D2 才是长数据帧来回的时间。如果 sender 的 RTS 有去无回,附近其它节点就可以竞争信道,回避 D2 的时间就没有必要。
更进一步,D1 甚至可以是 0,只要 sender 附近节点听不到 receiver 发送的 CTS,它们就可以自由和其它节点通信,从而解决暴露节点问题。但 802.11 只是简单的全部避让。
看起来很不错的一个机制,但仔细琢磨,它只是在小心翼翼避免根本避免不了或根本不会发生的问题:
- 如果 sender 要发送的数据帧很短,何不直接发送(或者包在 RTS/CTS 中)呢;
- AP 对任何节点均可达,AP 根本没有隐藏站,暴露站问题;
- 虽然 RTS/CTS 相比数据帧很小,在越来越大的带宽下,二者影响越来越一致;
- 隐藏站和暴露站并不多见…
如果不能精确认领和解决问题,在弹性系统中交给概率是最好方法。RTS/CTS 机制非常类似 TCP 的 D-SACK,对大多数场景帮助不大,少数可以帮助到的场景,获得的全局收益不大。它也非常像人们集中大量时间和精力优化异常流的做法,比如优化 TCP 丢包检查和重传,却只为解决非常罕见的问题。
同样都是 “链路资源预留”,电路交换就是精确认领解决问题,仔细品它们的区别。类似的经验在数据中心正在融合,还是那个观点,网络越往高速发展,就越不可抗拒地将设计推回到面向连接的电路交换,同时代价也是昂贵的,但作为非汇聚非骨干的普通接入网络,高速和通用兼容需要权衡轻重,这一点上,Wi-Fi,TCP,接入以太网有相似的特征,它们成功的原因一致,也踩过同样的坑。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
谈谈 Wi-Fi 的 RTS/CTS 设计
我不是专业的 Wi-Fi 技术工作者。但我可以谈谈作为统计复用网络的 Wi-Fi,通用的网络分布式协调功能在底层是相通的。 从一个图展开: 基于这底层逻辑,共享以太网可以用 CSMA/CD,而 Wi-Fi 只能用 CSMA/CA,区别在 CD(冲…...
JVM 详解
一. JVM 内存区域的划分 1. 程序计数器 程序计数器是JVM中一块比较小的空间, 它保存下一条要执行的指令的地址. [注]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码. 2. 栈 保存方法中的局部变量, 方法的形参, 方法之间的调用关系. 栈又…...
【debug】
error info: Error response Error response Error code 401. Message: Unauthorized. requests.exceptions.ConnectionError: HTTPConnectionPool(host‘127.0.0.1’, port9000): Max retries exceeded with url: /test/ (Caused by NewConnectionError(‘&l…...
PCB注意事项
1.记录一下我绘制PCB中遇到的一些坑 4G模块和SIM卡的信号线最好距离短,SIM卡下 不要过线 晶振是高速信号,两根线要尽可能差分,保持长度一直,而且线尽可能加粗,晶振下最好不要有线经过 继电器中间需要间隔 继电器中间挖空,起到隔离作用,绝缘,因为继电器有可能接市电220v 高压…...
Nmap使用指南
目录 nmap命令大全 1. 安装Nmap 2. 基本扫描 2.1 扫描单个IP地址 2.2 扫描指定端口范围 2.3 扫描整个子网 3. 高级扫描 3.1 服务版本检测 3.2 操作系统检测 3.3 脚本扫描 3.4 扫描速度 4. 输出结果 4.1 保存到文件 4.2 格式化输出 5. 注意事项 6. 进一步学习 n…...
社区版Dify 轻松实现文生图,Dify+LLM+ComfyUI
社区版Dify 轻松实文生图,DifyLLMComfyUI Dify 安装可参考这里ComfyUI 其实 比 WebUI更简单更实用DifyComfyUIDifyLLM1. Qwen 通义千问大模型系列2. OpenAI大模型系列3. 本地Ollama搭建 DifyLLMComfyUI Dify 安装可参考这里 这是一个在Dify上实现 文生图的教程&…...
Python - 获取当前函数中的所有参数信息(名称和值)
代码 import inspect import randomclass P:def start(self, p1, p2, p3None, p4None):arg_info inspect.getargvalues(inspect.currentframe())kwargs arg_info.locals # 获取到所有参数print(kwargs)del kwargs["self"]try:self._start(**kwargs)except Except…...
PHP之伪协议
文章目录 PHP伪协议php://协议data://协议file://协议phar://协议zip:// & bzip2:// & zlib://协议 过滤器 题目练习[BJDCTF 2020]ZJCTF,不过如此BaseCTF[week1]Aura酱的礼物 PHP伪协议 file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// …...
关于Vue的子组件改变父组件传来的值
一、组件直接传值 大家都知道父子组件传值的方案,有以下几个,不再详细敖述 Props:父组件向子组件传递数据 $emit:子组件通过自定义事件向父组件传递数据 .sync修饰符:一个方便且强大的工具,可以简化父子组…...
jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针
概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…...
网络层协议--ip协议
目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由:在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…...
【总结整理】 神经网络与深度学习 邱锡鹏 课后习题答案 扩展阅读链接
本文主要针对神经网络神经网络邱锡鹏 2~8 章的课后习题进行理解的过程中,搜索到的讲的会比较透彻的链接整理。适合有一定基础但是想了解更细的人阅读。 主要参考书籍 首先是本书pdf可在神经网络与深度学习获取; 主要参考的课后习题答案为nndl/solution…...
使用 Three.js 创建一个 3D 人形机器人仿真系统
引言 在这篇文章中,我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向,并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先,我们需要…...
图像修复和编辑大一统 | 腾讯北大等联合提出BrushEdit:BrushNet进阶版来了
文章链接:https://arxiv.org/pdf/2412.10316 项目链接:https://liyaowei-stu.github.io/project/BrushEdit 亮点直击 提出了BrushEdit,这是先前BrushNet模型的高级迭代版本。BrushEdit通过开创基于修复(inpainting)的图…...
【hackmyvm】Adroit靶机wp
tags: HMVjava反编译SQL注入 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. java反编译4. sql注入5. 解密密码6. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmAdroit 作者 alienum 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 ┌──(root㉿kali)-[~] └…...
【Python运维】自动化备份与恢复系统的实现:Python脚本实战
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息化进程的加速,数据的重要性日益增加,数据丢失的风险也随之增加。为了保证数据安全,定期备份和及时恢复数据是必不可少的操作。本…...
Goland 安装与使用
GoLand安装 官方网址: JetBrains GoLand:不只是 Go IDE 1. 进入官网,点击下载: 2. 如下图一步步安装 3. 如下图一步步安装...
vue2 升级为 vite 打包
VUE2 中使用 Webpack 打包、开发,每次打包时间太久,尤其是在开发的过程中,本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…...
FreeSwitch中启用WebRTC
在FreeSwitch中启用WebRTC需要进行一系列配置。以下是详细的步骤: 1. 安装必要的依赖: 确保安装了支持WebRTC的依赖库,如libsrtp。 2. 配置SIP Profile: 编辑 conf/sip_profiles/internal.xml 文件,添加或修改以下内…...
R语言的数据类型
标题:《探索R语言数据类型的奥秘》 引言: 在统计学和数据分析的世界里,R语言无疑是一颗璀璨的明星。它以其强大的数据处理能力和丰富的图形展示功能而受到广泛欢迎。然而,要熟练掌握并高效使用R语言,深入了解其数据类…...
开源工具Unlock Music:重获音频自由的完整指南
开源工具Unlock Music:重获音频自由的完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitc…...
Automerge与区块链技术结合:构建去中心化数据协作的终极指南
Automerge与区块链技术结合:构建去中心化数据协作的终极指南 【免费下载链接】automerge A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically. 项目地址: https://gitcode.com/gh_mirr…...
7个关键步骤!Triton推理服务灾备演练与故障注入测试全指南
7个关键步骤!Triton推理服务灾备演练与故障注入测试全指南 【免费下载链接】server The Triton Inference Server provides an optimized cloud and edge inferencing solution. 项目地址: https://gitcode.com/gh_mirrors/server117/server Triton Inferen…...
如何用OpenCore Legacy Patcher让老款Mac焕发新生:终极完整教程
如何用OpenCore Legacy Patcher让老款Mac焕发新生:终极完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革…...
Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别
Hunyuan-OCR-WEBUI新手入门:3步搞定复杂文档文字识别 1. 引言:为什么选择Hunyuan-OCR-WEBUI? 在日常工作和学习中,我们经常会遇到需要从图片或PDF中提取文字的场景。无论是扫描的合同、手写的笔记,还是复杂的表格文档…...
csp信奥赛c++之字符数组与字符串的区别
csp信奥赛c之字符数组与字符串的区别 一、字符数组与字符串的区别(详细讲解) 在C(尤其信奥赛CSP常用环境)中,“字符数组”和“字符串”通常指两种不同的数据类型或存储方式: 特性字符数组 (char[])字符串…...
DAMOYOLO-S数据库联动应用:检测结果自动化存储与查询
DAMOYOLO-S数据库联动应用:检测结果自动化存储与查询 你有没有遇到过这样的场景?一个智能安防摄像头,每天24小时不间断地运行,DAMOYOLO-S模型在里面兢兢业业地识别着每一个经过的人和车。但问题是,这些宝贵的检测结果…...
5分钟快速上手:Switch注入完整指南与TegraRcmGUI使用教程
5分钟快速上手:Switch注入完整指南与TegraRcmGUI使用教程 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 如果你正在寻找一款简单易用的Switch注…...
全自动洗衣机组态王与三菱PLC联机及仿真探索
全自动洗衣机组态王6.53,6.60和三菱PLC联机和仿真程序包最近在研究自动化控制领域相关内容,接触到了全自动洗衣机组态王 6.53、6.60 与三菱 PLC 的联机以及仿真程序包,感觉很有意思,今天就来和大家分享分享。 一、组态王与三菱 PLC 联机的意义…...
从Simulink仿真到硬件实现:DAB双有源全桥的PID参数‘手感’如何传递?
从虚拟到现实:DAB双有源全桥PID参数迁移实战指南 当你在Simulink中看到完美的DAB动态响应波形时,那种成就感就像解开一道复杂的数学题。但现实往往给你当头一棒——同样的PID参数烧录到DSP后,示波器上的波形却像喝醉了一样东倒西歪。这不是你…...
