This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3352:NDK 小 TCP 数据包大小

Guru**** 2540720 points
Other Parts Discussed in Thread: AM3352

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/850236/am3352-ndk-small-tcp-packet-size

器件型号:AM3352

您好!

由于兼容性原因、我使用 NDK (v2.26.0.08)在 AM3352上实现 TCP/IP 服务器。
到目前为止、服务器运行良好、但当我发送数据时、TCP/IP 堆栈仅为每个 TCP 数据包传输1个数据字节。

我们通过此 TCP/IP 连接使用更高级别的协议、每个 statemachine 调用只能移动1个字节到发送缓冲区。
因此、我使用 NDK"发送"函数将1个字节移入 TCP/IP 缓冲区。
只要发送了整个"协议包"(在 while 循环中完成、因此实际上一行中有多个"发送"调用)、就会发生这种情况。

我*没有*启用"tcp_NODELAY"机制。
为了确保我还尝试主动禁用"tcp_NODELAY"机制、但没有成功。

int32_t opt = 0;
if (setsockopt (TCPIP->ClientSocket、IPPROTO_TCP、tcp_NODELAY、&opt、 sizeof (opt)= socket_error){
UART_printf ("***禁用 NODELAY 错误\n");
}否则{
UART_printf ("禁用 NODELAY 确定\n");
} 

AFAIK Nagle 算法(=tcp_NODELAY 被禁用)应该防止这种行为、不是吗?

下面是捕获 AM3352响应1数据包的 Wireshark 的屏幕截图:

192.168.1.10 -> PC
192.168.1.20 -> AM3352

NDK 缓冲器配置:

NDK TCP 设置:

谢谢、
Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Markus

    它听起来像是 TCP/IP 服务器设置问题。 您是否在同一处理器 SDK RTOS 中尝试过 NIMU_FtpExample_bbbAM335x_armExampleproject?

    它是否显示了相同的小封装尺寸问题? 如果是、请告知我们 Processor SDK RTOS 版本。 我们将进一步调查。 如果不是, 您可能需要 查看 TCP/IP 服务器设置。 例如最大数据包大小等

    Ming

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ming、您好!

    也许这不是一个设置问题、因为如果我在堆栈和我的应用程序之间实施一个软件缓冲区(例如、512字节)并且一次发送整个缓冲区内容而不是每个字节、我会得到更大的数据包。

    我的设置没有什么特别之处:
    *套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP)
    * BIND (IPv4)
    *监听(最大 conn = 1)
    *通过函数"setsockopt"(3s)设置侦听器套接字的超时
    *接受
    *发送/接收

    使用的工具链:
    * PDK 1.0.15
    * NDK 3.60.0.13
    * SYS BIOS 6.75.2.00
    * XDCtools 3.50.8.24

    我可以尝试 FTP 服务器演示、但此演示会主动启用"tcp_NODELAY"标志。
    AFAIK 会强制数据包大小下降、以交换对每个 FTP 命令的更快响应。
    此演示还不发送1字节、而是每个"发送"调用发送一个整串(=multiple bytes)。

    此致、
    Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Markus、您好!

    您在 https://e2e.ti.com/support/processors/f/791/t/844091#pi320966=2的响应中提到 、修复程序不仅解决了 HTTP 服务器问题、还解决了 TCP/IP 服务器问题。 您是否意味着此问题可以通过相同的更改得到解决? 如果是、请将此主题标记为"已解决"、谢谢!

    Ming

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ming、您好!

    否、此响应仅解决 HTTP 服务器和 TCP/IP 堆栈的"堆栈崩溃"问题。

    我仍然必须在应用程序和堆栈之间使用自定义软件缓冲区(当前我使用512字节缓冲区)、以获得更大的数据包大小。

    因此、我当前的解决方法是:
    *我不是发送每个字节、而是将每个字节传输到缓冲区
    *当缓冲区已满或帧完成时、我立即清空(发送)当前缓冲区内容

    但 IMHO 这不是一个理想的解决方案、因为我还分配了大的 TCP/IP 缓冲区(通过 TI RTOS cfg 文件)、这些缓冲区可能不被使用或不需要。

    此致、
    Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Markus、您好!

    让我重新表述您的问题:

    您在第一 篇文章中说、单字节 TCP/IP 数据包是由高级协议引起的、该协议一次只能移动1字节。 为了解决此问题、您使用了自己的缓冲区来进行 TCP/IP 传输。 本质上、您 使用自己的缓冲区将1字节传输累积到更大的数据包中、然后在您认为帧已完成时将累积的帧传输到 TCP/IP。 这种解决方法工作正常。

    这里的问题是 您不想分配自己的缓冲区或不想分配不必要的 TCP/IP 缓冲区。

    如果我在上面重新表述的是正确的、那么

    首先、我看不到可以摆脱自己缓冲区的方法、因为较高级别协议的限制。

    2.其次、您可以尝试 调整*。cfg 文件中的以下参数

    tcp.transmitBufSize = 16384;
    tcp.receiveBufSize = 65536;
    tcp.receiveBufLimit=65536;

    以减小整体存储器缓冲区大小。

    Ming