Wi-Fi网络的一个极其重要的特点就是移动性。例如,一个人可以在使用Wi-Fi电话进行通话或是从服务器上下载大数据量的文件时穿过一幢建筑物。用户设备内部的Wi-Fi无线电可以从一个接入点漫游至另一个接入点,这样就提供了无缝连接。至少,这是我们所希望实现的!

过去,我曾遇到过漫游的问题,所以我决定做一些测试,来看看其中的究竟。我尤其感到好奇的是漫游实际上有多快,以及它是否对无线应用造成破坏。

我的测试配置包含两个接入点,一个接入点(AP-1)设置为信道1,另外一个(AP-2)设置为信道6。其它设置都采用缺省值,比如信标间隔为 100毫秒,屏蔽RTS(请求发送)/CTS(允许发送)功能,等等。两个接入点被安装在一幢典型的办公建筑上,通过每一个接入点的广播蜂窝提供最低25分贝的信噪比,且蜂窝间有20%的重叠。这都是些无线语音应用的工业标准。在我的测试中,漫游客户端是一台内置了Centrino Wi-Fi 广播(Intel 2915ABG)的笔记本电脑。

当手持无线客户端站立在离AP-1几英尺距离内的时候,我使用AirMagnet笔记本电脑分析仪(通过另一个Wi-Fi卡插入笔记本电脑的PCMCIA插槽)来确保我与AP-1之间保持关联。然后,我开始从服务器向笔记本电脑进行FTP大文件传输,并且使用AirMagnet分析仪测量802.11数据包的踪迹。在整个测试过程中下载文件时,我向AP-2移动,直到我直接靠近它。有了数据包踪迹,我就能查看802.11数据帧的交换情况,计算漫游的延时,还能知道FTP流是否遭到明显的破坏。

一旦客户端广播决定重新关联,它就会向AP-1发送一些802.11解除关联帧来开始重新关联的过程。然后,广播发出802.11探测请求以在客户端的有效信号范围内获得接入点的响应。这样做是为了确保客户端广播能够在决定与哪个接入点关联之前收到这些候选的最新信息(信标信号强度)。

AP-2响应了802.11探测请求。因为仅有的响应来自AP-2,客户端射频卡决定与AP-2关联。正如我们所预料的,与AP-2关联的过程包括802.11认证帧和关联帧的交换(基于802.11公开系统认证)。重新关联的过程用时68毫秒,是指自客户端广播向AP-1发送第一帧解除关联帧起、到客户端收到来自AP-2的最终关联帧(响应)为止所经历的时间。还不错,我发现了一些与其它厂家生产的接入点相似的数值。

然而,整个漫游过程会中断无线应用,并且时间还挺长。例如,据我的测试,在射频卡开始重新关联过程(即,向AP-1发出第一个解除关联帧)之前,FTP过程平均暂停5秒。我测量的802.11数据包的踪迹显示,在放弃传输数据并开始与AP-2重新关联之前,客户端广播向AP-1反复重新传输数据(由于信号强度弱)。这些数量可观的重新传输打断了文件下载过程,使我测试中的实际漫游延迟达到平均5秒!我测试所使用的Centrino射频卡因为这种问题而受人诟病,但是我发现这也是大多数其它射频卡的问题。

生产厂商或许可以使射频卡拖延重新关联,来避免过早的、额外的重新关联(接入点跳跃?)。不幸的是,这样会中断一些无线应用。如果你打算部署移动无线应用,那么务必测试漫游如何影响你的应用。

各型号的射频卡在漫游过程中的工作方式各异,这缘于专有机制,而且,一些卡比其它卡要好些。只要记住漫游所需时间可能比预想的要长得多,所以在部署无线局域网应用的时候,尤其是无线语音,它对超过100毫秒的漫游延迟是无法接受的。

Wi-Fi漫游的工作原理的更多相关文章

  1. Android系统Recovery工作原理之使用update.zip升级过程分析(一)

    通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动 ...

  2. keeplived工作原理及配置

    一.keepalived简介及作用 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能 keepal ...

  3. 【科普】Web(瓦片)地图的工作原理

    [译者按:在看MapBox Guides文档时,看到这篇 How do web maps work?,这篇文档通俗易懂地阐述了Web地图是如何工作的,其实更偏向讲瓦片地图的工作原理,鉴于之前很多人不了 ...

  4. Wifi模块的工作原理

    http://www.wifitop1.com/news/content-98.html 在无线网络领域里面,无线wifi是最火的名词.对于串口wifi模块的工作是什么呢?串口wifi模块又有什么功能 ...

  5. Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ...

  6. WireGuard 教程:WireGuard 的工作原理

    原文链接:https://fuckcloudnative.io/posts/wireguard-docs-theory/ WireGuard 是由 Jason Donenfeld 等人用 C 语言编写 ...

  7. keepalived的工作原理解析以及安装使用

    一.keepalived keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障. keepalived官网http://www.keepali ...

  8. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  9. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

随机推荐

  1. 织梦DEDECMS {dede:field name='position'/}标签增加其它属性的

    在默认情况下,织梦(DedeCms)系统当前位置的调用标签为: {dede:field name='position'/} 在这种默认的情况下,生成后的代码大致为如下格式: 主页 > 应用软件 ...

  2. asp.net中应用JQuery.pagination分页

    JQuery.pagination这款分页控件非常好用,可实现无刷新分页,为了方便下次做项目便于拷贝,所以在此发布一下,具体的实现流程如下: 效果图: JQuery.pagination的各个参数的说 ...

  3. C# Gma.QrCodeNet生成二维码

    一.使用C#生成二维码类库之一是qrcodenet 源代码地址: http://qrcodenet.codeplex.com/ 二.使用实例 定义处理字符串 static string url = & ...

  4. Page_Load基类,重写OnLoad

    protected override void OnLoad(EventArgs e) { userid = PublicFun.GetSessionValue(HttpContext.Current ...

  5. iOS更改ShareSDK默认的分享功能界面

    ShareSDK的集成这里就不详细介绍了, 官网的都已经够详细了.. 官方的默认分享样式如下: 贴上我的源代码: // 创建分享图片 NSString *imageURLString = @" ...

  6. Sql 日期时间 转换

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  7. ubuntu11.10(TQ210)下移植boa服务器

    平台:ubuntu11.10 一.下载源码包www.boa.org   boa-0.94.13.tar.gz 二.解压,在其src目录下生产makefile #tar xvfz  boa-0.94.1 ...

  8. IE9的BUG?jQuery的BUG?

    本文转载自http://big-student.iteye.com/blog/1898213 在IE9和IE10中,当对一个html的样式初始了一个很大的left或者top时,使用jQuery的off ...

  9. linux thread 互斥锁

    #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *threadhandle(voi ...

  10. PHP5中使用PDO连接数据库

    PDO  如何连接 new PDO("mysql:host=localhost;dbname=php100","root", “ "); 默认这个不是 ...