組み込みボードから PC へのデータ転送を実装しようとしています。このためには、低遅延通信を使用する必要があり、TCP/IP でイーサネットを使用する必要があります。さらに、lwip スタックを使用しています。
まず、データの小さなパケット (10 KB) を送信する必要があり、中間の ACKS を待たずにできるだけ早く送信する必要があるため、nagle アルゴリズムを無効にしました。Wireshark ログは、これが非常にうまく機能していることを示しています (データ全体が約 1 ミリ秒で PC に送信されています)。
その後、PC が最後の ACK を送信するのに約 200 ミリ秒かかります (最後のセグメントが最大サイズではないため)。
問題は、組み込みプロセッサでは、すべてのデータが ACKED であるというメッセージを lwip がアプリケーションに与えるまで、非常に長い時間がかかることです。TCP_INTERVAL を減らすと (5 としましょう)、速度が大幅に向上します。
なぜ lwip はこのように動作するのでしょうか? Periodic-TCP-Tasks (TCP_INTERVAL に従って呼び出される) は、受信したフレームの処理 (実際にはメインの別の呼び出し) とは何の関係もないと思います。
私の問題を何とか理解できるように述べたいと思います。そうでない場合は、フィードバックをいただければ幸いです。質問を改善できます。
ありがとう!
編集:
さらにデバッグした後、データを送信するプロセスが次の関数呼び出しになることがわかりました。
- 私の主な呼び出し tcp_write(...)
- tcp_tmr() は (LwIP_Periodic_Handle() 関数を介して) 複数回呼び出されます。これが 7 回発生します。8 回目の呼び出し中:
- tcp_output() が呼び出されます。この呼び出しの間、最後の tcp_write() 呼び出しの間に追加されたすべてのセグメントは、tcp_output_segment() を呼び出すことによって送信されます。
したがって、TCP_INTERVAL を減らすと、tcp_tmr() 関数がより迅速に呼び出されるため、もちろんデータがより早く送信されることは明らかです。
しかし、私の質問はまだです:これは通常の動作ですか? lwIP が実際にデータを送信する前にこれほど長い時間待機しているのは少し奇妙に思えます。