我收到了一份来自学院的任务,在那里我必须通过UDP aka实现一个可靠的调动。TCP Over UDP (我知道,因为这已经在TCP上实现了)来深入了解TCP是如何工作的。其中一些要求是:3路握手、拥塞控制(特别是TCP Tahoe )和挥手.我想用Java或Python来做这件事。
一些更具体的要求是:
在收到每个ACK之后:
CWND < SS-THRESH: CWND += 512If CWND >= SS-THRESH: CWND += (512 * 512) / CWNDSS-THRESH -> CWND / 2、CWND -> 512,并在上次确认的字节之后重新传输数据。我找不到更多关于Tahoe实现的具体信息。但据我所知,TCP Tahoe基于回溯-N,因此我为发送方和接收方找到了以下伪算法:


我的问题是应该在if sendbase == nextseqnum之后立即启动和避免拥塞的缓慢阶段吗?也就是说,在确认收到预期的ACK之后?
我的另一个问题是关于窗口的大小,回溯-N使用固定窗口,而TCP Tahoe使用动态窗口。如何基于cwnd计算窗口大小?
发布于 2022-01-20 07:38:35
注:您的图片不可读,请提供更高分辨率的图片。
我的问题是,如果sendbase == nextseqnum,那么应该马上开始和避免拥塞的阶段吗?也就是说,在确认收到预期的ACK之后?
您的算法只在接收到最后一个数据包的ACK时才做一些事情。正如我所说,这是不正确的。
不管怎样。每一个确认新数据包的ACK都应该增加触发窗口。您可以通过检查send_base是否作为ACK的结果来检查这一点。
不知道如果每个Tahoe实现都这样做,但您可能也需要这一点。在三个相应的重复ACK(即不增加send_base的ACK)之后,您将触发拥塞响应。
我的另一个问题是关于窗口的大小,回溯-N使用固定窗口,而TCP Tahoe使用动态窗口。如何基于cwnd计算窗口大小?
您可以使N变量而不是常量,并将拥塞窗口分配给它。
在真正的具有流控制的TCP中,您可以执行N = min (cwnd, receiver_window)。
https://stackoverflow.com/questions/70778451
复制相似问题