sockets - TCP如何实现/保证数据的有序传输?

标签 sockets tcp inorder

我想知道 TCP 究竟是如何实现按顺序交付的。

假设这是事件列表

  1. 数据包 1 已发送,确认已收到。
  2. 数据包 2 已发送,确认未收到。
  3. 数据包 3 已发送。
  4. 数据包 4 已发送。
  5. 收到 ack4。
  6. 收到 ack3。
  7. 收到ack2。

你能给我描述一下到底发生了什么吗?

最佳答案

简短的回答是每个数据包都包含偏移量信息(伪装成序列号),指定其有效载荷在流中的位置。

假设发生了以下情况:收到数据包 1,未收到数据包 2,收到数据包 3 和 4。此时接收 TCP 堆栈知道将数据包 3 和 4 的内容复制到缓冲区的什么位置,并且它知道它仍然没有收到先前的数据,因此它会让数据包 1 的数据可供读取,但它不会在收到数据包 2 之前,数据包 3 或 4 数据可用。

传输 TCP 堆栈通常不会在发送下一个数据包之前等待对任何单个数据包的确认,但如果它没有收到对给定数据包的确认(并且 ACK 可以并且被捆绑在一个数据包中以提高效率) ,它将重新传输它直到收到 ACK。

事件的确切顺序取决于网络条件、TCP 堆栈实现、选择的 TCP 策略、套接字选项和其他因素。

关于sockets - TCP如何实现/保证数据的有序传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9936496/

相关文章:

java - 服务器套接字绑定(bind)到哪里?

在二叉搜索树中查找小于给定值的所有值的算法

安卓聊天应用开发

c++ - 如何从多个 IP 数据包重建 TCP 流?

C# Socket 监听器未绑定(bind)到端口

c++ - Android 到 Windows 的 tcp 通信延迟

Java 简单 TCP 客户端/服务器测试卡住

java - InOrder 遍历进入无限循环并仅打印第一个节点

java - Java中BinaryTree的inorder方法(数组实现)

python - 被 Python 中的 read_all() 函数困住了吗?