【问题标题】:TCP Window Scaling in Windows 7Windows 7 中的 TCP 窗口缩放
【发布时间】:2012-09-13 18:58:14
【问题描述】:

我是网络编程的初学者。我阅读了一些可以在 Internet 上找到的资源,在那里我遇到了 TCP Window Scaling。据我了解,缩放因子是在首次建立连接时在 SYN 数据包中协商的。那么这是否意味着我们为套接字编程编写的代码不能设置 TCP 窗口缩放?是操作系统执行此操作吗?说,在windows环境下,这是怎么发生的,有没有办法让我们手动/动态改变它?

【问题讨论】:

  • 为什么要更改窗口大小?
  • 如果您可以将窗口大小设置为零,这是检查另一侧是否可用的理论上的好技巧。
  • @Nick:仅供学习,我只是了解TCP通信的概念。
  • @rekire:你能解释一下你的评论是什么意思吗?我对这些东西很陌生。谢谢。
  • 窗口大小是一种流量控制机制。如果一侧将窗口大小设置为零,则通信将停止。在带有推送通知的场景中,理论上您可以发送一条零字节的消息,并会收到一个 tcp 通知,表明已收到包。这是检查客户端是否在线而没有数据流量的好方法。要恢复通信,将窗口大小设置为零的一方必须将其设置回更大的值。

标签: c++ windows tcp network-programming


【解决方案1】:

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

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

【讨论】:

  • 有趣!可以提供链接吗?
  • @EJP:有什么具体的证明/文件吗?
  • 它直接来自 RFC 793 和 1323,以及 Berkeley Sockets 的 man 页面,但也请参见 ServerSocket.setReceiveBufferSize() 的 Javadoc。
【解决方案2】:

不,我认为这只能在全球范围内设置。在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters 键下有一个注册表设置。

它叫做GlobalMaxTcpWindowSize。见这里:http://technet.microsoft.com/en-us/library/cc957546.aspx

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

【讨论】:

  • 你的回答很好,但没有解释如何更改连接/包的 TCP 窗口大小。
  • @rekire。我认为仅在全球范围内使用标准 Winsock 是不可能的。正如您在回答中提到的那样,您可以使用 WinCap。
  • 我同意你的观点,这几乎是不可能的。
  • @Izza 这没有回答你的问题,而且是错误的。套接字接收缓冲区大小决定了最大窗口大小。上面的注册表项只是提供了全局最大值。有关如何启用窗口缩放,请参阅我的答案。
  • @rekire 他没有问如何更改 TCP 窗口大小。他询问了缩放。
【解决方案3】:

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

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

【讨论】:

  • 不回答问题。他问的是如何启用窗口缩放,而不是如何改变窗口大小,尽管你也错了。最大窗口大小取决于每个套接字的套接字接收缓冲区大小,而不是系统范围。如果你不设置它,当然有一个系统范围的默认值。
猜你喜欢
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多