sockets - 当 recv 缓冲区已满时,TCP 会暂停发送吗?
问题描述
假设有一个 TCP 非阻塞套接字,它不断地发送数据而不消耗传入的数据,在某个时候,recv 缓冲区将被填满,并且进一步接收到的任何数据包都将被丢弃。但是对等套接字不断消耗数据,因此发送缓冲区中有足够的空间。
这个套接字的行为是什么?当 recv 缓冲区已满时,发送调用是否会暂停并返回 EWOULDBLOCK。还是发送成功?如果是这样,套接字如何处理已发送数据包的确认。
解决方案
一般来说,一个 TCP 连接中的两个“方向”是独立的。所以即使本地(传入)接收缓冲区已满,只要对方的接收缓冲区有空间,就可以发送更多数据。报告给发送方的 TCP“窗口”基本上只是对等方接收缓冲区中的可用空间量。对端将发送回纯 ACK 数据包(没有数据负载)以报告可用缓冲区空间,即使它无法发送任何数据(由于其发送缓冲区/窗口已满)。
推荐阅读
- javascript - WebCryptoAPI 是否在浏览器或远程服务器上运行
- typescript - 如何使用类型脚本在ckeditor中找到插入符号或光标的当前位置?
- powershell - 使用 roboCopy 命令从远程机器访问目录/文件时访问被拒绝错误
- javascript - 将 SCSS 变量导出到 JS(自动循环变量)
- c# - 从其他位置绑定到现有命令会导致数据错误:2
- python - 使用 tkinter 创建椭圆的流体运动
- python - Keras MLP 分类器不学习
- python - 如何在不安装模块的情况下用 Python 写入 Excel?
- powershell - 如何剪切特定的字符串?
- python - Docker-compose 没有构建一个容器