【发布时间】:2014-12-04 22:06:36
【问题描述】:
我有一个在 Windows XP 上使用 TCP 的应用程序。当我使用 SO_RCVBUF 选项调用 getsockopt 时,它报告 8192 字节。但是,Wireshark 显示该应用程序广告了 64K 的接收缓冲区。这怎么可能?要有一个 64K 的接收窗口,是不是需要一个 64K 的缓冲区?有两个不同的缓冲区吗?
【问题讨论】:
标签: sockets windows-xp tcp winsock
我有一个在 Windows XP 上使用 TCP 的应用程序。当我使用 SO_RCVBUF 选项调用 getsockopt 时,它报告 8192 字节。但是,Wireshark 显示该应用程序广告了 64K 的接收缓冲区。这怎么可能?要有一个 64K 的接收窗口,是不是需要一个 64K 的缓冲区?有两个不同的缓冲区吗?
【问题讨论】:
标签: sockets windows-xp tcp winsock
我正在研究这个,我认为SO_RCVBUF 和 TCP 窗口不一定是同一件事。
如果您查看http://msdn.microsoft.com/en-us/magazine/cc302334.aspx 部分“Windows NT 和Windows 2000 套接字体系结构”,您会看到Windows 内核套接字驱动程序Afd.sys 位于传输协议之上。它有自己的 socket SND/RCV 缓冲区,这些缓冲区是您在套接字选项 SO_SNDBUF、SO_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?我不清楚。
【讨论】:
您自己设置窗口大小吗?确保在 connect(2) 或 accept(2) 之前执行此操作。但是windows在这方面可能很特别,请查看msdn。
【讨论】: