我正在开发一个网络支持框架(最初针对 Android),其中包括三个基本服务:主机发现、网络通信和QoS 监控 em>.
对于最后一项服务,我正在尝试实现一种方法,该方法返回单个主机可以定期发送到另一个主机的最大每秒消息数 (MPS)。
根据要发送的对象的大小和网络速度,我可以轻松地粗略估计出可以通过网络发送的理想MPS。当我尝试将信号强度 (SS) 包含在等式中时,问题就出现了。
protected int getMPS(NetworkApplicationData message, Context context) {
int messageSizeBits = MemoryUtils.sizeOf(message) * 8;
int networkSpeedMbps = getNetworkSpeed(context);
float signalStrength = getNetworkSignalStrength(context);
// FIXME: what about signalStrength?
return networkSpeedMbps * 1024 * 1024 / messageSizeBits;
}
所以这里的基本问题是:是否有任何关于信号强度对无线网络速度的影响的预先研究?
进行一些测试后,我注意到根据信号强度,已建立的网络速度会发生变化。例如,使用“标准化”100%SS,Android API 返回 54Mbps 网络速度值;当 SS 为 40% 时,API 返回 7Mbps 网络速度值。我应该只依赖 Android API 返回的网络速度值吗?在这种情况下,我大部分都会得到高估的 MPS。
无论如何,我需要知道解决这个问题的正确方法是什么,并根据正式研究进行计算。
最佳答案
这是 EE 和 CS 领域经过深入研究的主题。 WiFi网络吞吐量主要取决于两个因素:信噪比(SNR)值和网络拥塞。前者是物理层(PHY)问题,而后者是MAC层问题。两层测得的数据速率肯定不同。
在 PHY,数据速率由 SS(或更准确地说,信噪比)决定。根据香农信息论,SS 越高意味着数据速率越高。 PHY 的数据速率假设单个 WiFi 设备连续传输而没有任何争用。但现实世界并非如此。 54Mbps 是具有高 SS 的典型 PHY 数据速率。
在 MAC 上,数据速率是通过 PHY 数据速率乘以 WiFi 设备在 CSMA 协议(protocol)下赢得竞争的时间百分比得出的。即使只有一对 WiFi 设备,MAC 层测量的数据速率(与应用层测量的几乎相同)大约是 PHY 数据速率的一半。
回到你的问题,在畅通的WiFi网络中,将Android API返回的网速除以一半,粗略估计一下真实的数据速率。在繁忙的网络中,您的实际数据速率只能通过在线测量得出,并且它一直在变化。
关于java - 确定信号强度对 WiFi 网络速度的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368820/