【问题标题】:How can the SO_RCVBUF be smaller than the TCP receive window? (Windows XP)SO_RCVBUF 怎么会小于 TCP 接收窗口呢? (Windows XP)
【发布时间】:2014-12-04 22:06:36
【问题描述】:

我有一个在 Windows XP 上使用 TCP 的应用程序。当我使用 SO_RCVBUF 选项调用 getsockopt 时,它报告 8192 字节。但是,Wireshark 显示该应用程序广告了 64K 的接收缓冲区。这怎么可能?要有一个 64K 的接收窗口,是不是需要一个 64K 的缓冲区?有两个不同的缓冲区吗?

【问题讨论】:

    标签: sockets windows-xp tcp winsock


    【解决方案1】:

    我正在研究这个,我认为SO_RCVBUF 和 TCP 窗口不一定是同一件事。

    如果您查看http://msdn.microsoft.com/en-us/magazine/cc302334.aspx 部分“Windows NT 和Windows 2000 套接字体系结构”,您会看到Windows 内核套接字驱动程序Afd.sys 位于传输协议之上。它有自己的 socket SND/RCV 缓冲区,这些缓冲区是您在套接字选项 SO_SNDBUFSO_RCVBUF 或通过 Afd 注册表项中设置的。 然后 TCP 传输协议有自己的 TCP 窗口缓冲区,这是每个人都熟悉的,在注册表 Tcpip 参数中设置或自动确定牢记 SO_RCVBUF 我认为是混乱从何而来。 http://msdn.microsoft.com/en-us/library/ms819736.aspx

    所以我相信数据会根据需要从传输层读取到 afd.sys 套接字缓冲区SO_RCVBUF 中,等待应用程序读取。您可能希望SO_RCVBUF 至少与您希望一次读取的数据一样大。

    但是我不知道SO_RCVBUF 和 TCP 窗口将如何相互作用。 TCP 会等待 ACK 数据,直到它被读入SO_RCVBUF?我不清楚。

    【讨论】:

      【解决方案2】:

      您自己设置窗口大小吗?确保在 connect(2)accept(2) 之前执行此操作。但是windows在这方面可能很特别,请查看msdn

      【讨论】:

      • 不,我自己没有设置窗口或缓冲区。但无论谁设置大小,如果它只有 8K 的内存来保存传入数据,我不明白它如何宣传 64K 接收窗口。
      • winsock 可能只是在骗你。看起来 64K 是 Windows 下速度快于 100Mbps 的默认连接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多