繁体   English   中英

如何通过 tcp 套接字传输大数据

[英]how can I transfer large data over tcp socket

如何在不拆分的情况下传输大数据。 我正在使用 tcp 套接字。 它的游戏。 我不能使用 udp,数组中可能有 1200 个值。 我正在以 json 格式发送数组。 但是服务器接收它就像分裂一样。

还有什么选项可以像tcp一样发送http请求? 我需要按顺序回复。 它也应该更快。

谢谢,

你不能。

  • HTTP 可能会将其分块
  • TCP 将它分段
  • IP 会将其打包
  • 路由器会将它分段...
  • TCP 将在另一端重新组装它。

这里没有问题需要解决。

您对拆分数据包/数据报没有太多控制权。 网络决定了这一点。

在 IP 的情况下,您有 DF(不分段)标志,但我怀疑它在这里会有多大帮助。 如果您通过以太网进行通信,那么 1200 个元素的阵列可能不适合以太网帧(有效负载大小高达 1500 个八位字节的 MTU)。

为什么您的应用程序依赖于整个数据必须在单个单元中而不是在单个连接(可能由多个单元组成)中到达这一事实?

考虑问题可能出在其他地方或您可能发送过多不必要数据的想法。 在 PHP 示例中,有isset()函数。 如果您正在创建基于互联网的回合制游戏,则不需要(每次都需要来回发送所有 1,200 个变量。只需发送更改的内容,当其他玩家收到该数据时,仅更改设置的变量。

如何在不拆分的情况下传输大数据。

我将上述解释大致等同于“如何使用尽可能少的 TCP 数据包通过 TCP 连接传输我的数据”。 正如其他人所指出的,无法保证您的数据将被放入单个 TCP 数据包中——但您可以做一些事情来使其更有可能。 以下是我会做的一些事情:

  1. 保持单个 TCP 连接打开。 (HTTP 传统上为每个请求打开一个单独的 TCP 连接,但对于低延迟,您不能这样做。相反,您需要打开一个 TCP 连接,保持打开状态,并继续在其上发送/接收数据作为必要时)。
  2. 减少需要发送的数据量。 (即,您发送的内容是否是接收程序已经知道的?如果是,请不要发送它们)
  3. 减少需要发送的字节数。 (最简单的方法是在发送之前对您的消息数据进行zlib压缩,并让接收程序在收到消息后解压缩消息。这可以使您的大小减少 50-90%,具体取决于您的数据内容)
  4. 关闭 TCP 套接字上的Nagle 算法 这会将延迟减少 200 毫秒,并阻止 TCP 堆栈使用您的数据玩不必要的游戏。
  5. 使用单个 send() 调用发送每个数据包(如果这意味着在调用 send() 之前手动将所有数据项复制到单独的内存缓冲区中,那么就这样吧)。

请注意,即使在您完成上述所有操作之后,TCP 层有时仍会将您的消息传播到多个数据包等中——这就是 TCP 的工作方式。 即使您的本地 TCP 堆栈从未这样做,接收计算机的 TCP 堆栈有时仍会将来自连续 TCP 数据包的数据合并到其接收缓冲区中。 所以接收程序有时总是会“像拆分一样接收”,因为 TCP 是基于流的协议,不维护消息边界。 (如果你想要消息边界,你必须自己做帧——最简单的方法通常是在每条消息之前发送一个固定大小(例如 1、2 或 4 字节)的整数字节计数字段,所以接收方知道在解析完整消息之前需要读入多少字节)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM