10

2.6.9-55.ELsmp、x86_64 を実行している Linux ボックスを実行しています。

C を使用して setsockopt() 関数を使用して TCP 受信ウィンドウを設定しようとしています。次のことを試します。

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>

クライアント プログラムが実際には、クライアント プログラムで設定したものとは異なるウィンドウをネゴシエートしていることがわかります。ただし、Steven のテキスト ("TCP/IP Illustrated, Volume 1") セクション 20.4 をどのように解釈できるかから、私が使用する setsockopt() 呼び出しを使用して、セクション 20.4 の 2 番目のブロック引用で彼が参照しているものに影響を与えると思います (上記を参照)。 )。

どこが間違っているのかを理解したいです。

おそらく、スティーブンスが言っていることの私の解釈は間違っています。その場合、受信バッファサイズの正しい設定方法を教えていただけないでしょうか? 私の混乱の証拠として、http://linux.die.net/man/7/tcp にある Linux TCP ソケットのマニュアル ページを参照してください(SO_RCFBUF のコメントを参照)。

この話で私が見逃しているものは何ですか?受信バッファーのサイズを制御するには (そして tcpdump の出力に表示するにはどうすればよいですか?) ここで、ソケット オプション SO_RCFBUF の設定を暗示していることに注意してください。それが SYN のウィンドウ ネゴシエーションに表示されることを理解しています。

どんな入力でも大歓迎です。

4

3 に答える 3

8

また、使用する必要があります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 はクランプの 2 倍であることに注意してください。ウィンドウクランプは引き続き機能します。これは移植性がありません。

于 2010-02-08T21:32:01.133 に答える
4

受信バッファサイズは、ソケットを接続する前にのみ減らすことができます。いつでも増やすことができます。connect()に対してsockopt()を呼び出す順序は何ですか?

于 2010-02-08T18:23:15.590 に答える
-6

TCPの場合、rwnd値はrecv中に渡されます。

recv(sock、buf、rwnd、0);

これは1024バイトを受信します。

于 2010-02-08T18:28:59.440 に答える