TCP 序列号如何在双向 communication/sliding window 中工作?

How TCP sequence numbers work in bidirectional communication/sliding window?

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

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

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

我还读到 TCP 是一种 SWP(滑动 window 协议),我想知道在这种情况下 ACK 是如何形成的。 TCP 基本上以字节数作为 Seq 编号进行响应,我真的无法想象在 window(您可以按任何顺序接收)中会发生什么。实现是否使用两组序列号和两个 windows 用于接收方和发送方?

我们非常欢迎任何规范参考或其他有用的资源。

I would like to know what would happen if both A and B would want to send packets at the same time (from what I understand TCP is a bidirectional protocol so each entity can send whenever it wants). Basically how the sequence numbers would behave. Having crossing data packets.

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

Also I read that TCP is a SWP (Sliding window protocol), I would like to know how ACKs are formed in this case. TCP is responding with number of bytes basically as Seq number, I can't really imagine how that can happen inside a window (where you can receive in any order). Is the implementation using two sets of seq numbers and two windows for both receiver and sender?

是的。双方都有自己的独立滑动windows。每一方的发送 window 根据从另一方收到的 ACKs 提前,确认收到更早的序列号。