gpt4 book ai didi

c - 在 C 中设置 TCP 接收窗口并在 Linux 中使用 tcpdump

转载 作者:IT王子 更新时间:2023-10-29 00:07:19 25 4
gpt4 key购买 nike

我正在运行一个运行 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,第 1 卷”)第 20.4 节,我相信你会使用我使用的 setsockopt() 调用(见上文)影响他在第 20.4 节的第二个 block 引用中提到的内容).

我想了解哪里出了问题。

也许我对史蒂文斯所说的解释不正确。在那种情况下,你能告诉我设置接收缓冲区大小的正确方法吗?为了证明我的困惑,我在 http://linux.die.net/man/7/tcp 引用了 Linux 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 是钳位的两倍,它可能更多。你可以让它自动调谐,窗口夹仍然可以工作。这不是可移植的。

关于c - 在 C 中设置 TCP 接收窗口并在 Linux 中使用 tcpdump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com