使用 UDP 还是 TCP 进行 Wi-Fi 通信 - 耗电?

Using UDP versus TCP for Wi-Fi comm - battery drain?

我有几个问题,但 SO 的做法是不会一次问多个问题,所以我会把相同的介绍放在一起并按逻辑顺序编号。

我正在编写一个与 .NET Win 服务通信的商业应用程序。目标受众是在 Wi-Fi 覆盖的建筑物中工作的员工。该应用程序用于通知最终需要接收者接受或拒绝的某些事件(因此传输必须是双向的)。

我已经通过 TCP 实现了设备注册,然后切换到 UDP 数据通道。 在架构上,有一个启动应用程序 class(配置一些全局设置所必需的),它依次打开登录 activity,在成功注册后打开主 activity。启动时,Main 会启动一个前台服务 (CommSvc),该服务会启动 UDP 通信线程。

我正在使用 VisualStudio 2017 15.5.4、Xamarin 4.8.0.757、Xamarin.Android SDK - 8.1.3.0 进行开发。
我的测试设备是 2 部手机 LG Nexus 4 (Android 4.3, API 18), BLU Vivo 5 Mini (6.0, 23),
和三星 SM-T377V (6.0.1, 23) 平板电脑,我正在考虑升级到 7.0。


Q1。据我们的内部网络工程师估计,使用 TCP 将导致移动无线电更快地耗尽电池电量(与 UDP 相比)。 真的是这样吗?

TCP 保证字节流的有序传送(前提是设备在范围内)。 UDP 数据包可能会丢失,因此需要某种 ACK-and-retransmit-on-failure 协议。

由于信道的 Wi-Fi 特性,永远无法保证发送的数据包到达目标设备(例如超出范围),因此 ACK 和重传协议无论如何都是必要的,我说得对吗? (有责任方面)

由于 TCP 必须进行更多的发送和接收以确保数据包传送,因此它使用更多的流量和更多的 wifi 时间,因此需要更多的电池。

如果您想要保证交付,您要么使用 TCP,要么在 UDP 之上构建它的模拟,可能效率较低。

如果您想要保证送达,例如您 post 数据很快就会过时,并且不介意丢失一些中间值,那么 UDP 是一个可行的方法。

如果您发送的数据量很大,我想在传输之前压缩它们,并在接收时解压缩,将比在 CPU 中消耗更多的功率。

未及时从接收方获得 ACK 一定是 TCP 流中的错误,可能通过 IOException 发出信号,因此您可以检测到不完整的通信。不过,这 不会 告诉您发送的内容是否已到达目的地。您的服务器应该准备好检查通信故障,并且可能准备好重新接收(和丢弃)它最近已经接收并执行的命令。序列号,TCP 样式,在这个层面上也有帮助。 OTOH 如果设备在重新连接后总是向服务器询问状态,并且服务器提醒最后接受的命令,则不需要。

在上述情况下,如果您的有效负载足够大并且您不想重新实现分片/ooo-接收/恢复逻辑,TCP 仍然有用。对于保证非常小的有效负载(我会说在 1kb 以下),最小的常用 IP 数据包就足够大了,因此您可以在应用程序级别重新实现相当简单的 syn-ack 逻辑。

通常情况下,当连接不稳定(例如 wi-fi 接收效果差)时,具有相当长的值(数十或数百秒)的套接字可以正常工作。不过一定要.SetSoTimeout(something_reasonable);默认为 无限!