【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!
在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IP、TCP、路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。 CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。 换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。
斯坦福大学的CS144课程中,Lab 4 是一个非常关键且引人入胜的实验。这个实验通常涵盖了网络传输控制协议(TCP)的实现。 在Lab 4中,学生们会被引导着从头开始实现一个简单的 TCP 协议栈。这包括建立起基本的连接、数据传输和连接终止的过程。学生们需要理解并编写代码,模拟 TCP 协议的行为,从而深入了解 TCP 在网络通信中的作用和运作原理。 Lab 4 包含以下内容:
这个实验将学生置身于网络协议的实际操作之中,要求他们通过编码实现协议的基本功能。通过这个实验,学生将深入了解 TCP 协议的运作方式,从而更好地理解计算机网络中数据传输的机制和挑战。
1 将TCP_Receiver、TCP_Sender结合,实现一个简单的TCP_Connection类 2 进一步熟悉TCP的工作原理,大体实现TCP协议
1 在lab0中,我们完成了流控制字节流(ByteStream)的实现。在lab1、2和3中,我们实现了在具体数据、Internet提供的不可靠数据报之间的双向转换。
2 在lab4中,我们将创建名为TCPConnection的总体模块,该模块将TCPSender和TCPReceiver结合起来,并处理连接的全局管理。连接的TCP段可以让我们的代码与Internet上使用相同TCP/IP语言的数十亿其他计算机通信。
3 为了实现TCPConnection,我们会使用与lab0-3中相同的类库。Lab4提供了将TCP段读写到用户和Internet数据报有效负载中的支持代码,此外,它还提供了一个类(CS144TCPSocket)来包装您的TCPConnection并使其像一个普通的流套接字。在本实验结束时,为了正式使用TCP实现,我们将稍微修改webget。
1 实现TCPConnection
(1)在终端输入命令”cd sponge /build”进入build目录,输入命令”git merge origin/lab4-startercode”获取源代码,运行结果如图5-1所示。
cd sponge /build
git merge origin/lab4-startercode
图5-1 获取实验源代码
(2)输入命令” vim ../libsponge/tcp_connection.cc”进入文件,并将文件代码如图5-2-5-5所示修改。代码源码见附录。
vim ../libsponge/tcp_connection.cc
图5-2 文件内容_1
图5-3 文件内容_2
图5-4 文件内容_3
图5-5 文件内容_4
(3)输入命令”vim ../libsponge/tcp_connection.hh”进入文件并将文件内容如图5-6-5-7所示修改。代码源码见附录。
vim ../libsponge/tcp_connection.hh
图5-6 文件内容_1
图5-7 文件内容_2
(4)输入命令”make”进行编译。编译如图5-8所示。
make
图5-8 编译结果
(5)输入命令” make check_lab4”对lab4进行检查,检查结果如图5-9所示。可以看到,所有的测试样例都通过。
make check_lab4
图5-9 check结果
1 Lab4需要完成“the summit (TCP in full)”。Lab4相当于从最初lab0的ByteStream到lab1的流重组器再到lab2和lab3的接收端Receiver和发送端Sender的整合,其难度也是最大的。我们在这里卡的时间大概有一到两周,在此过程中不断修改前面的lab0至lab3最终无奈只能拷贝了一份队友的sponge/build文件从头开始,并且需要说明的是根目录设置为sy2所以后续实验的截屏根目录都从sy2/sponge/build开始。这里的CS需要的三报文握手结构如图5-10所示。
图5-10 三报文握手示意图
图10中,实线表明是客户client,虚线表明是服务器server,最开始客户client和服务器server都是由CLOSED状态开始,这里的服务器server分为三状态:TCPConnection、Sender、Receiver,其中TCPConnection由Sender和Receiver决定,TCPConnection状态由closed到listen:Receiver处于listen而Sender处于closed,故TCPConnection=Receiver&Sender(此时为三次握手的第一次握手);当客户发送消息传达给服务器后,此时服务器的Receiver状态为Receiver_RST, Sender状态为listen ,TCPConnection状态变为SYN_RCVD(此时为三次握手的第二次握手);服务器发送消息给客户,此时TCPConnection状态仍为SYN_RCVD,而Sender状态为SYN_ACKED, TCPConnection状态变为ESTABLISHED (此时为三次握手的第三次握手)。而断开连接需要四报文挥手,端A需要发送FIN给端B(四报文挥手第一步),端B收到后返回一个确认交给端A(四报文挥手第二步),并且端B还需要发送相应的数据包data(四报文挥手第三步),在端A收到后会发送确认ACK(四报文挥手第四步)。
2 其实lab4并不需要使用特别复杂或者更为优化的数据结构来完成(最初我也在考虑使用何种数据结构做优化问题),因为仔细阅读文档会发现有这样一句话
“The heavy lifting is all done by the TCPSender and TCPReceiver that you’ve already implemented. The work here is really just about wiring everything up, and dealing with some lingering connection-wide subtleties that can’t easily be factored in to the sender and receiver” 即说明繁重的工作都是由已经实现的lab2的TCPReceiver和lab3的TCPSender完成的。这里的工作实际上只是将所有东西连接起来,并处理一些延迟的连接范围内的微妙之处,而这些微妙之处不容易被lab2的TCPReceiver和lab3的TCPSender考虑。
这里我们修改后的lab3使用queue(队列),其实后来我发现check能否通过并非需要将其数据结构做的特别漂亮,而是对其整体逻辑的实现没有问题基本上都可check成功。
斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。