我是 Stack Overflow 的常客(软件开发人员),正在努力完成网络课程。我有一个家庭作业问题,想对其进行完整性检查。以下是我得到的结果。
问:
一条 3000 公里长的 T1 中继线使用 Go-Back-N 协议传输 64 字节帧。如果传播速度为 6 微秒/公里,则序列号应为多少位?
我的答案:
对于这个问题,我们需要做的是打好基础知识。我们试图找到的是使用 Go-Back-N 时应该使用的最大序列号的大小。为了弄清楚这一点,我们需要确定一次可以放入我们链路的数据包数量,然后从该数字中减去一。这将确保我们永远不会在链路中同时有两个具有相同序列号的数据包。
链路长度:3000km 速度:6微秒/km 帧大小:64字节 T1传输速度:1544kb/s(http://ckp.made-it.com/t1234.html)
传播时间 = 6 微秒/公里 * 3000 公里 = 18,000 微秒 (18ms)。将 1544kb 转换为字节 = 1544 * 1024 = 1581056 字节传输时间 = 64 字节/1581056 字节/秒 = 0.000040479 秒 (0.4ms)
因此,如果我们将 18ms 传播时间除以 0.4ms 传输时间,我们将发现我们能够一次将 (18/0.4) 45 个数据包塞入链路。这意味着我们的序列号应该是 2^45 位长!
我这样做是否正确?
谢谢,迈克
答案1
为了弄清楚这一点,我们需要确定一次有多少数据包可以放入我们的链路中,然后从该数字中减去一。这将确保我们永远不会同时在链路中出现两个具有相同序列号的数据包。
我不同意这种推理。协议实体不发送窗口外的帧,即可实现不出现两个具有相同序列号的数据包。您应该区分窗口大小N
和序列号范围。对于只有 5 个帧的窗口,使用 32 位序列号没有问题,尽管这当然不是最佳选择。
如果一个方向的传输时间为 18 毫秒,则 RTT(往返时间)为 18 毫秒 + 接收端处理时间 + 18 毫秒。我不知道在这种情况下什么值的处理时间是合理的,所以为简单起见,我们假设为零。这给出的 RTT 为 36 毫秒。这意味着从您发送帧的那一刻起,(在最佳情况下)需要 38 毫秒才能收到该帧的确认。这决定了在决定窗口大小时有意义的未完成数据量的上限。如果您的窗口大小更大,它只会填充发送端的传输缓冲区,而不会影响吞吐量。很可能还有其他因素(例如接收端的缓冲区大小)会进一步限制窗口,但由于没有提供这方面的信息,我们假设接收端有无限的缓冲区等。
为了获得最佳(吞吐量)性能,窗口应该足够大,以便发送方可以连续发送 38ms。T1 速度为每秒 193000 字节。每帧 64 字节相当于每秒 3015.625 帧。0.038 乘以 3015.625 得出 114.59375。也就是说,在 38ms 内您可以发送 114 帧。因此,可以选择略大于理论最大值的窗口大小(例如 115-120)(这样限制因素就是物理链路而不是窗口大小)。序列号范围必须大于窗口大小,在这种情况下,128 是一个接近最大值。
因此,您的问题的答案是,在这种情况下,序列号至少需要 7 位。另请参阅这里用于交互式的 go-back-n java 小程序。