1

我正在通过 Internet 通过 TCP 将点坐标发送到可视化客户端脚本。我想知道我应该使用哪个选项:

  1. 将坐标连接成一个大字符串并将它们一起发送,或者
  2. 一个一个地发送

我不知道哪个更快。我还有一些其他问题:

  1. 我应该使用哪一个?
  2. TCP的数据包有最大大小吗?string(python: for 的最大大小client.send(string)
  3. 因为它是一个可视化项目,我应该使用 UDP 而不是 TCP?
  4. 你能告诉我一些关于丢失数据包的事情吗?它们什么时候出现?如何对付他们?

很抱歉有很多问题,但我真的很努力解决这个问题......

4

2 回答 2

0

UDP 的最大理论数据包大小为 65535,实际上这个大小要小得多,并且取决于操作系统和路由硬件。UDP 没有任何机制来确保数据传输,这使得它在没有一些手工制作的数据保护机制的情况下更快但不可靠。

TCP,您不必担心数据包的大小,如果您尝试发送更大的块,那么可能会被操作系统自动透明地分割给您。由于 TCP 通信的开销,发送小块数据可能效率低下,但即使在这里,默认情况下,您在大多数操作系统上都启用了 Nagle 算法(请参阅Nagle 算法)。该算法基本上尝试加入小块数据,对于大多数情况,这是快速有效的。

于 2013-08-16T12:12:48.647 回答
0

当您发送一个字符串时,它可能会在多个 TCP 数据包中发送。如果您发送多个字符串,它们可能都在一个 TCP 数据包中发送。您不会接触到数据包,TCP 套接字只是一个恒定的数据流。不要期望每次调用recv()都与单个调用配对send(),因为这不是真的。您可能会发送"abcd""efg",并且可能会读入"a""bcde""fg"from recv()

最好在获得数据后立即发送数据,以便网络堆栈尽快获得有关您发送的内容的尽可能多的信息。它将确切地决定要做什么。您可以发送任意大的字符串,如有必要,它会被分解以通过电线发送。全部自动。

由于在 TCP 中您不处理数据包,因此丢失数据包之类的事情也不是您关心的问题。这一切都是自动处理的——要么数据最终通过,要么连接关闭。

至于 UDP - 你可能不想要 UDP。:)

于 2013-08-16T11:00:29.793 回答