我有一个在 Windows XP 上使用 TCP 的应用程序。当我使用 SO_RCVBUF 选项调用 getsockopt 时,它报告 8192 字节。然而,Wireshark 显示该应用程序宣传的接收缓冲区为 64K。这怎么可能?要有64K的接收窗口,难道不需要64K的缓冲区吗?是否有两个不同的缓冲区?
最佳答案
我正在研究这个问题,我认为 SO_RCVBUF
和 TCP 窗口不一定是同一件事。
如果你看http://msdn.microsoft.com/en-us/magazine/cc302334.aspx “Windows NT 和 Windows 2000 套接字体系结构”部分您会看到 Windows 内核套接字驱动程序 Afd.sys 位于传输协议(protocol)之上。它有自己的套接字 SND
/RCV
缓冲区,这些缓冲区是您在套接字选项SO_SNDBUF
、中设置的>SO_RCVBUF
或通过 Afd 注册表项。
然后 TCP 传输协议(protocol)有自己的 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
中?我不清楚。
关于sockets - SO_RCVBUF怎么会比TCP接收窗口小呢? (Windows XP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655057/