为了在 TCP 连接期间执行发送方和接收方之间的流量控制,接收方在发送给发送方的每个数据包中都包含其接收缓冲区中可用空间“rwnd”的大小。这有助于帮助发送方正确限制其传输速率。
考虑到 'rwnd=0' 并且发送方有更多数据要发送的情况,发送方主动发送一个虚拟数据包以测试接收方缓冲区中是否有更多空间可用以继续操作。
为什么这里采用了主动等待机制,而不是让接收者只通知发送者其缓冲区不再满?
为了在 TCP 连接期间执行发送方和接收方之间的流量控制,接收方在发送给发送方的每个数据包中都包含其接收缓冲区中可用空间“rwnd”的大小。这有助于帮助发送方正确限制其传输速率。
考虑到 'rwnd=0' 并且发送方有更多数据要发送的情况,发送方主动发送一个虚拟数据包以测试接收方缓冲区中是否有更多空间可用以继续操作。
为什么这里采用了主动等待机制,而不是让接收者只通知发送者其缓冲区不再满?
为什么这里采用了主动等待机制,而不是让接收者只通知发送者其缓冲区不再满?
为了防止死锁。
考虑您的场景,接收者通知发送者。发送方有数据要发送,但接收方仍在处理数据并发送 rwnd=0。
现在接收者完成数据处理,并告诉发送者它(接收者)准备好接收更多数据。它发送一个 rwnd=x(某个正值)的数据包,但由于某些传输或拥塞错误,该数据包丢失了。
发送者正在等待一个非零的 rwnd 值,但它永远不会得到它。所以它永远等待,使系统死锁。
主动轮询接收器可防止发生此事件链。