您好,出于实验原因,我为我的旧 Windows 手机制作了一个程序,每 5 秒发送一次 GPS 数据、温度等,以创建一个车队管理系统。
我注意到在一小时内消耗了 350kb,尽管我只发送了 20kb 的数据...
由于我对网络知识不深,一个tcp连接的字节数是多少?
也许我应该让套接字保持事件状态,因为我每 5 秒关闭并打开它一次。这样会节省字节数吗?
MTU 在这里也很重要吗? 还有其他减少开销的想法吗? 谢谢
最佳答案
让我们在这里做一些数学运算。
每 5 秒是每小时 720 个连接加上数据。 20K/720 是每个连接的大约 28 字节有效载荷(您的 GPS 数据)。
IP and TCP headers along are 48 bytes in addition to whatever data is being sent.
3-way handshake connection: 3 packets (2 out, 1 in) == 96 bytes out and 48 bytes in
Outbound Data-packet: 48+28 bytes == 76 bytes (out)
Inbound Ack: 48 bytes (in)
Close: 48 bytes (out)
Final Ack: 48 bytes (in)
Total out per connection: 220
Total in per connection: 144
Total data send/received per connection: 220+144 = 364
Total data usage in one hour = 364 * 720 = 262K
所以我在您的数据使用估计范围内。
如果您希望减少带宽使用,这里有三个想法:
缩减更新频率。
不要每次都断开套接字连接。保持打开状态即可。
鉴于您的 GPS 坐标会定期更新,您可以考虑使用 UDP 而不是 TCP。存在丢包的可能性,但考虑到您每 5 秒重新传输一次更新的数据,更新丢失不值得重新传输带宽。 IP 和 UDP header 加起来只有 28 个字节,没有“连接”开销。
更新
当我最初发布这篇文章时,我错误地将关闭连接误解为客户端和服务器之间的单个 FIN 数据包交换。实际上,客户端会发送一个 FIN 作为其启动 CLOSE 的一部分。然后服务器确认 FIN。然后服务器发送自己的 FIN 并被客户端确认。换句话说,每个连接额外 96 个字节。重做我们的数学:
Total data send/received per connection =
220+48 + 144+48 = 460
Total data usage in one hour = 460 * 720 = 331K
因此,我修改后的一小时内 331KB 估计值更接近 OP 看到的结果。
关于sockets - 节省带宽 GPRS 和 TCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208878/