sockets - SO_RCVBUF怎么会比TCP接收窗口小呢? (Windows XP)

标签 sockets windows-xp tcp winsock

我有一个在 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/

相关文章:

windows - 在 Windows 上运行控制台应用程序时抑制命令窗口

互联网 PC 中的 TCP 监听器,我如何将那台 PC 连接到特定的 Ip? C#

php - 线程对象更改套接字资源 ID

Python操作系统错误: Too many open files

perl - 来自Fileno和服务器实例的唯一数字连接ID

windows-xp - 如何在没有VB的情况下制作模型截图

java - 使用 TCP/IP 套接字的多线程

java - 打开 SSL TCP 套接字并发送 Web 请求

java - 为什么服务器端套接字在读取 "\n.\n"后没有收到消息

javascript - 重新连接后未触发 socket.io 'connect' 或 'reconnect' 事件