LinuxでTCPソケットの条件付きフラッシュ

LinuxでTCPソケットの条件付きフラッシュ

TCPソケットにデータを書き込むたびに、十分なデータ(64k(最大パケットサイズなど)など)がいっぱいになるのを待ってから、データを回線に送信します。これにより、相手の正確な時刻にデータが欠落します。

TCP_NODELAYを設定すると、ソケットに書き込まれたすべてのデータがすぐに回線に送信されます。 ACKを含む小さなパケットが多いため、帯域幅が減少します。

条件付きでソケットを消去するようにLinuxのルールを設定できますか?前任者:

if time gap between last sent packet and current data is greater than 100ms send immediately no matter how much data lendth is
else if current data length is bigger than 50kb send immediately no matter how much time gap is
else do nothing, wait some milliseconds for next decision

私はTCPバッファサイズを減らしたくないので、Linuxがデータをフラッシュする方法を修正したいと思います。

Linux設定ファイルを変更してこれを実行できますか?それとも、作成されたすべてのソフトウェアにそれを実装する必要がありますか?

直接の回答、ヘルプ、ソリューション、記事のリンクに感謝します。

答え1

それ以外の場合、現在のデータ長が50kbを超える場合は、時間間隔に関係なく即座に送信されます。

とにかくこれが起こります。 Nagleアルゴリズムのトランスポートバッファウィンドウは、デフォルトパケット(MTUなど)より大きくありません。これには利点がなく、すべての実際のアプリケーションでは、これらのバッファウィンドウは9kBより大きくなるわけではありません。だから私はあなたの問題があなたが考えているものと異なると思います。

最後に送信されたデータパケットと現在のデータの間の時間間隔が100msを超えると、データ長に関係なく直ちに送信されます。

明示的に使用しない限り、これは発生し、さらにTCP_CORK遅延時間は200msに制限されます。

もう一度、私はあなたが経験している問題があなたが想像するのと全く異なるという感じを受けました。

それ以外の場合は、何もせずに次の決定を下すまで数ミリ秒待ってください。

問題に対する正しい「決定」を行うには、データフロー要件に関するアプリケーションレベルの知識が必要です。したがって、実際に最も簡単で特にオーバーヘッドの低いソリューションは、それに応じてプロトコルを設計し、アプリケーションの前に小さなAccumulateデータグラムを転送してから更新することです。 (または使用TCP_NODELAY)手動で。また、設定と設定解除を詳しく見て、TCP_CORKLinuxカーネルに保存を実行させることもできます。

これは、TCPを放棄してSCTPを採用する必要があることを意味し、極端な場合は、独自のフロー制御ロジックとしてUDPを採用する必要があることを意味します。これは初期ステートメントで望むように見えます。

これにより、相手の正確な時刻にデータが欠落します。

TCPの誤った仮定を使用してネットワークプロトコルを誤って設計したと思いますか? TCPはRXとTXの間のパケット順序を保証せず、各RXとTXのみを保証します。個別に、データの順序が保証されます。

関連情報