如果客户端套接字发送:
- 数据包 A - 丢弃
- 数据包 B
- 数据包 C
服务器套接字是否会接收 B 和 C 并将其排队,然后当接收到 A 时,B 和 C 将立即传递给服务器应用程序?或者B和C也会被怨恨?或者在 A 交付之前根本不会发送任何数据包?
TCP 是一种复杂的协议,它会根据当前的网络状态更改许多参数,有关该主题的书籍有很多。回答您的问题的最清楚的方法是说 TCP 通常保持给定的发送“窗口”大小(以字节为单位)。这是在成功返回之前发送的确认之前将发送的数据量。
在旧的 TCP 规范中,在该窗口内丢弃的数据包将导致从丢弃的数据包开始重新发送完整的数据。为了解决这个显然有点浪费的问题,TCP 现在采用了选择性确认 (SACK) 选项 ( RFC 2018 )。这将导致仅重新发送丢失/损坏的数据包。
回到您的示例,假设窗口大小足以包含所有三个数据包,并且假设您正在利用最新的 TCP 标准(不明白为什么不这样做),如果数据包 A 被丢弃,只有数据包 A 会怨恨。如果所有数据包都单独大于窗口,则必须按顺序发送和确认数据包。
这取决于延迟。一般来说,第一个 A 是重新发送的。如果客户端得到它并且已经有了 B 和 C,它也可以确认它们。
如果这种情况发生得足够快,B 和 C 就不会被怨恨,或者可能只有 B。