TCP窗口的缩放指数
rcv_wscale
(例如,在发
SYN
or
呼叫中心(SYN-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是在sk_rcvbuf的基础上取自tcp_full_space()。
知道你可以通过改变接收缓冲区的大小来影响这个计算。
int buflen = 12345;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buflen, sizeof int) < 0)
perror("setsockopt():");
//...