Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置为SO_RCVBUF会降低窗口比例因子 我有一个用C++编写的Android应用程序,它为我的HTTP服务器打开了一个TCP套接字( Python - m SimpleHTTPServer < /Cord>),并发送了一个头。在没有进一步配置的情况下,这是设备发送的SYN: Transmission Control Protocol, Src Port: 47262 (47262), Dst Port: 8000 (8000), Seq: 0, Len: 0 Source Port: 47262 Destination Port: 8000 [Stream index: 47] [TCP Segment Len: 0] Sequence number: 0 (relative sequence number) Acknowledgment number: 0 Header Length: 40 bytes Flags: 0x002 (SYN) Window size value: 65535 [Calculated window size: 65535] Checksum: 0x54cb [validation disabled] Urgent pointer: 0 Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale Maximum segment size: 1460 bytes TCP SACK Permitted Option: True Timestamps: TSval 3637366, TSecr 0 No-Operation (NOP) Window scale: 7 (multiply by 128)_C++_Sockets_Networking_Tcp - Fatal编程技术网

设置为SO_RCVBUF会降低窗口比例因子 我有一个用C++编写的Android应用程序,它为我的HTTP服务器打开了一个TCP套接字( Python - m SimpleHTTPServer < /Cord>),并发送了一个头。在没有进一步配置的情况下,这是设备发送的SYN: Transmission Control Protocol, Src Port: 47262 (47262), Dst Port: 8000 (8000), Seq: 0, Len: 0 Source Port: 47262 Destination Port: 8000 [Stream index: 47] [TCP Segment Len: 0] Sequence number: 0 (relative sequence number) Acknowledgment number: 0 Header Length: 40 bytes Flags: 0x002 (SYN) Window size value: 65535 [Calculated window size: 65535] Checksum: 0x54cb [validation disabled] Urgent pointer: 0 Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale Maximum segment size: 1460 bytes TCP SACK Permitted Option: True Timestamps: TSval 3637366, TSecr 0 No-Operation (NOP) Window scale: 7 (multiply by 128)

设置为SO_RCVBUF会降低窗口比例因子 我有一个用C++编写的Android应用程序,它为我的HTTP服务器打开了一个TCP套接字( Python - m SimpleHTTPServer < /Cord>),并发送了一个头。在没有进一步配置的情况下,这是设备发送的SYN: Transmission Control Protocol, Src Port: 47262 (47262), Dst Port: 8000 (8000), Seq: 0, Len: 0 Source Port: 47262 Destination Port: 8000 [Stream index: 47] [TCP Segment Len: 0] Sequence number: 0 (relative sequence number) Acknowledgment number: 0 Header Length: 40 bytes Flags: 0x002 (SYN) Window size value: 65535 [Calculated window size: 65535] Checksum: 0x54cb [validation disabled] Urgent pointer: 0 Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale Maximum segment size: 1460 bytes TCP SACK Permitted Option: True Timestamps: TSval 3637366, TSecr 0 No-Operation (NOP) Window scale: 7 (multiply by 128),c++,sockets,networking,tcp,C++,Sockets,Networking,Tcp,窗口大小为65535,窗口比例因子为7,因此客户端暗示其接收缓冲区为65535*2^7=8388480 现在,我在代码中添加以下行: unsigned long receive_buffer_size = 65535*127; res = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &receive_buffer_size, sizeof(receive_buffer_size)); 这些线出现在使用socket()打开套接字之后,但在使用con

窗口大小为65535,窗口比例因子为7,因此客户端暗示其接收缓冲区为65535*2^7=8388480

现在,我在代码中添加以下行:

unsigned long receive_buffer_size = 65535*127;
res = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &receive_buffer_size, sizeof(receive_buffer_size));
这些线出现在使用
socket()
打开套接字之后,但在使用
connect()
将其连接到端口之前

我认为这不会影响接收缓冲区,因为我们提供的值与默认设置的值相同。然而,结果如下:

Transmission Control Protocol, Src Port: 47263 (47263), Dst Port: 8000 (8000), Seq: 0, Len: 0
    Source Port: 47263
    Destination Port: 8000
    [Stream index: 2]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 0
    Header Length: 40 bytes
    Flags: 0x002 (SYN)
    Window size value: 65535
    [Calculated window size: 65535]
    Checksum: 0xcf44 [validation disabled]
    Urgent pointer: 0
    Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale
        Maximum segment size: 1460 bytes
        TCP SACK Permitted Option: True
        Timestamps: TSval 3698768, TSecr 0
        No-Operation (NOP)
        Window scale: 5 (multiply by 32)
接收缓冲区已减少到65535*2^5=2097120。这怎么解释

在设置参数之前和之后,我使用以下行编写SO_RCVBUF:

res = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &curr_value, &optlen);
在设置参数之前,SO_RCVBUF是1048576-与我们在第一个snif中看到的默认值相差甚远。之后,它是2097152,这不是我使用
setsockopt()
提供的。最后一个数字的数量级与我们在第二个snif中看到的数量级相同,因此至少有一些一致性

注意,对于每个调用,
res
都是正数,因此
getsockopt()
setsockopt()
总是成功的


我可以理解操作系统对设置sorcvbuf保持了一个限制,但为什么它低于默认值?为什么在设置任何值之前读取SO_RCVBUF会导致值低于默认值?

SYN段的实际窗口大小不受缩放限制。例如,在你的例子中,它正好等于65535,而不是你计算的8388480。这是因为客户端还不知道接收方是否支持窗口缩放。窗口缩放字段的作用类似于通知发送端支持窗口缩放,并且后续段的窗口大小必须按
窗口大小计算。用于设置默认值的值通常不是默认值。有些平台的值是您提供的值的两倍。其他人以各种方式向上或向下调整。我建议您在设置缓冲区大小后再获取它,以查看系统真正为您提供了什么。@EJP在我设置它之后,缓冲区大小为2097152,大约是我们在SNIF中看到的值。因此,我们是否可以假设,与我们在程序中获得的值相比,该平台在TCP级别上的值不会翻一番?
/proc/sys/net/core/rmem_max
/proc/sys/net/core/rmem_default
的值分别是1048576和229376。我不知道如何从中得出任何结论:
rmem_max
正是我在更改参数之前从
getsockopt()
中得到的数字,但snif再次表明,当时的最大缓冲区大小更大。此外,在
setsockopt()
之后,它是最大值的两倍。@Aegonis,还有一个问题:调用
connect()
后,
getsockopt()
返回的值是多少?窗口缩放字段就像通知发送端支持窗口缩放:这不是设置的结果吗?我知道在SYN的时刻,窗口大小不是我们正在设置的值。问题在于支持的窗口大小,而不是SYN时的实际窗口大小。