【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!
在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IP、TCP、路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。 CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。 换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。
CS144的Lab5通常是关于网络传输控制协议(TCP)的实验。在这个实验中,学生们将深入探索TCP协议的工作原理、流量控制和拥塞控制机制。 实验内容包括:
这些实验有助于让学生们深入了解TCP协议的运作方式,并通过实践加深对网络传输控制的理解。他们将有机会通过实验验证理论概念,观察TCP协议在不同情境下的行为,从而更好地掌握网络协议的本质和运作机制。
1 实现一个简单的网络接口,将IP数据报以数据链路层以太网帧的形式进行转发
2 深入理解地址解析协议ARP
3 深入立即以太网帧的转发过程
1 在lab5中,我们将使用堆栈实现一个网络接口:连接Internet数据报(在全球传播)和链路层以太网帧(单跳传播)。该接口可以作用于TCP/IP实现之下,但是当我们在实验室6中构建路由器时,也可以将该组件在网络接口之间传递路由数据报。
2 在lab0、1、2、3、4中,我们编写了一个TCP实现,它可以成功地与使用TCP的任何其他计算机交换TCP段。但是,这些TCP段是如何传递到对等的TCP实体上的?实际上,这个实现有几种选择:
(1)TCP-in-UDP-in-IP。TCP段可以携带在用户数据报的数据负载中。例如,Linux中提供了一个接口(UDPSocket),它允许应用程序只提供用户数据报的有效负载和目标地址,内核负责构造UDP头、IP头和以太网头,然后将数据包发送到适当的下一跳。内核确保每个套接字都有本地和远程地址、端口号的唯一组合。由于是内核将这些写入UDP和IP头,所以它可以隔离不同的应用程序。
(2)TCP-in-IP。在通常的用法中,TCP段总是直接放在Internet数据报中,在IP和TCP报头之间没有UDP报头,这就是“TCP/IP”。这实现起来有点困难。Linux提供了一个称为TUN设备的接口,它允许应用程序提供整个Internet数据报,而内核负责其余的工作(写入以太网标头,并通过物理以太网卡实际发送,等等)。但是现在应用程序必须构造完整的IP头本身,而不仅仅是有效负载。实际上,lab4提供了一个表示Internet数据报并知道如何解析和序列化自身的对象(tcp helpers.{hh,cc}),和在IP中封装tcp段的逻辑(现在可以在tcp helpers/tcp over IP .cc中找到)。
(3)TCP-in-IP-in-Ethernet。在上述的几种方法中,我们仍然依赖Linux内核来实现部分网络栈。每当代码将IP数据报写入TUN设备时,Linux必须以IP数据报作为有效负载构造一个链路层以太网帧。这意味着Linux必须根据下一跳的IP地址计算出下一跳的以太网目的地址。如果它还不知道这个映射,Linux广播一个查询,问:“谁声明下面的IP地址?”你的以太网地址是什么?,然后等待回复。实际上,这些功能由网络接口执行:一个将出站IP数据报转换为链路层(如以太网)帧的组件,反之亦然。
3 在本周的实验中,我们将实现一个网络接口,
并将其放在TCP/IP栈的最底部。我们的代码将生成原始以太网帧,这些帧将通过一个称为TAP设备的接口传递给Linux——TAP设备。类似于TUN设备,但更低级,因为它交换原始链路层帧而不是IP数据报。大部分的工作是为每个下一跳的IP地址查找(和缓存)以太网地址。这方面的协议被称为地址解析协议(ARP)。
1 实现网络接口
(1)输入命令”cd sponge/build”进入build目录,输入命令”git merge origin/lab5-startercode to date”获取实验源代码。输入命令”make”进行编译,编译结果如图6-1所示。
cd sponge/build
git merge origin/lab5-startercode to date
图6-1 编译结果
(2)输入命令” vim ../libsponge/network_interface.hh”进入文件并如图所示修改文件代码。代码源码见附录。
vim ../libsponge/network_interface.hh
图6-2 文件内容
(3)输入命令” vim ../libsponge/network_interface.cc”进入文件并如图6-3-6-4所示修改文件代码。代码源码见附录。
vim ../libsponge/network_interface.cc
图6-3 文件内容_1
图6-4 文件内容_2
(4)输入命令”make”进行编译,编译结果如图6-5所示。
make
图6-5 编译结果
(5)输入命令” make check_lab5”对lab5进行检查,检查结果如图6-6所示。可以看到,所有的测试样例都通过。
make check_lab5
图6-6 check结果
1 在lab5实验中,我们遇到的一个典型问题是:当系统在发送一个ARP request后,如果没有响应要五秒后重发,且在上一个请求被正常响应之前其他的请求都要排在后面。如果没有注意到这一点就可能导致最后make check_lab5出现一些错误提示
2 通过这次lab5实验,我们了解到TCP报文有三种方式可被传送至远程服务器。第一种是TCP-in-UDP-in-IP,这是内核完成的任务,因此内核可以确保每个套接字都具有本地地址与端口,以及远程地址与端口的唯一组合,同时能保证不同进程之前的隔离。第二种是TCP-in-IP,当用户将 IP 报文发送给 TUN 设备后,剩余的以太网报头构造、发送以太网帧等的操作均会由内核自动进行,无需用户干预。第三种是TCP-in-IP-in-Ethernet,它将会把待出口的 IP 报文转换成链路层(以太网)帧等等,之后将链路层帧发送给 TAP 虚拟网络设备,剩下的发送操作将会由它来代为完成。
3 通过这次lab5实验,我们了解到适配器之所以除了有网络层地址(IP地址)以外,还会有链路层地址(MAC地址)的原因是因为局域网是为了任意网络层协议而设计,并非只用于 IP 和因特网。如果适配器使用 IP地址而不使用 MAC 地址,那么每次适配器移动或重启时,均需重新配置地址。由于适配器同时拥有网络层和链路层地址,因此需要相互转化。而这种转换的任务就由地址解析协议来完成。ARP 类似于 DNS 服务,但不同的是,DNS 为任何地方的主机来解析主机名,但 ARP 只能为在同一个子网上的主机和路由器接口解析 IP 地址。
斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。