lab3-TCPSender

在本lab中,我们需要实现TCPSender的各种细节,包括初始化syn与结束fin的处理,根据窗口大小新建TCPSegment并发送,超时重传,以及ack与窗口大小的更新等等。在此记录实现过程与需要留意的几个地方:

一. fill_window()

该函数负责将数据包装后推出。

  1. 在调用fill_window时,分别根据_next_seqno与数据流的eof标志来判断发送流的开始与结束。
  2. 使用while循环重复将流中的数据取出包装并发送出去(因每个TCPSegment所能携带的数据存在上限,可能要分多次封装)。
  3. 若最终生成的段长度(调用段的length_in_sequence_space函数)为0则退出循环(函数),否则将段推出同时存入缓存区以用于超时重传,同时打开计时器(每一批推出的段共享一个计时器)。

二. ack_received()

接收到对端传来的ackno与window_size后,将调用该函数进行相应处理。

  1. 首先过滤掉错误ackno,即遇到大于最后发出的段的seqno的ackno将被忽视。
  2. 其次根据ackno的值的大小,将缓存区中已被确认接收的段排除。若排除了任何段(非所有段),则计时器将置零,超时值初始化,重新开始计时。若排除了所有段,则计时器关闭。函数最后调用fill_window()以填充更新后的窗口。
  3. 若窗口值为0,则将其至1以避免不发送段无法收到更新后的窗口大小,同时标记窗口已满。
  4. 标记接收到新ack(fill_window调用时的行为ack更新与否有关)。

三. tick()

tick函数负责更新时间,以及超时事务的处理。

 仓库地址:https://gitlab.eduxiji.net/NScola/wuhaocs144/-/tree/master/libsponge

posted @ 2023-02-22 22:46  无糖百事  阅读(31)  评论(0)    收藏  举报