Lab0

Lab1

Lab2

Lab3

RTO翻倍后下初始时间要不要翻倍?

值得注意的点:

  1. 在发送FIN后收到ACKno不需要再发送新的segment。
  2. 创建segment时如果以byte stream是否为空作为结束循环的条件,需要考虑使得只发送包含SYN或FIN的segment的情况也能进入循环一次。
  3. 在TCPConfig中有最大重发次数限制,记得加上。
  4. readme中没有说清楚,应该是每一次超时RTO就在当前的基础上翻倍。
  5. 最大负载指的是payload的最大大小,如果窗口够大的话可以继续发送SYN,FIN。

(bug你怎么这么多,对着测试de了半天)

Lab4

本次实验需要完成TCPConnection将在Lab2和Lab3中完成的TCPSender和TCPReceiver结合起来。

完成本次实验,可以将Lab0中的TCPScoket修改为自己实现的CS144TCPSocket。

image-20220426101242509

实现细节:

  • TCPConnection收到 RST flag,在输入输出的ByteStram设置error flag,之后的TCPConnection::active()调用都返回false。发送一个RST与收到一个RST效果相同。

  • 两种需要中断的情况:

    • 超过最大重传次数TCPCnfig::MAX_RETX_ATTEMPTS
    • TCPConnection destructor is called
  • 使用send_empty_segment()方法产生一个可以设置RST的segment或在一个需要发送的segment中写入

  • 在输出段中,当TCPReceiver::ackno()方法返回的std::optional<WrappingInt32>有值时设置acknoACK标志

    在输入段中,当ACK被设置,获取ackno并交给TCPSender

  • 如果TCPReceiver发送了一个超过TCPSegment::header().win范围的窗口大小,发送最大能发送的大小

    std::numeric_limits

两种关闭connection的方式:

  • unclean shutdown

TCPConnection发送或收到一个带有RST的segment ,输入输出的ByteStream都被设置为error状态,active()可以立刻返回false

  • clean shutdown

TCPConnection 有一个成员变量_linger_after_streams_finish,初始为true,如果inbound stream在TCPConnection的outbound stream到达EOF之前结束,这个变量将会被设为false

当下列四个条件满足时,the connection is “done” (active()返回false)

  • _linger_after_streams_finish 是false
  • inbound stream已经完全组装并且已经结束
  • outbound stream已经被本地应用结束并且完全发送给远端节点
  • outbound stram已经被远端节点完全接收了

否则需要等待:连接仅在最后一个segment被接收后的一段时间(10*_cfg.rt_timeout)后完成

发送时的三次握手:image-20220505200805158