TCPはCで受信ウィンドウを設定するとLinuxでのtcpdumpでの作業
-
19-09-2019 - |
質問
私は2.6.9-55.ELsmp、x86_64版を実行しているLinuxマシンを実行しています。
私はTCPを設定しようとしていますが、私は次のことを試してくださいC.を使用してsetsockopt()関数を使用して、ウィンドウを受け取ります
rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));
上記のコードセグメントは、サーバからデータを受信するクライアントプログラムです。私が受け取るとtcpdumpの出力を観察するためのプログラムをキックオフすると、私はそうのようなウィンドウの交渉を観察します:
11:34:40.257755 IP clientReceiver.42464 > serverSender.8991:
S 1742042788:1742042788(0) win 5840
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>
私たちは、クライアントプログラムは、私はクライアントプログラムに設定されているものとは異なるウィンドウを交渉することになっていることを参照してください。しかし、私はスティーブンのテキスト(「TCP / IPイラスト、第1巻」)20.4項を解釈する方法から、私は上記を参照してください(私が使用して呼び出す)(あなたは彼がのsetsockoptを使用して、セクション20.4で第二のブロックの引用にはを参照どのような影響を与えると考えています)。
私は私が間違っているかを理解したいと思います。
おそらく、スティーブンスが言っていることの私の解釈が間違っています。その場合、あなたは、受信バッファのサイズを設定する正しい方法に私を指すことができますか? //linux.die:私の混乱の証として、私はでhttp LinuxのTCPソケットのmanページを参照してください。 .NET /男性/ 7 / TCP の(SO_RCFBUFにコメントを参照してください)。
私はこの物語の中で何をしないのですか?どのように私は、受信バッファのサイズを制御する(そしてそれはtcpdumpの出力に表示されてい)いますか?私はソケットオプションSO_RCFBUFの設定をここにするためにほのめかすことに注意してください - 私はそれがSYNで窓交渉に表示何を理解する
。任意の入力が認識される。
解決
またTCP_WINDOW_CLAMP
を使用する必要があります。
rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));
rcvbufは二回のクランプである、それはより多くの可能性があります。あなたはそれが自動チューニング、ウィンドウクランプはまだ動作しますせることができます。これはポータブルではありません。
他のヒント
受信バッファのサイズはわずかに減少することができます - あなたはいつでもそれを増やすことができます。どのような順序ます)(接続するために相対して)(sockoptを呼び出している?
TCPの場合は、RWND値は、recvの間に渡される。
RECV(靴下、BUF、RWND、0);
これは、1024のバイトを受けなければならない。