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

标签 c linux tcp setsockopt tcpdump

我正在运行一个运行 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/

相关文章:

复杂度帮助..O(n^2), 0(nlog) 等

c++ - 如何帮助编译器根据输入的约束优化我的程序?

http - 托管在不同 Web 服务器上的 HTTP 请求对象的 TCP 连接

c - 包含 scanf 和 file 的结构

c - 将下一行的参数传递给 C 程序

Linux Shell 脚本非法数字

c++ - 使用 fork/execvp 和系统调用的区别

linux - KSH 循环遍历 num_machines 在下面的脚本中

c# - TCP 读取器丢失一些数据

C# 停止 TCP 文件传输