⛳️1. 斯坦福大学计网实验室
【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!
1.1 斯坦福大学之CS144
在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IP、TCP、路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。
CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。
换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。
1.2 CS144实验室之Lab2
CS144的Lab2是一个有趣而挑战性的实验,通常涉及构建一个简化的网络路由器。这个实验有助于学生深入理解路由器的工作原理和网络数据包转发过程。
在Lab2中,学生通常需要实现基本的路由器功能,包括数据包的转发和路由表的构建。他们可能会编写代码来处理接收到的数据包,根据目的地IP地址选择正确的输出端口,并将数据包转发到正确的目的地。
这个实验通常涵盖了许多网络原理,比如IP地址的解析、数据包的转发、路由表的更新等。学生们需要理解和实现一些基本的路由算法,以确保数据包按照正确的路径进行传输。
Lab2的完成通常需要学生运用课堂所学的知识,并通过编程和实践来加深对计算机网络中路由器功能的理解。这样的实验旨在将理论知识应用到实际网络系统中,并培养解决实际网络问题的能力。
⛳️2. Lab2
2.1 实验目的
1 实现一个简单的TCP接收类
2 对TCP数据传输有更深的理解
2.2 实验说明
1 在lab0中,我们实现了流控制字节流(ByteStream)的抽象。在lab1中,我们创建了一个StreamReassembler的结构体,它可以接受来自相同的字节流的子字符串序列,并将它们重新组装到原始流中。
2 这些模块可以发挥作用并可以满足实验要求,但是它们并没有体现出TCP传输控制协议的细节,所以在lab2中,我们将会实现一个TCPReceiver,它的作用是处理传入字节流的数据,也就是说,从IP数据报中正确读取它所携带的信息。
3 TCPReceiver应当可以对正确收到的数据报(没有差错,且按序到达)向发送方发送一个确认号,而发送方可以根据这个确认号来决定自己的发送情况。TCPReceiver还应当可以将自己的接收窗口告诉发送方,通过接收窗口的大小,发送方可以调整自己的发送。
2.3 实验内容
1 将64位索引转换为32位
(1)获取实验代码。切换到build目录,输入命令”gitmergeorigin/lab2-startercode”,如图3-1所示。其运行结果如图3-2所示。
git merge origin/lab2-startercode
图3-1 获取实验代码
图3-2
(2)下载代码完成后,在build目录中输入”make”对代码进行编译,编译结果如图3-3所示。
make
图3-3 代码编译结果
(3)输入命令”vim ../libsponge/wrapping_integers.hh”进入wrapping_integers.hh文件,如图3-4所示。此处我们不修改该文件,其代码内容如图3-5-3-6所示。文件源码见附录。
vim ../libsponge/wrapping_integers.hh
图3-4 进入wrapping_integers.hh文件
图3-5 文件内容_1
图3-6 文件内容_1
(4)输入命令”vim ../libsponge/wrapping_integers.cc”进入文件,将文件内容修改如图3-7所示。文件源码见附录。
vim ../libsponge/wrapping_integers.cc
图3-7 文件内容
(5)输入”make”进行编译,编译结果如图3-8所示。
make
图3-8 编译结果
(6)输入命令”ctest -Rwrap”对lab2进行实验的检查,检测结果如图3-9所示。可以看到,所有的测试样例全部通过。
ctest -R wrap
图3-9 实验1测试结果
2 实现TCPReceiver
(1)输入命令”vim ../libsponge/tcp_receiver.hh”进入文件,将代码图3-10-3-11所示修改。代码源码见附录。
vim ../libsponge/tcp_receiver.hh
图3-10 文件内容
图3-11 文件内容
(2)输入命令” vim ../libsponge/tcp_receiver.cc”进入文件,将代码如图3-12所示修改。代码源码见附录。
vim ../libsponge/tcp_receiver.cc
图3-12 tcp_receiver.cc内容
(3)输入”make”进行编译,编译结果如图3-13所示。
make
图3-13 编译结果
(4)输入命令” makecheck_lab2”对lab2的实验二进行检查,检查结果如图3-14所示。可以看到,所有测试样例全部通过。
make check_lab2
图3-14 实验二check结果
2.4 实验体会
1 lab2需要完成“theTCPreceiver”(TCP接收器)。Lab2总体来说比较简单,代码大概也就十几行。
2 实验一需完成” Translatingbetween64-bitindexesand32-bitseqnos”(seqno在64位索引和32位序列号之间转换),这里需要实现wrap(n,isn)和uwrap(n,isn,checkpoint)两个函数,对于wrap(n,isn)若n为0则返回SYN,否则n为k则返回SYN+n,即将给定的seqno转化为32位的seqno,这里函数实现直接返回n与isn相加即可;对于uwrap(n,isn,checkpoint)由于一个34位对应多个64位整型,所以checkpoint用来表示离32位最近的64位isn所以相当于一个映射。
3 实验二需完成“ImplementingtheTCPreceiver”(实现TCP接收器)。这里引入了optional,此处的optional类似于容器:如果元素未初始化,则容器为空,否则认为容器有效的。这里将capacity传给reassembler得到缓冲区容量,segmentreceived()设置了初始序列号和SYN标志的第一个到达段的序列号,只要注意的是如果在TCPSegment的中设置了FIN标志,此时调用reassembler.stream_out()函数即可; window_size()表示从ackno算还能接收的字节数,相当于TCP连接过程中的利用滑动窗口做到流量控制。
📝总结
斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。