- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
liwen01 2024.09.16 。
802.11 无线 WiFi 网有三类帧:数据帧、管理帧、控制帧。与有线网相比,无线 WiFi 网会复杂很多。大部分应用软件开发对 WiFi 的控制帧和管理帧了解得并不多,因为它们在物理层和数据链路层就已经被处理了,上层应用很少能感知到.
一般是在设备出现 WiFi 连接不上,或者是工作不稳定的情况下,才会去分析 WiFi 驱动工作情况以及抓 WiFi 空口包数据来分析.
有抓过 WiFi 空口包的同学应该清楚,无线 WiFi 网的网络包不管是从包类型还是包信息内容来看,都会比有线网的包复杂很多.
这篇主要介绍有线网与无线 WiFi 网在物理层的差异、WiFi 介质访问控制原理和它的一些关键技术以及无线用户的接入过程.
WiFi 空口包抓包、分析,以及各类 WiFi 帧结构的介绍放到下一篇介绍。这篇是基础原理知识的介绍,也是后面一篇 WiFi 帧分析的基础.
在有线网络中,设备间通过网线相互连接,它的工作原理是:
载波侦听:设备在发送数据之前会先监听网络,以检测是否有其他设备在传输数据。如果检测到网络空闲,则开始发送数据.
冲突检测: 在数据发送过程中,设备持续监听网络。如果检测到冲突 (即两个或多个设备同时发送数据导致信号混合) ,发送数据的设备会停止传输,并发送一个“冲突信号”以通知网络上的其他设备.
重传数据: 发生冲突后,设备会等待一段随机的时间后再次尝试发送数据。这个随机等待时间称为“退避算法”,可以有效减少后续冲突的可能性.
这个就是有线网 CSMA/CD (Carrier Sense Multiple Access with Collision Detection,载波侦听多路访问与冲突检测) 的工作原理.
它依赖的是网线共享介质,设备在数据发送的过程中,还可以检测网线状态.
与有线网不同的是,无线网它是通过电磁波进行数据交互。无线是半双工工作模式,无线客户端没有同时进行接收和发送的能力,无法检测到冲突.
所以有线网络中的冲突检测方式,在无线中并不适用,并且无线中还存在相邻站点不一定能侦听到对方的情况:
手机位于两个路由器中间,并且距离两个路由器都比较远,这个时候路由器 AP1 检测不到路由器 AP2 的信号,两个路由器之间都不知道对方是否有在给手机 STA2 发送数据.
所以无线网引入了 CSMA/CA ( Carrier Sense Multiple Access with Collision Avoidance,载波侦听多路访问/冲突避免) 。
载波侦听:设备在发送数据之前也会监听无线信道,检查是否有其他设备在使用。只有信道空闲,设备才会继续执行发送操作.
冲突避免:为了尽量避免冲突,在发送数据之前,设备可能会先发送一个“准备发送”信号 (如RTS,即请求发送) ,并等待接收设备返回“允许发送”信号 (如CTS,即清除发送) .
数据发送:收到 CTS 信号后,设备才会发送数据.
ACK确认:数据发送成功后,接收设备会发送一个确认信号 (ACK) 。如果发送设备在规定时间内没有收到 ACK,它会认为数据丢失并重新发送.
由于无线网引入了额外的信号交换 (如 RTS/CTS) 和 ACK 等机制,增加了无线网设备连接、数据交互的复杂度.
在数据帧成功发送并被接收设备接收到后,接收设备会发送一个 ACK (Acknowledgment)帧 给发送设备,表示数据成功到达.
如果发送设备在指定时间内未收到 ACK,它会认为数据丢失并重新发送.
ACK 机制 保证了数据传输的可靠性,避免了数据丢失后无反馈导致的传输失败.
RTS/CTS 机制 是 CSMA/CA 中用于减少冲突的关键技术。它通过引入“准备发送”请求 (RTS) 和“允许发送”确认 (CTS) 这两个控制帧,在发送数据之前确保信道空闲,减少隐蔽节点问题.
RTS(Request to Send):发送设备首先向接收设备发送一个 RTS 帧,表明自己想要发送数据.
CTS (Clear to Send):接收设备在确认信道空闲后,会回复一个 CTS 帧,允许发送设备进行数据传输.
隐藏节点 指在接收者的通信范围内而在发送者通信范围外的节点.
暴露节点 指在发送者的通信范围之内而在接收者通信范围之外的节点 。
AP1 和 AP2 属于同一个信道,当 PC1 向 AP1 发送数据时,PC2 也希望向 AP2 发送数据.
根据 CSMA/CA 协议,PC2 侦听信道,它将听到 PC1 正在发送数据,于是错误地认为它此时不能向 AP2 发送数据,但实际上它的发送不会影响 AP1 的数据接收,这就导致 PC2 所谓暴露节点问题的出现.
通过 RTS/CTS 机制,避免了同时传输引发的冲突.
当信道忙碌时,设备不会立即重新尝试发送数据,而是会等待一个随机的时间段后再尝试。这种随机等待时间由 退避算法 (Backoff Algorithm) 决定,以减少多个设备同时再次尝试发送数据的可能性,从而避免冲突.
具体做法是,在每次检测到信道忙碌后,设备会生成一个随机退避时间。退避时间越长,设备等待的时间越久,从而分散重试时间点,降低冲突概率.
IFS (Interframe Space, 帧间间隔) 用于控制设备在发送数据帧之间的等待时间,以确保无线信道的公平性和有效性。根据不同的情况,IEEE 802.11 标准定义了几种不同类型的 IFS:
应用场景:用于高优先级的操作,如 ACK 确认帧、CTS 帧、以及从站的响应帧.
特点:SIFS 是所有 IFS 中最短的,确保重要数据能够迅速传输而不受其他帧的干扰。由于它的间隔短,接收方可以快速发出确认,减少等待时间,提高数据传输效率.
应用场景:用于集中控制模式下,接入点 (AP) 在无竞争的情况下使用,如在 PCF (点协调功能) 模式下的优先级操作.
特点:PIFS 的等待时间比 DIFS 短,但比 SIFS 长。它主要用于在竞争前启动通信,以便接入点在竞争阶段之前获得信道控制权.
应用场景:用于普通数据帧的传输,通常在竞争环境中使用.
特点:DIFS 是正常数据帧在竞争信道时使用的间隔。它的等待时间比 PIFS 长,确保优先级较低的设备在优先级较高的操作完成后再尝试发送数据.
应用场景:当一个设备接收到一个有错误的数据帧时,它会等待 EIFS 时间后再试图发送数据.
特点:EIFS 是所有 IFS 中最长的,旨在避免网络中更多的冲突或干扰发生。当设备认为信道状况不佳时,会使用更长的等待时间以减少进一步的冲突.
通过不同的 IFS 间隔时间,CSMA/CA 可以控制不同类型的数据帧在信道上的优先级。高优先级的数据帧 (如 ACK 和 CTS) 使用较短的间隔,确保它们能快速获得信道使用权.
通过强制设备在每次传输前等待一定时间,IFS 降低了多个设备同时传输的可能性,减少了冲突的发生.
载波侦听 在设备发送数据之前,它会先侦听无线信道,检查是否有其他设备在使用该信道。如果信道空闲,设备才会继续后续的发送操作。这一过程被称为 物理载波侦听.
虚拟载波侦听 是通过网络分配器 (如无线接入点) 来管理信道的占用情况,利用控制帧 (如 RTS/CTS)来减少冲突.
NAV 是无线设备在信道上听到某些控制帧 (如 RTS/CTS 或数据帧) 时设置的一个计时器。这个计时器表示该设备预计信道会被占用的时间,设备会在 NAV 计时器归零之前避免传输数据.
NAV 设置: 当一个设备在无线信道上接收到某个帧 (如 RTS 或 CTS) 时,它会读取该帧中的持续时间字段 (Duration Field) 。这个字段表示该帧预期的占用时间,包括发送数据帧和接收 ACK 所需的时间。接收设备会根据这个持续时间设置自己的 NAV 计时器.
信道占用判断: 当设备的 NAV 计时器大于零时,设备会认为信道正在被其他设备占用,因此不会尝试进行传输。NAV 计时器归零后,设备会再次检查信道是否空闲,如果空闲,则可以开始自己的传输.
NAV 与物理载波侦听的结合:NAV 是一种 虚拟载波侦听 机制,它与 物理载波侦听 相结合.
物理载波侦听是通过硬件直接检测信道上的信号强度,来判断信道是否被占用.
NAV 通过读取帧信息来推断信道的占用状态。物理载波侦听与 NAV 结合使用,有助于更准确地判断信道状态,减少冲突.
PC1 给路由器发送数据帧,同一个范围的PC2、PC3、phone 也会收到该数据帧帧.
PC1 发送的数据帧在该帧的 MAC 头部有个 Duration 字段,表示持续时间,它包括一个短帧间间隔(SIFS)时间加上 ACK 帧的时间,假设该时间是50us.
PC2、PC3、phone 在收到 frame 数据帧后,会去读取该帧的 Duration 字段,然后重置自己的 NAV 计数器为 Duration 字段的值 50 us.
我们手机、笔记本电脑等设备的 WiFi 模块一般工作在 STA 模式,路由器的 WiFi 一般工作在 AP 模式。当我们 STA 设备连接到路由器 AP 的时候,有三个过程:扫描、认证、关联.
扫描阶段 STA进行扫描,定期搜索周围的无线网络,获取到周围的无线网络信息.
认证阶段 STA 接入 WiFi 网络前需要进行终端身份验证,即链路认证。链路认证通常被认为是终端连接 AP 并访问 WiFi 的起点.
关联阶段 完成链路认证后,STA 会继续发起链路服务协商.
扫描阶段 (Scanning) 是 WiFi 设备连接无线网络的第一步,设备通过扫描找到可用的无线接入点 (Access Point, AP) ,从而选择合适的 AP 进行连接。WiFi 标准中定义了两种主要的扫描方式:主动扫描 (Active Scanning) 和被动扫描 (Passive Scanning) 。每种方式有其特点和应用场景.
在主动扫描过程中,设备会主动向周围的无线信道发送探测请求 (Probe Request) ,并等待 AP 发送探测响应 (Probe Response) 。这个过程可以快速发现周围的 WiFi 网络,尤其是在设备不知道有哪些网络可用的情况下。主动扫描的过程分为以下几个步骤:
探测请求 (Probe Request) 设备依次切换到不同的信道 ( WiFi 网络使用多个信道进行通信,不同的标准使用不同的信道范围,比如 2.4GHz 频段有 14 个信道) .
在每个信道上,设备会发送探测请求帧 (Probe Request) 。这个探测请求可以是针对所有网络的广播,也可以是针对特定 SSID 的单播.
针对某个特定 SSID 的单播,探测包中有携带需要探测的 SSID 信息,只有 SSID 能够匹配上的 AP 才会返回探测响应包.
这种场景一般是设备已经配置过网络,设备端有保存需要连接的 AP ,设备上电就直接扫描该 AP 是否存在.
当探测请求是针对所有网络的广播时,探测包中 SSID 信息是为 NULL,接收到该探测包的 AP 都会返回探测响应包.
比较常见的场景是我们要手动去连接 WiFi 时,先会去扫描所有的信道的 WiFi 热点,然后生成一个 WiFi 热点列表.
探测请求的主要内容包括:
探测响应 (Probe Response) 。
AP在接收到探测请求后,会返回探测响应帧 (Probe Response) 。这个响应帧包含AP的详细信息,例如:
主动扫描的优缺点:
优点:能够快速发现隐藏的 WiFi 网络 (隐藏SSID的网络) ,因为设备可以通过探测请求主动询问某个特定SSID的存在.
缺点:主动发送请求帧会增加设备的能耗,且在某些环境中可能暴露设备的存在和意图,减少隐私性.
在被动扫描过程中,设备不会主动发送探测请求,而是通过监听特定信道上的信标帧 (Beacon Frame),从中获取 AP 的信息。信标帧是 AP 定期广播的一种特殊的管理帧,所有设备只需监听信道即可获知周围可用的网络.
信标帧 (Beacon Frame) 。
AP 会定期 (通常是100ms)在指定信道上广播信标帧。信标帧包含了AP的关键信息,包括:
监听信道 。
被动扫描的优缺点:
优点:更节能,因为设备只需被动监听信标帧,而不需要主动发送请求。它也不会暴露设备的身份和意图,增强了隐私性.
缺点:相比主动扫描,发现 AP 的速度较慢,因为设备必须等待 AP 广播信标帧。尤其在密集的网络环境中,等待多个 AP 广播信标帧可能会耗费更多时间.
认证是设备和 AP 之间相互确认身份的过程。在传统的 WiFi 认证中,有两种方式:
开放系统认证 (Open System Authentication):这是最简单的方式,不需要设备和AP之间进行任何密钥交换,所有请求都会通过.
共享密钥认证 (Shared Key Authentication):设备和 AP 会通过 WEP (Wired Equivalent Privacy) 密钥进行加密认证。这种方式现已很少使用,因为 WEP 的安全性较差,已被更强的 WPA/WPA2/WPA 3等认证方式取代.
现代 WiFi 网络一般使用 WPA/WPA2/WPA3 等协议进行身份验证,结合了 PSK (Pre-Shared Key) 或企业级的 RADIUS 认证服务器来提升安全性.
WiFi 认证就简单介绍这些,后面会专门再针对 WiFi 认证做详细介绍.
在完成扫描和认证阶段之后,设备必须通过关联阶段,才能与无线接入点 (Access Point, AP) 建立正式的连接,并开始进行数据通信。在这个阶段,设备与 AP 之间会进行详细的参数交换,确保双方能够兼容并高效地进行后续通信.
关联阶段包括 关联请求 (Association Request) 和 关联响应 (Association Response) 两部分:
在认证通过后, WiFi 设备会发送一个关联请求帧 (Association Request),请求与 AP 建立正式的连接。这个关联请求帧携带了设备的详细信息,以便 AP 了解设备的能力,并确定双方能否以最佳方式进行通信.
关联请求帧的主要字段包括:
AP 接收到设备的关联请求帧后,会检查设备的请求信息,评估其是否能够接受设备的连接。通常,AP 会基于设备的能力和当前网络的负载情况作出决定。然后,AP 会通过 关联响应帧 (Association Response) 来通知设备是否成功关联.
关联响应帧包括以下重要信息:
一旦设备收到关联成功的响应帧,它就会正式成为 AP 的一部分,并可以开始通过AP 访问网络资源。关联成功后的状态有以下几个关键点:
关联过程并非总是成功的,可能的失败原因包括:
上面主要介绍了有线网与 WiFi 无线网在物理层的差异、WiFi 介质访问控制原理及其关键技术、无线用户的接入过程.
下一篇将介绍 WiFi 空口包抓包、以及各类 WiFi 包的解析.
上面内容,如有错误,欢迎评论区提示指出,不胜感激.
。
最后此篇关于WiFi基础(四):WiFi工作原理及WiFi接入过程的文章就讲到这里了,如果你想了解更多关于WiFi基础(四):WiFi工作原理及WiFi接入过程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实
📒博客首页:崇尚学技术的科班人 🍣今天给大家带来的文章是《Dubbo快速上手 -- 带你了解Dubbo使用、原理》🍣 🍣希望各位小伙伴们能够耐心的读完这篇文章🍣 🙏博主也在学习阶段,如若发
一、写在前面 我们经常使用npm install ,但是你是否思考过它内部的原理是什么? 1、执行npm install 它背后帮助我们完成了什么操作? 2、我们会发现还有一个成为package-lo
Base64 Base64 是什么?是将字节流转换成可打印字符、将可打印字符转换为字节流的一种算法。Base64 使用 64 个可打印字符来表示转换后的数据。 准确的来说,Base64 不算
目录 协程定义 生成器和yield语义 Future类 IOLoop类 coroutine函数装饰器 总结 tornado中的
切片,这是一个在go语言中引入的新的理念。它有一些特征如下: 对数组抽象 数组长度不固定 可追加元素 切片容量可增大 容量大小成片增加 我们先把上面的理念整理在这
文章来源:https://sourl.cn/HpZHvy 引 言 本文主要论述的是“RPC 实现原理”,那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call
源码地址(包含所有与springmvc相关的,静态文件路径设置,request请求入参接受,返回值处理converter设置等等): spring-framework/WebMvcConfigurat
请通过简单的java类向我展示一个依赖注入(inject)原理的小例子虽然我已经了解了spring,但是如果我需要用简单的java类术语来解释它,那么你能通过一个简单的例子向我展示一下吗?提前致谢。
1、背景 我们平常使用手机和电脑上网,需要访问公网上的网络资源,如逛淘宝和刷视频,那么手机和电脑是怎么知道去哪里去拿到这个网络资源来下载到本地的呢? 就比如我去食堂拿吃的,我需要
大家好,我是飞哥! 现在 iptables 这个工具的应用似乎是越来越广了。不仅仅是在传统的防火墙、NAT 等功能出现,在今天流行的的 Docker、Kubernets、Istio 项目中也经
本篇涉及到的所有接口在公开文档中均无,需要下载 GitHub 上的源码,自己创建私有类的文档。 npm run generateDocumentation -- --private yarn gene
我最近在很多代码中注意到人们将硬编码的配置(如端口号等)值放在类/方法的深处,使其难以找到,也无法配置。 这是否违反了 SOLID 原则?如果不是,我是否可以向我的团队成员引用另一个“原则”来说明为什
我是 C#、WPF 和 MVVM 模式的新手。很抱歉这篇很长的帖子,我试图设定我所有的理解点(或不理解点)。 在研究了很多关于 WPF 提供的命令机制和 MVVM 模式的文本之后,我在弄清楚如何使用这
可比较的 jQuery 函数 $.post("/example/handler", {foo: 1, bar: 2}); 将创建一个带有 post 参数 foo=1&bar=2 的请求。鉴于 $htt
如果Django不使用“延迟查询执行”原则,主要问题是什么? q = Entry.objects.filter(headline__startswith="What") q = q.filter(
我今天发现.NET框架在做计算时遵循BODMAS操作顺序。即计算按以下顺序进行: 括号 订单 部门 乘法 添加 减法 但是我四处搜索并找不到任何文档确认 .NET 绝对 遵循此原则,是否有此类文档?如
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
API 回顾 在创建 Viewer 时可以直接指定 影像供给器(ImageryProvider),官方提供了一个非常简单的例子,即离屏例子(搜 offline): new Cesium.Viewer(
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!