gpt4 book ai didi

c - 非零 TCP 窗口比例选项的原因

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:41 24 4
gpt4 key购买 nike

我读了一些关于 TCP window scaling 的东西和 BDP (不太清楚),我无法弄清楚到底是什么原因导致发送方的 TCP 实现设置非零 WS,用户模式客户端程序是否会以某种方式影响它?我认为从逻辑上讲它不能基于某些数据传输,因为它发生在 SYN-SYN+ACK TCP 阶段。

有人可以从编程的角度解释一下,用户模式客户端代码如何影响 TCP 窗口缩放选项(例如,在 connect() 调用之前)? TCP 堆栈如何知道何时将 WS 设置为非零值?

抱歉,如果显而易见。

最佳答案

TCP 窗口缩放索引 rcv_wscale(例如,在发送 SYNSYN-ACK 时)是在 Linux 内核中基于套接字的接收缓冲区计算的在函数中 tcp_select_initial_window() :

/* If no clamp set the clamp to the max possible scaled window */
if (*window_clamp == 0)
(*window_clamp) = (65535 << 14);
space = min(*window_clamp, space);

/* Quantize space offering to a multiple of mss if possible. */
if (space > mss)
space = (space / mss) * mss;
//...
(*rcv_wscale) = 0;
if (wscale_ok) {
/* Set window scaling on max possible window
* See RFC1323 for an explanation of the limit to 14
*/
space = max_t(u32, space, sysctl_tcp_rmem[2]);
space = max_t(u32, space, sysctl_rmem_max);
space = min_t(u32, space, *window_clamp);
while (space > 65535 && (*rcv_wscale) < 14) {
space >>= 1;
(*rcv_wscale)++;
}
}

这里的space取自tcp_full_space()基于sk_rcvbuf

知道您可以通过更改接收缓冲区的大小来影响此计算:

int buflen = 12345;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buflen, sizeof int) < 0)
perror("setsockopt():");
//...

这可以为您提供零缩放(WS=0wscale 0)。

附言请记住,在服务器端,它应该在监听套接字上完成,因为在 TCP 握手之后你不能影响它。

关于c - 非零 TCP 窗口比例选项的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122062/

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