我用 Java 编写一个 tcp 客户端,它应该从某个服务器接收数据。
据我所知,如果客户端无法处理来自服务器操作系统的传入数据,则会开始缓冲数据。但如果缓冲区已满怎么办?该行为可以配置吗?
我的意思是我想限制服务器数据流,直到客户端可以处理数据,这样数据就不会丢失。是否可以?
您所描述的称为 TCP 窗口。
这里有一个很好的解释
摘抄:
在讨论 TCP 窗口时,我们最常指的是 TCP 接收窗口。简单地说,TCP 接收窗口是 TCP 连接两端的缓冲区,用于临时保存传入数据。该缓冲区中的数据被发送到应用程序,为传入数据腾出更多空间。如果该缓冲区已满,数据接收方将警告发送方在缓冲区被清除之前无法接收更多数据。还有几个细节涉及到,这是基本功能。设备在 TCP 标头信息中通告其 TCP 窗口的当前大小。
尽管您可以轻松地停止从缓冲区读取并让协议完成其工作,但可以通过关闭窗口来限制流。
一些消息传递产品通过使用辅助缓冲区来管理此问题,以最大限度地减少数据溢出的影响。大多数这些产品主要是 UDP 广播/组播。但在某种程度上,如果您的客户无法跟上,您就会遇到问题。