【问题标题】:Setting TCP receive window in C and working with tcpdump in Linux在 C 中设置 TCP 接收窗口并在 Linux 中使用 tcpdump
【发布时间】:2011-01-14 11:51:55
【问题描述】:

我正在运行一个运行 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 的窗口协商中显示的内容。

感谢任何输入。

【问题讨论】:

    标签: c linux tcp setsockopt tcpdump


    【解决方案1】:

    您还需要使用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 是钳位的两倍,可能更多。你可以让它自动调谐,窗口夹仍然可以工作。这不是便携式的。

    【讨论】:

    • 还要注意,最小钳位限制为最小 RCVBUF 的一半(通常为 4096 - 所以最小钳位通常为 2048)。
    • 我检查了这个,数字实际上是 256 和(因此)128 分别是最小可设置的 CLAMP 值。查看 tcp.c::setsockopt() 中的代码在 TCP_WINDOW_CLAMP 下,并查看 sock.h::#define SOCK_MIN_RCVBUF 256。谢谢大家。干杯!
    【解决方案2】:

    只有在连接套接字之前才能减小接收缓冲区大小 - 您可以随时增加它。相对于 connect(),你调用 sockopt() 的顺序是什么?

    【讨论】:

    • 感谢您的快速回复。我在 connect() 之前调用了 setsockopt()。
    【解决方案3】:

    对于 TCP,rwnd 值将在 recv 期间传递。

    recv(sock, buf, rwnd, 0);

    这将接收 1024 个字节。

    【讨论】:

    • 您好,感谢您的回复。据我所知,这个 recv() 调用是针对应用程序的——即,这是应用程序消耗为其指定的字节流的速率。换句话说,我不相信这是 TCP 在开始时与对等方协商的接收窗口。
    • 这是一个应用程序缓冲区大小,而不是接收窗口。接收窗口由套接字接收缓冲区大小减去其中的待处理数据量确定
    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多