通过TCP / UDP发送一个很大的小数据包?

时间:2013-08-16 09:11:34

标签: python sockets tcp udp package

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

  1. 将坐标连接成一个大字符串并将它们一起发送,或
  2. 逐一发送
  3. 我不知道哪一个更快。我也有其他一些问题:

    1. 我应该使用哪一个?
    2. TCP的数据包的最大大小是多少? (python:string的最大大小client.send(string)
    3. 因为它是一个可视化项目,我应该使用UDP而不是TCP吗?
    4. 你能告诉我一些关于丢包的信息吗?它们什么时候发生?如何处理它们?
    5. 很抱歉有很多问题,但我真的很难解决这个问题......

2 个答案:

答案 0 :(得分:0)

发送字符串时,可能会在多个TCP数据包中发送。如果您发送多个字符串,它们可能都会在一个TCP数据包中发送。您没有接触到数据包,TCP套接字只是一个恒定的数据流。不要指望对recv()的每次通话都与send()的一次通话配对,因为事实并非如此。您可以发送"abcd""efg",也可以从"a"开始阅读"bcde""fg"recv()

最好在收到数据后立即发送数据,以便网络堆栈尽可能快地提供有关您发送内容的信息。它将确切地决定做什么。您可以根据需要发送大字符串,如果需要,它将被分解为通过电线发送。全部自动。

由于在TCP中你不处理数据包,丢包等事情也不是你的问题。这些都是自动处理的 - 数据最终会通过,或者连接关闭。

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

答案 1 :(得分:0)

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

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