1

2台のサーバー間でtcp/ipを介してメッセージを送信しようとしています。30KBのメッセージを送りたいです。でも全体で送りたいです。tcpプロトコルでセグメントに分割したくありません。

2台のWindowsServer2008R2間の通信を使用しています。クライアントとサーバーはc#を使用してコーディングされています。使ってみました

tcpclnt.SendBufferSize = 100000;
tcpclnt.Client.DontFragment = true;

サーバーでも同じです。

また、サーバーのウィンドウサイズを構成(レジストリを編集)してみました。

4

2 に答える 2

6

IPv4TCP、およびイーサネットギガビット イーサネット(特にジャンボ フレーム)についてさらに調査する必要があることを強くお勧めします。

基本的に、あなたの質問に対する簡単な答えは、IP ヘッダーが完全なデータグラムの最大サイズ 64kb を許可しているにもかかわらず、30kb の TCP ペイロードを含む単一の IP データグラムを送信できないということです。

この理由は、基盤となるネットワーク (ほとんどの場合、イーサネットまたはギガビット イーサネット) のフレーム サイズが小さいため、そのフレーム サイズの制限内で物理ネットワークを介してそのデータグラムを送信するには、IP データグラムをフラグメント化する必要があるためです。通信網。

TCP プロトコルは完全で破損していないデータグラムの配信を保証します (自動再構成、破損したデータグラムの自動検出、紛失または破損したデータグラムの自動再送信による)。 TCP スタックはメッセージを断片化し、代わりに再構築します。

于 2012-09-04T15:25:36.923 に答える
3

バッファサイズを変更すると、RAM の使用量が増加するという副作用があります - 推奨されません...

TCPは実際にはパケットではなくストリームを処理するため(UDPはパケットを使用します)、メッセージのフレーミングに答えがあると思います.メッセージのフレーミングを参照してください

コードも参照

後でこの可能な解決策を見つけましたが、ここに含める必要があると考えました:

SetTcpWindowSize

「Setting the TCP Window Size for All Network Adapters」というタイトルの VB の例を下部に向かって検索します。

別の方法として、ここにバッファ ハンドラがあり、メッセージが複数のパケットに含まれている場合でも、メッセージを 1 つの部分で読み取ることができるように見えます。これにより、バッファ管理を介してメッセージを再構成できます。このリンクを参照してください

于 2012-09-04T15:02:18.473 に答える