0%

CS144-Lab3

Lab3 接续 Lab2,要完成Sender的角色。 TCP 的任务主要为:

  • Keep track of the receiver's window (acknos and window size)
  • Fill the window when possible, by reading from the ByteStream, creating new TCP segments (including SYN and FIN flags if needed), and sending them.
  • Keep track of which segments have been sent but not yet acknowledged by the receiver — we call these “outstanding” segments
  • Re-send outstanding segments if enough time passes since they were sent, and they haven’t been acknowledged yet

Why am I doing this? The basic principle is to send whatever the receiver will allow

us to send (filling the window), and keep retransmitting until the receiver acknowledges

each segment. This is called “automatic repeat request” (ARQ).

那么TCPSender是怎么时候知道一段segment丢失了呢?

Sender会记录每一个outstanding segment直到收到receiver的ackno。而如果一个segment outstand了太久的话, 我们就需要将其重新发送一遍。

当然,这里有些关于"outstanding for too long"的原则,但Lab3不会让我们解决一些tricky或者过于文字游戏的问题 (留在Lab4)。

这里有几个要点: - Sender的tick函数是唯一一个你可以用的,关于时间的函数。其他对于CPU/OS的调用都是被禁止的。 - Sender会被设置一个retransmission timeout (RTO)。这个就是我们resend segment的时长了。 - 我们需要自己实现retransmission timer,基于tick。 - 每个包含数据的segment被发送时,若timer没有运行,就启动timer。 - 当所有outstanding data被acknowledged了,停止timer。

在这里我们可以讨论一下RTO和Retransmission timer。 首先,当有带数据的segment被发送时,我们要让timer run起来。 当tick时若timer超时,则: - 把segno最低的重发一遍 - 若window大小不为0,则: - retransmission num ++ (timer stop的时候置零) - RTO *= 2, 这是根据流量调整速率的 - reset timer and start it

除此之外\(FIN\)的处理也有点dirty,实现的时候要注意一下。

Lab4和Lab5比较简单,就不记录了,一个是IP/Ethernet以及ARP的NetworkInterface实现,一个则是Router的跳转表实现, 不需要太动脑子。