我对在应用程序中增加TCP窗口大小有一些疑问。在我的C++软件应用程序中,我们使用TCP/IP阻塞套接字从客户端向服务器发送大约1k大小的数据包。最近我了解到了TCP窗口大小这个概念。因此,我尝试使用setsockopt()
将值增加到64K,同时使用SO_SNDBUF
和SO_RCVBUF
。增加这个值后,我在WAN连接中获得了一些性能改进,但在LAN连接中没有。
根据我的理解,在TCP窗口大小中,
客户端将数据包发送到服务器。当达到此TCP窗口大小时,它将等待确保服务器收到窗口大小中第一个数据包的ACK。在WAN连接的情况下,由于RTT约为100ms的延迟,ACK从服务器到客户端的接收会被延迟。因此,在这种情况下,增加TCP窗口大小可以补偿ACK等待时间,从而提高性能。
我想了解如何改进我的应用程序性能。
在我的应用程序中,尽管使用setsockopt
在套接字级别上增加了TCP窗口大小(发送和接收缓冲区),但我们仍然保持相同大小的数据包(即我们在单个套接字发送的字节数为1k)。同时,我们禁用了Nagle算法(内置选项,将小数据包合并成大数据包,从而避免频繁的套接字调用)。
我的疑问如下:
由于我使用的是阻塞套接字,对于每个大小为1k的数据包发送,如果没有收到来自服务器的ACK,它应该被阻塞。那么,在WAN连接中增加TCP窗口大小后,性能如何提高?如果我误解了TCP窗口大小的概念,请纠正我。
对于发送64K的数据,我认为即使我将TCP窗口大小增加到64K,仍然需要调用64次套接字发送函数(因为我正在通过阻塞套接字每次发送1k)。请确认这一点。
启用RFC 1323算法的窗口缩放后TCP窗口大小的最大限制是多少?
我英语不是很好。如果您无法理解上述内容,请告知我。