Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何通过tcp套接字传输大数据_Sockets_Http_Tcp_Data Transfer_Large Data - Fatal编程技术网

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

Sockets 如何通过tcp套接字传输大数据,sockets,http,tcp,data-transfer,large-data,Sockets,Http,Tcp,Data Transfer,Large Data,如何在不拆分的情况下传输大数据。我正在使用tcp套接字。这是一场比赛。我不能使用udp,数组中可能有1200个值。我正在发送json格式的数组。但是接收它的服务器像分裂了一样 还有没有像tcp一样发送http请求的选项?我需要有秩序的回应。而且它应该更快 谢谢,您无法控制数据包/数据报的拆分。网络决定了这一点 在IP的情况下,您有DF(不分段)标志,但我怀疑它在这里会有多大帮助。如果通过以太网进行通信,则1200个元素的阵列可能无法装入以太网帧(有效负载大小高达1500个八位字节的MTU)。 为

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

还有没有像tcp一样发送http请求的选项?我需要有秩序的回应。而且它应该更快


谢谢,

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

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


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

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

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

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

您不能

  • HTTP可能会将其分块
  • TCP将对其进行分段
  • IP将对其进行打包
  • 路由器会把它分割成碎片
  • TCP将在另一端重新组装
这里没有问题要解决。

你不能

  • HTTP可能会将其分块
  • TCP将对其进行分段
  • IP将对其进行打包
  • 路由器会把它分割成碎片
  • TCP将在另一端重新组装

这里没有需要解决的问题。

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

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

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

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

  • 保持一个TCP连接处于打开状态。(HTTP传统上会为每个请求打开一个单独的TCP连接,但对于低延迟,您无法这样做。相反,您需要打开一个TCP连接,保持它处于打开状态,并在必要时继续在其上发送/接收数据)
  • 减少您需要发送的数据量。(例如,您发送的内容是否有接收程序已经知道的?如果是,请不要发送)
  • 减少需要发送的字节数。(最简单的方法是-在发送前压缩消息数据,并让接收程序在接收消息后解压缩消息。这可以使大小减少50-90%,具体取决于数据的内容)
  • 关闭TCP套接字。这将减少200毫秒的延迟,并阻止TCP堆栈使用数据玩不必要的游戏
  • 使用单个Send()调用发送每个数据包(如果这意味着在调用Send()之前手动将所有数据项复制到单独的内存缓冲区中,那么就这样吧)
  • 请注意,即使您完成了上述所有操作,TCP层有时仍会将您的消息传播到多个数据包中,等等——这就是TCP的工作方式。即使您的本地TCP堆栈从未这样做,接收计算机的TCP堆栈有时仍会在其接收bu中将连续TCP数据包中的数据合并在一起因此,接收程序有时总是会“像拆分一样接收”,因为TCP是一种基于流的协议,并且不维护消息边界。(如果您想要消息边界,您必须自己进行帧处理——最简单的方法通常是发送固定大小(例如,1、2或4字节)每个消息前的整数字节计数字段,以便接收方知道需要读入多少字节才能解析完整消息)

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

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

  • 保持一个TCP连接处于打开状态。(HTTP传统上会为每个请求打开一个单独的TCP连接,但对于低延迟,您无法这样做。相反,您需要打开一个TCP连接,保持它处于打开状态,并在必要时继续在其上发送/接收数据)
  • 减少您需要发送的数据量。(例如,您发送的内容是否有接收程序已经知道的?如果是,请不要发送)
  • 减少n