sockets - 节省带宽 GPRS 和 TCP

标签 sockets tcp

您好,出于实验原因,我为我的旧 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

所以我在您的数据使用估计范围内。

如果您希望减少带宽使用,这里有三个想法:

  1. 缩减更新频率。

  2. 不要每次都断开套接字连接。保持打开状态即可。

  3. 鉴于您的 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/

相关文章:

C - 当我将函数 fwrite() 放入循环时写入文件失败

c# - 使用 tcp 套接字异步发送/接收固定数量的数据

tcp - 在哪里可以找到 WireShark 的 IP 分段示例 pcaps?

go - 服务器上的 TCP 转储与客户端不匹配

php - PHP将整数转换为32位(4字节)十六进制以进行套接字编程

c - TCP 客户端/服务器 : when stop read socket

c# - 使用套接字发送回复广播

java - 为什么这个 Java 套接字程序的 TCPview 同时显示 TCP 和 UDP?

c - struct tcphdr 和 struct tcp 的区别

node.js - 没有多个Redis的多个服务器上的socket.io