Sockets SO_RCVBUF如何小于TCP接收窗口?(Windows XP)
我有一个在Windows XP上使用TCP的应用程序。当我使用SO_RCVBUF选项调用getsockopt时,它报告8192字节。然而,Wireshark显示该应用程序的接收缓冲区为64K。这怎么可能?要有64K接收窗口,它不需要64K缓冲区吗?有两种不同的缓冲区吗?您自己设置窗口大小吗?确保在连接(2)或接受(2)之前执行此操作。但是windows在这方面可能也很特别,请检查。我正在研究这个问题,我不认为Sockets SO_RCVBUF如何小于TCP接收窗口?(Windows XP),sockets,windows-xp,tcp,winsock,Sockets,Windows Xp,Tcp,Winsock,我有一个在Windows XP上使用TCP的应用程序。当我使用SO_RCVBUF选项调用getsockopt时,它报告8192字节。然而,Wireshark显示该应用程序的接收缓冲区为64K。这怎么可能?要有64K接收窗口,它不需要64K缓冲区吗?有两种不同的缓冲区吗?您自己设置窗口大小吗?确保在连接(2)或接受(2)之前执行此操作。但是windows在这方面可能也很特别,请检查。我正在研究这个问题,我不认为所以_RCVBUF和TCP窗口一定是同一件事 如果您查看“Windows NT和Wind
所以_RCVBUF
和TCP窗口一定是同一件事
如果您查看“Windows NT和Windows 2000套接字体系结构”一节,您会看到Windows内核套接字驱动程序Afd.sys位于传输协议之上。它有自己的套接字SND
/RCV
缓冲区,这些缓冲区是您在套接字选项SO_SNDBUF
、SO_RCVBUF
或通过Afd注册表项设置的。
然后,TCP传输协议有自己的TCP窗口缓冲区,这是每个人都熟悉的缓冲区,可以在注册表Tcpip参数中设置,也可以自动确定,同时考虑到其他因素,所以我认为这是产生混淆的原因
因此,我相信数据会根据需要从传输层读取到afd.sys套接字缓冲区So_RCVBUF
,等待应用程序读取。您希望SO_RCVBUF
至少与您希望一次读取的数据一样大
但是,我不知道
sorcvbuf
和TCP窗口将如何相互作用。TCP是否会等待确认数据,直到它被读入中?我不清楚。不,我没有自己设置窗口或缓冲区。但不管是谁设置的大小,我不明白如果它只有8K的内存来保存传入的数据,它怎么能宣传64K接收窗口。可能winsock只是在骗你。在windows下,64K似乎是比100Mbps更快的默认连接。