【斯坦福计网CS144】Lab4终结笔记

2023-12-17 14:20

本文主要是介绍【斯坦福计网CS144】Lab4终结笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《斯坦福大学CS144 | 奇遇记》
🔖翰墨致赠:翠柏摇落寒江曲,风华如梦往事长。剑啸苍穹激云涌,豪情自在星空翔。

目录结构


⛳️1. 斯坦福大学计网实验室

1.1 斯坦福大学之CS144

1.2 CS144实验室之Lab4

⛳️2. Lab4

2.1 实验目的

2.2 实验说明

2.3 实验内容

2.4 实验体会

📝总结


🔥 后续实验:【斯坦福计网CS144】Lab5终结笔记

🔥 官方文档:lab0-lab7官网解析pdf.zip

🔥 源码资源:斯坦福CS144-lab4解决源码(亲测有效!!!)

⛳️1. 斯坦福大学计网实验室

【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!

1.1 斯坦福大学之CS144

在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IPTCP路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。

CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。

换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。


1.2 CS144实验室之Lab4

斯坦福大学的CS144课程中,Lab 4 是一个非常关键且引人入胜的实验。这个实验通常涵盖了网络传输控制协议(TCP)的实现。

Lab 4中,学生们会被引导着从头开始实现一个简单的 TCP 协议栈。这包括建立起基本的连接、数据传输和连接终止的过程。学生们需要理解并编写代码,模拟 TCP 协议的行为,从而深入了解 TCP 在网络通信中的作用和运作原理。

Lab 4 包含以下内容:

  1. 建立连接过程: 学生将会实现 TCP 握手协议的逻辑,包括客户端和服务器端的连接建立过程。
  2. 数据传输: 实验会涉及如何传输数据段,并处理数据包的丢失或损坏等情况。
  3. 连接的终止: 学生需要实现 TCP 连接的正常终止过程,确保数据传输的完整性和可靠性。

这个实验将学生置身于网络协议的实际操作之中,要求他们通过编码实现协议的基本功能。通过这个实验,学生将深入了解 TCP 协议的运作方式,从而更好地理解计算机网络中数据传输的机制和挑战。


⛳️2. Lab4

2.1 实验目的

1  将TCP_ReceiverTCP_Sender结合,实现一个简单的TCP_Connection

2  进一步熟悉TCP的工作原理,大体实现TCP协议


2.2 实验说明

1  在lab0中,我们完成了流控制字节流(ByteStream)的实现。在lab123中,我们实现了在具体数据、Internet提供的不可靠数据报之间的双向转换。

2  在lab4中,我们将创建名为TCPConnection的总体模块,该模块将TCPSenderTCPReceiver结合起来,并处理连接的全局管理。连接的TCP段可以让我们的代码与Internet上使用相同TCP/IP语言的数十亿其他计算机通信。

3  为了实现TCPConnection,我们会使用与lab0-3中相同的类库。Lab4提供了将TCP段读写到用户和Internet数据报有效负载中的支持代码,此外,它还提供了一个类(CS144TCPSocket)来包装您的TCPConnection并使其像一个普通的流套接字。在本实验结束时,为了正式使用TCP实现,我们将稍微修改webget


2.3 实验内容

实现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结果


2.4 实验体会

1  Lab4需要完成“the summit (TCP in full)”。Lab4相当于从最初lab0ByteStreamlab1的流重组器再到lab2lab3的接收端Receiver和发送端Sender的整合,其难度也是最大的。我们在这里卡的时间大概有一到两周,在此过程中不断修改前面的lab0lab3最终无奈只能拷贝了一份队友的sponge/build文件从头开始,并且需要说明的是根目录设置为sy2所以后续实验的截屏根目录都从sy2/sponge/build开始。这里的CS需要的三报文握手结构如图5-10所示。

5-10  三报文握手示意图

10中,实线表明是客户client,虚线表明是服务器server,最开始客户client和服务器server都是由CLOSED状态开始,这里的服务器server分为三状态:TCPConnectionSenderReceiver,其中TCPConnectionSenderReceiver决定,TCPConnection状态由closedlistenReceiver处于listenSender处于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”

即说明繁重的工作都是由已经实现的lab2TCPReceiverlab3TCPSender完成的。这里的工作实际上只是将所有东西连接起来,并处理一些延迟的连接范围内的微妙之处,而这些微妙之处不容易被lab2TCPReceiver和lab3的TCPSender考虑。

这里我们修改后的lab3使用queue(队列),其实后来我发现check能否通过并非需要将其数据结构做的特别漂亮,而是对其整体逻辑的实现没有问题基本上都可check成功。


📝总结

斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。

如果你也想了解更多斯坦福大学的CS144实验,以及计算机网络技术新进展,不妨点击下方链接,加入我们社群,共同探讨更多可能性吧。鉴于今年斯坦福大学的CS144实验的火热,我们还建立了一个CS144 🔥 系列专栏:《斯坦福大学CS144 | 奇遇记》,旨在深入探讨斯坦福大学的CS144的实践和应用。

这篇关于【斯坦福计网CS144】Lab4终结笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504687

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus