Lab-CS144
Lab0
Lab1
Lab2
Lab3
RTO翻倍后下初始时间要不要翻倍?
值得注意的点:
- 在发送FIN后收到ACKno不需要再发送新的segment。
- 创建segment时如果以byte stream是否为空作为结束循环的条件,需要考虑使得只发送包含SYN或FIN的segment的情况也能进入循环一次。
- 在TCPConfig中有最大重发次数限制,记得加上。
- readme中没有说清楚,应该是每一次超时RTO就在当前的基础上翻倍。
- 最大负载指的是payload的最大大小,如果窗口够大的话可以继续发送SYN,FIN。
(bug你怎么这么多,对着测试de了半天)
Lab4
本次实验需要完成TCPConnection将在Lab2和Lab3中完成的TCPSender和TCPReceiver结合起来。
完成本次实验,可以将Lab0中的TCPScoket修改为自己实现的CS144TCPSocket。
实现细节:
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>
有值时设置ackno
和ACK
标志在输入段中,当
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
是falseinbound stream
已经完全组装并且已经结束outbound stream
已经被本地应用结束并且完全发送给远端节点outbound stram
已经被远端节点完全接收了否则需要等待:连接仅在最后一个segment被接收后的一段时间(10*
_cfg.rt_timeout
)后完成
发送时的三次握手: