【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!
在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IP、TCP、路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。 CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。 换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。
斯坦福大学CS144课程的实验中的Lab 3通常涉及对网络协议的实际实验和实现。Lab 3是关于网络路由的实验,旨在让学生深入理解和实践路由算法和路由协议。 在Lab 3中,学生会涉足到路由器的实现和仿真。他们需要编写代码来模拟路由器的行为,设计并实现一个简单的路由协议,或者进行一些仿真实验以评估不同路由策略的性能。这样的实验通常需要学生理解网络拓扑、数据包转发和路由选择的基本概念,并在实验中应用这些概念。 Lab 3涉及一些具体任务,比如实现路由表、设计路由选择算法、模拟数据包的传输路径等等。学生需要使用编程语言来实现这些功能,并通过模拟或仿真环境进行测试和评估。 这个实验有助于让学生通过动手操作加深对网络路由原理的理解,并通过实践了解路由器和路由协议的工作方式。这种实践性的学习方式有助于学生将课堂上学到的知识应用到实际情境中,加深对计算机网络原理的理解。
1 实现一个简单的TCP发送类 2 进一步熟悉TCP协议中的各种内容
1 在lab0中,我们实现了流控制字节流(ByteStream)的抽象。在lab1和lab2中,我们实现了将IP数据报中携带的段转换为传入字节流的工具:StreamReassembler和TCPReceiver。
2 现在,在lab3中,我们会实现连接的另一端。TCPSender是一个将传出的字节流转换为将成为IP数据报的工具。
3 TCP发送方和接收方各自负责TCP段的一部分。TCP发送方写入与lab2中的TCPReceiver相关的TCPSegment的所有字段:即序列号、SYN标志、有效负载和FIN标志。然而,TCP发送方只读取由接收方写入的段中的字段:确认号和窗口大小。
4 在TCPSender中,我们应该实现的功能如下
(1)跟踪接收方的窗口(处理传入的报文段和接收窗口大小)
(2)在必要的时候填充窗口,通过从ByteStream读取并创建新的TCP段(包括SYN和FIN标志),最后发送它们。发送方应该一直发送段,直到窗口已满或字节流为空。
(3)跟踪已经发送但尚未被接收方确认的片段,假如这种片段的发送时间较长但是依然未被接收方确认,则重新发送
1 实现TCPSender
(1)打开终端,输入命令”cd sponge/build”进入build目录,输入命令”git origin/lab3-startercode”获取lab3实验源码,运行结果如图4-1所示。
cd sponge/build
git origin/lab3-startercode
图4-1 获取实验原始代码
(2)输入命令”make”对文件进行编译,编译结果如图4-2所示。
make
图4-2 对源文件进行编译
(3)输入命令”vim ../libsponge/tcp_sender.hh”进入文件,将文件代码内容修改如图4-3-4-6所示。代码源码见附录。
vim ../libsponge/tcp_sender.hh
图4-3 文件内容_1
图4-4 文件内容_2
图4-5 文件内容_3
图4-6 文件内容_4
(4)输入命令”vim ../libsponge/tcp_sender.cc”进入文件,将文件内容如图4-7-4-12所示修改。代码源码见附录。
vim ../libsponge/tcp_sender.cc
图4-7 文件内容_1
图4-8 文件内容_2
图4-9 文件内容_3
图4-10 文件内容_4
图4-11 文件内容_5
图4-12 文件内容_6
(5)输入命令”make”对文件进行编译,编译结果如图4-13所示。
make
图4-13 编译结果
(6)输入命令” make check_lab3”对lab3进行检查,检查结果如图4-14所示。可以看到,全部样例测试通过。
make check_lab3
图4-14 检查结果
1 lab3需要完成“the TCP sender”。Sender需要做的事情比较多,并且这里的lab3文档讲述并不完善,参考了“https://cs144.github.io/doc/lab3/class t c p sender.html”以及CSDN上面的博客基本思想,需要完成的主要如fill_window()∶接收端会给Sender一个window_size(采用滑动窗口进行流量控制),根据该window_size判断如果窗口没填满并且发送端有数据需要发送,就可以使用fill_window()发送segment。
2 另外需要实现的是ack_received(ackno, window_size)︰接收端返回了确认信息,拿到该确认信息后,首先更新Sender自身的window_size状态。对于接收端确认的ackno来说,如果接收端是对新的数据进行确认,就需要更新Sender自身的ackno状态。(Sender里window_size和ackno存的都是Receiver的状态),此外还要实现ticks(ms_since_last_tick), consecutive_retransmissions两个方法,这里需要专门查看超时重传的文档。
3 本次实验中我们使用队列作为其数据结构:在TCPSender中实现队列_outstanding_segments存储已发送未确认的segments。对TCPSender而言,如果将TCPsegment推送到_outstanding_segments队列则认为它已完成发送。接着TCPSender的TCPconnection会对其进行pop(使用segments_out()访问)并发送。需要注意的时在从TCPReceiver获取ackno前,TCPSender假设Window size为一个字节,如果接收到outstanding segments的部分ackno,TCPSender要求实现TCPsegment只有全部被ack才能被remove。
斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。