理解TCP中的缓冲区

9
我正在使用Java编写TCP客户端,该客户端应该从某个服务器接收数据。
据我所知,如果客户端无法处理来自服务器的传入数据,则操作系统会开始缓冲数据。但是如果缓冲区已满会发生什么?这种行为是否可配置?
我的意思是,我想限制服务器数据流,直到客户端能够处理数据,以便数据不会丢失。这是可能的吗?

4
当接收窗口已满时,客户端将停止发送ACK数据包,服务器会负责进行重传(但如果超时,则数据将丢失)。 - Elliott Frisch
@ElliottFrisch 所以它由协议处理。好的,明白了。但是你说的超时是什么意思?服务器端的ACK超时吗? - St.Antario
@St.Antario:如果在TCP连接期间一段时间内没有交换任何内容,该连接可能会被关闭。 - Serge Ballesta
1个回答

7
您所描述的是TCP窗口控制。 这里有一个不错的解释链接 摘录如下:
在讨论TCP窗口时,我们通常指的是TCP接收窗口。简单来说,TCP接收窗口是TCP连接两端的缓冲区,暂时存储着传入的数据。该缓冲区中的数据被发送到应用程序,为传入的数据腾出更多空间。如果该缓冲区已满,则数据的接收方将警告发送方,在缓冲区被清空之前,无法接收更多数据。还涉及到一些细节,但这就是基本功能。设备在TCP头信息中广告其TCP窗口的当前大小。
您可以通过关闭窗口来减慢流量,但也可以停止从缓冲区中读取数据,让协议完成其工作。
一些消息产品使用次要缓冲区来最小化被数据淹没的影响。其中大多数产品主要是UDP广播/组播。然而,在某个层面上,如果您的客户端跟不上,您将遇到问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接