Lab1
- Lab汇总
- 概述
- 具体实现
Lab汇总
概述
lab1要求实现一个字符串的装配器,用于将 T C P TCP TCP接收方接收到的字节流拼接起来,并缓存一定量的乱序到达的字节,便于 T C P TCP TCP接收方相关功能的实现。
具体实现
该装配器实现的重点是push_substring
函数,它接收一个字符串
d
a
t
a
data
data与该字符串首字符在原串中的偏移量(由于
T
C
P
TCP
TCP传输时可能需要将较大的报文按照
M
S
S
MSS
MSS进行切分),并维护一个已拼接完的字节流(使用lab0实现的ByteStream
类维护)方便
T
C
P
TCP
TCP接收方读取
由于输入的字符串可能无序且可能有重叠部分,需要按字节顺序连续地将字节流添加进字节流中,且不能保存重叠的部分;且已拼接完的字节流大小与乱序字节缓存区的大小之和不能超过给定的capacity
,到达的字节如果在给定的范围之外,则忽略。
我使用一个链表维护乱序到达的字节序列,使用两个变量标志该字节流是否已经到达尾部与字节流最后一个字节的序号。
bool _eof;
size_t _eof_idx;
对于链表的维护,我首先将乱序到达的字节序列(输入的字符串)插入到链表中(按照index
排序的插入),然后再对链表进行相邻序列的合并,使得链表中的相邻两项在字节流上不相邻。
当到达一个可以加入字节流的序列时,遍历链表并将链表第一个节点与当前的字节流前沿对比,如果有相交或者相邻,则把第一个节点删除并将对应的字节序列加入字节流中,否则停止迭代。
有一些细节需要注意
- 首先就是该函数接收的字符串可能是空串,这时要特判一下,空串会导致后面的处理变复杂,如果携带eof则设置参数,然后返回即可。
- 还有就是如果输入的字符串不为空,则需要判断一下该字节序列的范围是否超过当前的缓存范围(从接收窗口后沿算起往后的
capacity
个字节),如果超过,则可以先切割一下输入的字符串。(超过范围的字节被省略)