CS144 TCP

CS144 TCP/IP 实现

实验简介

lab0 - lab4 完成了自己的 TCP 实现,实现了 TCP 的可靠性,流量控制,连接的建立与销毁等过程。

总体架构

CS144 TCP_第1张图片

lab0 Warm UP

lab0 实现了内存中的字节流 ByteStream ,提供了 write(), read() 接口供应用层调用来写入,读取字节,同时还提供其他接口用于管理和查询字节流状态。具体使用 C++ STL 中提供的数据结构 deque 实现。

lab1 StreamReassembler

lab1 实现了流组装器 StreamReassembler , 鉴于底层网络只负责“尽力传输”,所以流传输过程中一些数据包可能会重复,丢失,重叠,乱序等。而 StreamReassembler 要做的就是将分散的数据包重新组装为有序的原字节流并交给底层 ByteStream。同时在其中也通过 capacity 的概念管理了内存中可存放的字节,是实现滑动窗口的基础,在初次做时只考虑了放入内存中的数据不能超出容量,实际应考虑窗口是连续的,index 超出窗口范围的字节数据也应该舍弃,这也和实际 TCP 协议对应。具体使用 C++ STL 中 set 数据结构实现,维护区间,合并区间(貌似有更好的方法)。

lab2 TCPReceiver

lab2 实现了 TCPReceiver ,用于接收 TCPSegment 即 TCP 数据包,对头部的字段做处理,将 payload 传递给 StreamReassembler 组装。实验中需要处理的头部字段包括 seqno,syn,fin,而 TCPReceiver 要给 TCPSender 提供 ackno,win 字段用于确认对方已发送的数据和告知对方我方目前可接受窗口大小。

lab3 TCPSender

lab3 实现了 TCPSender, 用于发送 TCPSegment , 对头部字段,如seqno,ackno,syn等进行填充,从底层 ByteStream 中取应用层写入的数据填入 payload。同时实现了简易重传定时器,定时器到期后会重传最先发送但未被确认的 TCPSegment

lab4 TCPConnection

lab4 实现了 TCPConnection,用于将 lab0 - lab3 的实现组合起来(combine or wire them up).

  1. send: 应用层将字节流写入 ByteStream ,TCPSender取数据组装为TCPSegment 发送。
  2. receive: 从网络接收 TCPSegment 交给 TCPReceiver , _receiver 取出其中 payload(字节流片段)交给StreamReassembler,__reassembler 组装完成后交付有序字节流到用于读的ByteStream供应用层读取。

实现上值得注意的是需要从 _sender_out中取出 TCPSegment 传入TCPConnection_out中才算真的发送完成。另外实验中也对之前见过的一个面试题有了更好的理解:TCP中为什么会有 TIME_WAIT?

对于一方来说有两种情况:

  1. 先发送 FIN, 在收到 FIN。这种情况是需要 TIME_WAIT 的。因为如果收到 FIN 返回 ACK 就关闭,对方有可能没有接收到 ACK ,依旧会重传数据,若有新的连接建立在此窗口就会收到错误信息。
  2. 先接到 FIN,再发送 FIN。此时不需要 TIME_WAIT , 因为发送 FIN 时会确认对方 FIN 同时也就确认了对方发送的所有数据,对方 就不会再重传了。另外带 FIN 的数据包是会被确认的,所以对方收到了会告诉我们(裸ACK包不占用序列号,是不会被确认的,确认的话就停不下来了)。

lab5 the network interface

完成了IP包到Ethernet Frame的互相转换,ARP 请求的发送和回复。

lab6 the IP router

实现了利用路由表进行最长前缀匹配并转发。

实验收获

  1. 对 TCP 协议的整个传输流程,实现有了更深入的理解。

  2. 编码过程中学到了不少 C++ 语法和特性,以及 gdb 调试技巧。

  3. 在 lab0 - lab3 的过程中缺少设计思想,拿上键盘就敲,比较混乱。lab4 时觉得先将架构,流程简要画出,列出可能要注意的点,再进行编码可能更有效,进行了初步尝试,确实编码思路更清晰了,同时也觉得还需要锻炼工程能力,之后的准备继续践行。

  4. 另外就是代码写的有些混乱,总结主要原因是缺少设计,对 C++ 语法没有那么熟悉。 希望以后二周目的时候能将架构,实现进行优化。

资源

CS自学宝藏

你可能感兴趣的:(课程学习,tcp/ip,网络,服务器)