lab3-TCPSender
在本lab中,我们需要实现TCPSender的各种细节,包括初始化syn与结束fin的处理,根据窗口大小新建TCPSegment并发送,超时重传,以及ack与窗口大小的更新等等。在此记录实现过程与需要留意的几个地方:
一. fill_window()
该函数负责将数据包装后推出。
- 在调用fill_window时,分别根据_next_seqno与数据流的eof标志来判断发送流的开始与结束。
- 使用while循环重复将流中的数据取出包装并发送出去(因每个TCPSegment所能携带的数据存在上限,可能要分多次封装)。
- 若最终生成的段长度(调用段的length_in_sequence_space函数)为0则退出循环(函数),否则将段推出同时存入缓存区以用于超时重传,同时打开计时器(每一批推出的段共享一个计时器)。
二. ack_received()
接收到对端传来的ackno与window_size后,将调用该函数进行相应处理。
- 首先过滤掉错误ackno,即遇到大于最后发出的段的seqno的ackno将被忽视。
- 其次根据ackno的值的大小,将缓存区中已被确认接收的段排除。若排除了任何段(非所有段),则计时器将置零,超时值初始化,重新开始计时。若排除了所有段,则计时器关闭。函数最后调用fill_window()以填充更新后的窗口。
- 若窗口值为0,则将其至1以避免不发送段无法收到更新后的窗口大小,同时标记窗口已满。
- 标记接收到新ack(fill_window调用时的行为ack更新与否有关)。
三. tick()
tick函数负责更新时间,以及超时事务的处理。
仓库地址:https://gitlab.eduxiji.net/NScola/wuhaocs144/-/tree/master/libsponge

浙公网安备 33010602011771号