TCP 序列号如何在双向通信/滑动窗口中工作?

问题描述

我试图了解 TCP 是如何工作的(当然不是很详细)。我在网上浏览易于理解的流程图时出现了一个问题,但找不到直接的答案。

假设我们有一个很好的流程,所有内容都是同步的(忽略带有 FIN 和交叉数据包的结尾部分):

enter image description here

我想知道如果 A 和 B 都想同时发送数据包会发生什么(据我所知,TCP 是双向协议,因此每个实体都可以随时发送)。基本上序列号的行为方式。有交叉数据包。

另外我读到 TCP 是一种 SWP(滑动窗口协议),我想知道在这种情况下如何形成 ACK。 TCP 响应的字节数基本上是 Seq 数,我无法想象这会在窗口内发生(您可以以任何顺序接收)。接收方和发送方是否使用两组序列号和两个窗口?

欢迎提供任何规范参考或其他有用的资源。

解决方法

我想知道如果 A 和 B 都想 同时发送数据包(据我所知,TCP 是一个 双向协议,因此每个实体都可以随时发送)。 基本上序列号的行为方式。有交叉数据 数据包。

TCP 连接的每一方都有自己的序列号。当 A 端向 B 端发送字节时,它增加其 Sequence Number 字段,B 端增加其 Acknowledgement 字段以表示接收到哪些字节。当 B 端向 A 端发送数据时,情况正好相反 - B 的 Sequence Number 递增,A 的 Acknowledgement 递增。两者可以同时发生。

另外我读到 TCP 是一种 SWP(滑动窗口协议),我想 了解在这种情况下如何形成 ACK。 TCP 正在响应 字节数基本上是序列号,我真的无法想象如何 这可能发生在窗口内(您可以按任何顺序接收)。 是使用两组seq号和两个窗口的实现吗 接收方和发送方?

是的。两边都有自己独立的推拉窗。每一方的发送窗口根据从另一方收到的 ACK 提前,确认收到较早的序列号。