sockets - GPRS 上具有最小(est)开销的协议
问题描述
我们公司开发了在农业领域收集数据的站点。这些领域可能在不知名的地方,因此电台使用带有 SIM 卡的 GSM/GPRS,可以自动切换到最强的提供商。
每 5 分钟设置一次 Internet 连接以将数据发送到服务器。数据具有包长度、命令、传感器数据和CRC校验的结构。但是这些数据结构是通过 http post 发送到 url 的。
对于 480 字节的数据,使用了大约 2550 字节的数据流量。HTTP 协议有很多开销。因为我们只需要发送 480 字节的数据,所以我们有 80% 的开销通过 http 发送。现在我们有几百个站点,而且这个数字还在增长。因此,数据流量的成本正在迅速增加。
我们想要重新设计数据的传输。数据由站内的微芯片微处理器发送。
我们的目标是尽可能减少开销,同时保证数据传输。所以我研究了TCP和UDP。
TCP 具有故障检测和恢复功能,但开销较高。UDP 的开销较低,但不能保证数据传递时不会失败。
我的第一个想法是构建一个监听 TCP 端口的服务器。站通过 TCP 发送数据。主要是因为有保证的数据交付。
使用 UDP,我们必须自己开发检查和重新发送数据,但我们记录的数据结构已经准备好进行检查。
所以我真的很怀疑该怎么做。我正在尝试回答这些问题:
TCP 和 UDP 发送(和传递)480 字节数据需要多少字节开销?
TCP 和 UDP 是考虑发送 480 字节数据的最佳方式,还是有更智能且开销更低的解决方案?
解决方案
TCP 和 UDP 发送(和传递)480 字节数据需要多少字节开销?
一个(典型的)TCP 报头是 20 字节长,虽然它可以(稍微)更长的选项。如果整个 480 字节在单个 TCP 段中发送,那么在第 2 层开销之前,您最终会得到 480 +20 + 20(IP 标头)= 520 字节。
UDP 有一个 8 字节的标头,因此对于 UDP,您将有 480 + 8 + 20 = 508 字节。
但是,您应该考虑 TCP 是一种流协议。从 TCP 套接字中读取就像从二进制文件中读取一样——您需要自己通过使用某种分隔符或在每条消息中添加消息长度来将该流拆分为单独的消息。
另一方面,UDP 适用于单个消息。从 UDP 套接字读取将一次返回一条消息。
TCP 和 UDP 是考虑发送 480 字节数据的最佳方式,还是有更智能且开销更低的解决方案?
UDP 和 TCP 是 Internet 上最低级别的传输协议。HTTP 和其他高级协议建立在它们之上。如果数据的大小很关键,那么原始 TCP 和 UDP 的开销将与您在不使用 RAW 套接字并将数据直接嵌入 IP 数据包的情况下获得的一样低。
推荐阅读
- php - SQLSTATE [IM004]: [Microsoft] [ODBC Driver Manager] 带有 SQL_HANDLE_ENV 的驱动程序 SQLAllocHandle 失败
- sql - 识别两个表中的相同对
- matlab - 如何使用 Matlab 将系数减少到可能的最低整数 - 平衡化学方程式
- java - 如何在我的服务中尝试重试 AWS lambda?
- c++ - 当我使用文件结束条件时,为什么我的 while 循环不会退出?
- javascript - 浏览器的后退按钮时间过长
- python - 使用变量实时更新标签前景色
- c# - 如何检索在另一个线程上运行的异步方法的 out 参数
- spring - 为什么 Spring 的 DI/IoC 被认为比常规的 OO 更解耦?
- sql - 返回 GROUP BY CASE WHEN IS NULL THEN (...) ELSE (...) 的行,即使记录不存在