TOIT

问题描述

在尝试运行在 esp32 上的 UDP 服务器时,我发现接收到的数据包的大小限制为 1500 字节:20(IP 标头)+ 8(UDP 标头)+ 1472(数据),(虽然理论上UDP好像可以支持最大64K的包数据)。这意味着,为了传输更大量的数据,客户端必须将其拆分为多个块并一个一个地发送,而在服务器端,这些数据将需要恢复。我认为这种解决方案的开销会相当高。我也知道 TOIT 提供 TCP/IP 连接。自然,在 TCP/IP 的情况下,数据包大小也受到限制。这是 64K(65535 字节)。 TOIT 是否对 TCP/IP 连接有任何额外限制,或者 64K 值也适用于 TOIT?

解决方法

this 问题/答案中所述,这是一个避免数据包碎片的问题。发送超过此大小的包将迫使系统将它们分成多个大小为 MTU 的片段,每个片段单独不可靠。由于嵌入式系统上的内存已经非常有限,发送大型(> MTU)包,所有片段必须在处理之前到达,这对于整个应用程序行为来说可能非常不幸,因为它可能会超时或内存不足.

相反,应用程序应该查看流式管道(甚至可能使用 TCP 来处理不可靠的方面)。

由于 TCP/IP 是一种流媒体协议,因此可以发送任何大小的“包”,因为它们会自动分成大小为 MTU 的片段。请注意,数据是在“随机”大小的包中接收的,尽管字节的顺序是完全保留的。