复盘一下CS144(2020Fall)的8个Lab
Lab主要内容
lab 0
- 使用telnet & netcat发送和接受应用层的数据
- 使用自带套接字写一个webget,了解套接字编程
实现ByteStream作为TCP连接的最底器的容器
- FIFO模型
- 有限容量
- 支持write,peak,pop,read,remaining_capacity,end_input操作
lab 1
在ByteStream的基础上实现StreamReassembler
- 负责把收到的包根据序号重组,按序写入ByteStream
- 抛弃过去的包和超出容量的包
- 储存容量容许范围内,但失序的包
lab 2 & 3
TCP receiver
- 基于收到包的连续性的假设,正确转换32位的seq到64位的index
- 将收到的包传给StreamReassembler
- 计算出正确的ackno
- 计算出正确的window_size,以告知发送方实现流量控制(flow-control)
TCP sender
TCP可靠数据传输机制的实现
- 定时器(单一的重传定时器)
- 序号和确认(确认是被捎带在数据报文段中的)
- TCP连接管理:SYN和FIN
- 流量控制的另一部分,发送方根据接收方的窗口大小调整流量
lab 4
TCP connection
- 整合sender和receiver实现TCP过程
- TCP状态机:三次握手,正常通信,四次挥手
lab 5
- 实现一个network interface,也就是网卡以及arp协议
- 网卡中有一个arp表,实现ip地址和mac地址的转换,它通过arp协议自动生成,每个表项都会过期
- arp协议是一个链路层和网络层中间的协议,它在层次关系上和ip(网络层)很像,我们需要把arp包封装为一个以太网包(或其他链路层帧)发送出去,因而在体系结构上位于链路层之上,但是一个arp分组具有包含链路层地址的字段,因而也可认为是链路层协议。
- 借由链路层的广播帧,可以将arp分组发送给所有人,从而得到预期的回复
lab 6
- 实现一个路由器,对应网络层的数据平面,根据输入的规则,按照最长前缀匹配规则转发
- 基于lab 5的network interface:一个路由器有多个interface
lab 7
- 不知道为什么,client发送的arp REQUEST没有收到回复,按道理说,server端应当这个REQUEST并回复REPLY,但是没有发生,原因可能是cs144关了这个中继服务,或者是我的代码错了,有待进一步研究
性能优化
TCP
- https://zhuanlan.zhihu.com/p/...
- 优化的主要部分,都在于避免直接复制string
- 使用右值引用、共享指针、Buffer中的offset实现
network interface
- 通过map+heap + lazy deletion 实现O(lgN)的查找,插入,检查,更新
router
- 通过vector,实现O(N)的查找,但应当有更优的算法,没有深入调查
未来的计划
- 看一看这个lab是如何使用TUN和TAP,绕过了linux的内核的TCP/IP栈,从而使用我们自己写的TCPsocket的
- 看一看如何从TCPconnection到TCPsocket的
- 看一下/apps/里的代码,包括再看看lab7是什么原理
- 其实LAB4还有挺大优化空间,这是因为我又发现有两个地方我复制了string,可以改成智能指针,不过这又涉及到对象的生命周期的问题,需要再研究
- 整理我的lab仓库,把这门课变成一个小项目
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。