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 节的第二个块引用中所指的内容(见上文)。

我想了解我哪里出错了。

也许我对史蒂文斯所说的解释是不正确的。在这种情况下,您能否指出设置接收缓冲区大小的正确方法?为了证明我的困惑,我参考了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 是钳位的两倍,可能更多。你可以让它自动调谐,窗口夹仍然可以工作。这不是便携式的。

于 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 回答