tcp - TCP序列号如何在双向通信/滑动窗口中工作?
问题描述
我试图了解 TCP 的工作原理(当然不是详细的)。我在网上浏览易于理解的流程图时出现了一个问题,但找不到直接的答案。
让我们假设我们有一个很好的流程,其中所有内容都是同步的(忽略带有 FIN 和交叉数据包的结尾部分):
我想知道如果 A 和 B 都想同时发送数据包会发生什么(据我所知,TCP 是一个双向协议,因此每个实体都可以随时发送)。基本上序列号的行为方式。有交叉数据包。
我还读到 TCP 是一个 SWP(滑动窗口协议),我想知道在这种情况下 ACK 是如何形成的。TCP 响应的字节数基本上是 Seq 数,我真的无法想象在窗口内会发生这种情况(您可以按任何顺序接收)。是否为接收方和发送方使用两组序列号和两个窗口?
任何规范参考或其他有用的资源都非常受欢迎。
解决方案
我想知道如果 A 和 B 都想同时发送数据包会发生什么(据我所知,TCP 是一个双向协议,因此每个实体都可以随时发送)。基本上序列号的行为方式。有交叉数据包。
TCP 连接中的每一端都有自己的序列号。当 A 侧向 B 侧发送字节时,它会增加其Sequence Number
字段,而 B 侧会增加其Acknowledgement
字段以指示收到了哪些字节。当 B 侧向 A 侧发送数据时,情况正好相反 - B'sSequence Number
递增,而 A's Acknowledgement
。两者都可以同时发生。
我还读到 TCP 是一个 SWP(滑动窗口协议),我想知道在这种情况下 ACK 是如何形成的。TCP 响应的字节数基本上是 Seq 数,我真的无法想象在窗口内会发生这种情况(您可以按任何顺序接收)。是否为接收方和发送方使用两组序列号和两个窗口?
是的。两边都有自己独立的推拉窗。每一方的发送窗口根据从另一方收到的 ACK 提前,确认收到较早的序列号。
推荐阅读
- anypoint-studio - 如何在 Mulesoft 的 dataweave 中显示要更新的特定字段
- r - 过滤掉值递减的部分(带有额外条件)
- node.js - firebase nodejs中的ghostscript4js:/usr/lib/x86_64-linux-gnu/libgs.so:没有这样的文件或目录
- node.js - 加入 mongo 中的查询以包括主要集合的所有字段和其他集合的选定字段
- netlogo - 生成随机大小和位置的河流
- python - VSC - conda 在 GitBash 中运行良好,而不是在集成的 VSC bash 中
- windows - 如何将 .txt 中的某些内容排除在 For 中?
- python - 删除多列数据框
- rust - 如何概括传递给具有不同类型键的函数的 HashMap?
- android - Firebase RecyclerView 数据检索错误