TCP 将 3 个可能相关的服务交织在一起(好吧,TCP 做得更多,但我只讨论 3 个。)
- 按订单发货
- 可靠的交付
- 流控制
您刚刚说您不需要流量控制,所以我什至不会解决这个问题(您将如何宣传窗口大小等,除了您可能需要一个窗口。我会得到给它。)
您确实说过您需要可靠的交付。这并不难——你使用 ACK 来表明发送者已经收到了一个数据包。基本的可靠交付如下所示:
- 发送方发送数据包
- Receiver收到数据包,然后发送ack
- 如果发送方没有收到确认(通过计时器),他会重新发送数据包。
这三个步骤不能解决这些问题:
- 如果 ACK 丢失怎么办?
- 如果数据包乱序到达怎么办?
因此,对于您的应用程序,您说您只需要可靠的交付 - 但没有说明需要按顺序执行。这将影响您实现协议的方式。
(顺序无关紧要的示例:您将员工记录从一台计算机复制到另一台计算机。如果 Alice 的记录在 Bob 之前收到,这无关紧要,只要两者都到达那里。)
因此,假设您只需要可靠(因为这就是您在帖子中所说的),您可以通过多种方式实现这一目标。
您的发件人可以跟踪未确认的数据包。所以如果它发送#3、4、5和6,并且没有得到3和4的ACK,那么发送者就知道它需要重传。 (虽然发送方不知道数据包 3 和 4 是否很多,或者它们的 ACK 是否丢失。无论哪种方式,我们都必须重新发送。)
但是您的发送方可以进行累积 ACK - 因此在上面的示例中,如果它收到 3、4 和 5,它只会确认 #6。这意味着接收方将丢弃数据包6 如果之前没有收到过。如果您的网络非常可靠,那么这可能不是一个坏选择。
然而,上述协议确实有一个窗口——即发送方一次发送多少个数据包?这意味着您确实需要某种窗口,但不是出于流量控制的目的。您将如何传输窗口大小?
你可以在没有窗口的情况下做到这一点,方法是让窗口大小保持不变,或者做一些类似停止等待的事情。前者可能是更好的选择。
无论如何,我还没有直接回答你的问题,但我希望我已经指出了一些在构建它时值得考虑的事情。在没有部分流量控制(如窗口)且不考虑有序的情况下进行“可靠传输”的任务非常困难! (让我知道我是否应该提供有关其中一些内容的更多详细信息!)
祝你好运!