Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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/6/mongodb/13.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
C++ Windows7中的TCP窗口扩展_C++_Windows_Tcp_Network Programming - Fatal编程技术网

C++ Windows7中的TCP窗口扩展

C++ Windows7中的TCP窗口扩展,c++,windows,tcp,network-programming,C++,Windows,Tcp,Network Programming,我是网络编程的初学者。我阅读了一些在互联网上可以找到的资源,在那里我遇到了TCP窗口扩展。据我所知,在SYN数据包中,当首次建立连接时,协商缩放因子。那么这是否意味着TCP窗口缩放不能由我们为套接字编程编写的代码设置?是操作系统做到了这一点吗?比如说,在windows环境中,这是如何发生的?我们有没有办法手动/动态更改它?没有,我相信这只能在全局级别设置。在HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Services\Tcpip\Paramet

我是网络编程的初学者。我阅读了一些在互联网上可以找到的资源,在那里我遇到了TCP窗口扩展。据我所知,在SYN数据包中,当首次建立连接时,协商缩放因子。那么这是否意味着TCP窗口缩放不能由我们为套接字编程编写的代码设置?是操作系统做到了这一点吗?比如说,在windows环境中,这是如何发生的?我们有没有办法手动/动态更改它?

没有,我相信这只能在全局级别设置。在HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters项下有此项的注册表设置

它叫GlobalMaxCPWindowsSize。请看这里:


如果您的实际意思是更改套接字接收和传输缓冲区的大小,那么可以使用Winsock更改这些缓冲区。请参见SO_RCVBUF和SO_SNDBUF。

不,我认为这只能在全球层面上设置。在HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters项下有此项的注册表设置

它叫GlobalMaxCPWindowsSize。请看这里:


如果您的实际意思是更改套接字接收和传输缓冲区的大小,那么可以使用Winsock更改这些缓冲区。请参见SO_RCVBUF和SO_SNDBUF。

TCP包的窗口大小由操作系统管理。到目前为止,您还不能动态地更改它。有关更改整个系统窗口大小的静态方法,请参阅答案


只有一个非常困难的方法:你可以在那里WinCap,你可以写出你想要的每个TCP包。但是这真的很痛苦。

TCP包的窗口大小是由操作系统管理的。到目前为止,您还不能动态地更改它。有关更改整个系统窗口大小的静态方法,请参阅答案


只有一个非常困难的方法:你可以在那里WinCap,你可以写出你想要的每个TCP包。但这是一个真正的难题。

如果通过setsockopt将套接字接收缓冲区大小设置为大于64k,则窗口缩放将自动启用


由于窗口缩放协商发生在连接握手期间,因此必须在连接套接字之前进行协商。在服务器通过侦听套接字接受套接字的情况下,这显然是不可能的,因此您必须在侦听套接字上执行设置套接字接收缓冲区大小的看似奇怪的操作,所有从中接受的套接字都从中继承。如果通过setsockopt将套接字接收缓冲区大小设置为大于64k,则会自动启用窗口缩放


由于窗口缩放协商发生在连接握手期间,因此必须在连接套接字之前进行协商。在服务器通过侦听套接字接受套接字的情况下,这显然是不可能的,因此您必须在侦听套接字上执行设置套接字接收缓冲区大小的看似奇怪的操作,从它被接受的所有套接字继承的位置。

为什么要更改窗口大小?如果可以将窗口大小设置为零,这是检查另一侧是否可用的一个很好的技巧。@Nick:这只是为了学习,我只是理解TCP通信的概念。@rekire:你能解释一下你的评论是什么意思吗?我对这东西还很陌生。谢谢。窗户的大小是交通控制的一种机制。如果一侧将窗口大小设置为零,则通信将停止。在带有推送通知的senario中,您可以发送一个零字节的消息,并将收到一个tcp通知,表明已收到该包。这是一个很好的技巧,可以检查客户端是否在线而没有数据流量。若要恢复通信,将窗口大小设置为零的一方必须将其设置回更大的值。为什么要更改窗口大小?如果可以将窗口大小设置为零,这是一个理论上很好的技巧,可以检查另一方是否可用。@Nick:这只是为了学习,我只是理解TCP通信的概念。@rekire:你能解释一下你的评论是什么意思吗?我对这东西还很陌生。谢谢。窗户的大小是交通控制的一种机制。如果一侧将窗口大小设置为零,则通信将停止。在带有推送通知的senario中,您可以发送一个零字节的消息,并将收到一个tcp通知,表明已收到该包。这是一个很好的技巧,可以检查客户端是否在线而没有数据流量。要恢复通信,将窗口大小设置为零的一方必须将其设置回更大的值。您的回答很好,但没有解释如何更改连接/包的TCP窗口大小。@rekire。我认为这不可能仅在全球范围内使用标准Winsock。正如您在回答中提到的,您可以使用WinCap。我同意您的看法,这几乎是不可能的。@Izza这样做吗

我没有回答你的问题,这是错误的。套接字接收缓冲区大小决定最大窗口大小。上面的注册表项仅提供全局最大值。关于如何启用窗口缩放,请参阅我的答案。@rekire他没有问如何更改TCP窗口大小。他问了关于扩展的问题。你的回答很好,但没有解释如何更改连接/包的TCP窗口大小。@rekire。我认为这不可能仅在全球范围内使用标准Winsock。正如您在回答中提到的,您可以使用WinCap。我同意您的看法,这几乎是不可能的。@Izza这不能回答您的问题,这是错误的。套接字接收缓冲区大小决定最大窗口大小。上面的注册表项仅提供全局最大值。关于如何启用窗口缩放,请参阅我的答案。@rekire他没有问如何更改TCP窗口大小。他问了关于缩放的问题,但没有回答这个问题。他问的是如何启用窗口缩放,而不是如何改变窗口大小,尽管你也错了。最大窗口大小由每个套接字的套接字接收缓冲区大小决定,而不是由系统范围决定。如果不设置,当然会有一个系统范围的默认值。这并不能回答问题。他问的是如何启用窗口缩放,而不是如何改变窗口大小,尽管你也错了。最大窗口大小由每个套接字的套接字接收缓冲区大小决定,而不是由系统范围决定。如果不设置,当然会有一个系统范围的默认值。很有趣!你能提供链接吗?@EJP:有什么具体的证明/文档吗?它直接来自RFCs 793和1323,以及Berkeley Sockets的手册页,但也可以参见Javadoc for.interest!你能提供链接吗?@EJP:有什么具体的证据/文档吗?它直接来自RFC793和1323,以及Berkeley Sockets的手册页,但也可以参见Javadoc的示例。