2

复盘一下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

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仓库,把这门课变成一个小项目

尚戈继
1 声望0 粉丝