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

时间:2016-05-18 06:44:29

标签: sockets http tcp data-transfer large-data

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

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

谢谢,

4 个答案:

答案 0 :(得分:1)

您无法控制拆分数据包/数据报。网络决定这一点。

在IP的情况下,你有DF(不碎片)标志,但我怀疑它在这里会有多大帮助。如果您通过以太网进行通信,则1200元素阵列可能无法插入以太网帧(有效负载大小最大为1500个八位字节的MTU)。

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

答案 1 :(得分:1)

你不能。

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

这里没有问题需要解决。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

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

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

  1. 保持单个TCP连接处于打开状态。 (HTTP传统上为每个请求打开一个单独的TCP连接,但是对于低延迟,您无法承担这一点。相反,您需要打开一个TCP连接,保持打开状态,并继续在其上发送/接收数据。只要有必要)。
  2. 减少需要发送的数据量。 (即接收程序已经知道你发送的东西吗?如果有的话,不要发送它们)
  3. 减少需要发送的字节数。 (最简单的方法是zlib - 在发送之前压缩你的消息数据,并让接收程序在收到消息后对其进行解压缩。这样可以减少50-90%的大小,取决于您的数据内容)
  4. 关闭TCP套接字上的Nagle's algorithm。这将减少200mS的延迟,并阻止TCP堆栈使用您的数据玩不必要的游戏。
  5. 使用单个send()调用发送每个数据包(如果这意味着在调用send()之前手动将所有数据项复制到单独的内存缓冲区中,那么就这样吧。)
  6. 请注意,即使在完成上述所有操作之后,TCP层仍然有时会将您的消息传播到多个数据包等 - 这就是TCP的工作方式。即使您的本地TCP堆栈从未这样做,接收计算机的TCP堆栈仍然有时会将连续TCP数据包中的数据合并到其接收缓冲区内。因此,接收程序有时总是“像分裂一样接收它”,因为TCP是基于流的协议,并且不保持消息边界。 (如果你想要消息边界,你必须自己做框架 - 最简单的方法通常是在每条消息之前发送一个固定大小(例如1,2或4字节)的整数字节计数字段,所以接收器知道在解析完整消息之前需要读入多少字节