CMU-14-740-计算机网络笔记-全-

CMU 14-740 计算机网络笔记(全)

1:课程介绍与网络概述 🖥️

在本节课中,我们将学习课程的基本信息、政策,并初步了解计算机网络是什么,以及其核心组成部分——网络边缘与网络核心。

课程信息与政策 📋

课程网站是获取所有课程信息的主要平台。对于个人问题,例如对内容不理解、不清楚如何提交作业或找不到资料,请使用 Piazza 问答平台提问。所有学生都可以看到问题并进行回答,教授和助教也会提供解答,这确保了信息透明和高效率的沟通。

作业将通过 Gradescope 提交。完成实验或作业后,请在此平台上提交,助教将在此评分并提供详细的逐题反馈。你可以在此查看每项作业的最终得分和反馈。

课程使用一本非常优秀的教材,它解释清晰、可读性强。阅读时请积极思考其中的示例,以加深理解。除了教材,课程还会提供一些会议论文和 IETF 工程文章作为补充阅读材料。

以下是关于课程评分构成的详细说明:

  • 作业 (40%):包括两次侧重于解题的作业和四次实验。实验将使用网络分析工具 Wireshark 来捕获和分析真实网络中的数据包,每次实验对应网络的一个不同层次。所有作业均为个人任务,需要提交报告。
  • 论文评述 (10%):本学期需要阅读8-9篇论文。对于每篇论文,你需要完成一份评述,内容包括:总结论文的核心贡献、列出三个最重要的观点,并提出两个可以在课堂上讨论的问题或评论。
  • 测验 (20%):在课程进行到约三分之一和三分之二时进行,内容不涵盖全部课程,只涉及自课程开始或上次测验以来的内容。
  • 期末考试 (25%):在期末考试期间进行,内容涵盖课程所有材料。
  • 课堂参与 (5%):这部分成绩旨在鼓励大家积极参与课堂互动,提出问题或发表评论。仅仅出席课堂是不够的。

最终成绩将根据上述加权平均分,按标准分数线(如90%,80%,70%)划分等级。

本课程是计算机网络的基础入门课程。如果你在本科阶段已经系统学习过网络协议栈、传输层协议或路由器工作原理,那么你应该选择更高级的课程(如14-756或14-746)。

关于学术诚信,合作讨论是允许且鼓励的。例如,与同学讨论作业中不理解的概念是很好的学习方式。然而,直接交换答案、分工做题然后共享结果,或者集体推导答案后各自照抄,这些行为都是不被允许的。正确的做法是:通过讨论获得启发后,独立完成自己的作业。

以下是成功学习本课程的一些建议:

  • 参与课堂:教授和课程设计能为学习增添价值。
  • 保持规律作息:良好的时间管理有助于高效学习。
  • 寻求帮助:教授和助教团队会通过 Piazza 和 office hours 提供帮助,遇到困难请及时沟通。

关于课程政策,作业必须在截止日期前提交,不接受迟交。对于寻求帮助,教授和助教都乐意解答。如果是关于作业评分的具体问题,联系负责评分的助教会更有效。Office hours 时间将很快公布在网站上。

什么是互联网?🌐

上一节我们介绍了课程的基本情况,本节中我们来看看一个根本性问题:互联网是什么?

我们可以从两个角度来理解互联网。

1. 具体构成视角
互联网是由硬件、软件和协议构成的全球性网络。

  • 硬件:包括数以百亿计的联网计算设备(主机)、各种通信链路(如光纤、Wi-Fi)以及用于转发数据的路由器。
  • 软件:设备上运行的各种网络应用程序(如电子邮件、浏览器)。
  • 协议:控制网络中信息收发的一系列规则和标准,例如 TCP、IP、HTTP、SMTP 等。协议定义了消息的格式、顺序和含义。
  • 组织:互联网是众多独立网络的集合,没有单一的控制中心,其标准由互联网工程任务组(IETF)通过“请求评议”(RFC)文档制定。

2. 服务提供视角
互联网是一种为应用程序提供通信服务的基础设施。

  • 它使得运行在不同终端上的应用程序能够交换数据。
  • 它主要提供两种服务:需要预先建立连接的面向连接服务(如 TCP,提供可靠性保证),和无需建立连接的无连接服务(如 UDP,不保证可靠性)。

网络协议类似于人类社会的礼仪。例如,询问时间需要遵循“打扰一下”、“请问几点了”、“谢谢”这样的消息交换顺序和格式。网络协议同样规定了计算机之间通信的消息格式、顺序和动作。

我们常用时序图来可视化协议交互过程。在时序图中,参与方沿垂直时间线排列,箭头表示消息的发送与接收,直观展示了协议中消息的交换顺序。

网络边缘与网络核心 ⚙️

了解了互联网的概貌后,我们现在将其主要组成部分分为两大类:网络边缘和网络核心。

网络边缘指的是位于网络外围、运行应用程序的终端设备。它们可以是客户端(如你的笔记本电脑),也可以是服务器(如 Zoom 的服务器)。应用程序在此产生或消费网络数据。常见的计算模型包括客户端-服务器模型(如网页浏览)和对等网络模型(如某些文件共享应用)。

网络为边缘的应用程序提供通信服务。面向连接服务(如 TCP)在数据传输前需要进行“握手”以建立连接,提供可靠的数据传输。无连接服务(如 UDP)则直接发送数据,不保证可靠性,但开销更小。

网络核心是连接网络边缘的中间部分,主要由路由器构成。路由器是专用计算机,其核心任务是根据数据的目的地,通过复杂的互连链路将数据从源主机转发到目标主机。

数据在网络核心的传输主要有两种方式:电路交换和分组交换。

电路交换(如传统电话网络)在通信前需建立一条专用的端到端物理或逻辑电路。该电路在整个通信期间独占分配到的资源(如带宽),性能有保障。资源分配可通过频分复用(将总带宽划分为多个频段)或时分复用(将时间划分为固定时隙,轮流使用全部带宽)实现。

分组交换是现代互联网采用的方式。数据被分割成一个个分组。每个分组独立在网络中传输,共享链路资源。分组在路由器处需要被完整接收、存储,然后根据路由信息转发到下一跳,这被称为存储转发。由于资源是共享的,当多个分组竞争同一输出链路时,会产生排队时延拥塞,这是一种统计复用

计算一个长度为 L 比特的分组通过一条传输速率为 R 比特/秒的链路所需的时间,公式为:
传输时延 = L / R

本节课中我们一起学习了课程的基本框架、互联网的定义与两种理解视角,并深入探讨了网络的两个关键部分:运行应用程序的网络边缘和负责数据转发的网络核心。我们还对比了过时的电路交换和现代主流的分组交换技术。在接下来的课程中,我们将对这些概念进行更细致的剖析。

2:网络架构

概述

在本节课中,我们将学习网络延迟与丢包的原因,并深入探讨计算机网络的分层架构模型。我们将了解数据包在网络中传输时经历的四种延迟,并学习如何使用traceroute工具进行测量。最后,我们将介绍OSI七层模型和实际使用的五层TCP/IP模型,理解每一层的职责和它们如何协同工作。


论文评述流程说明

上一节我们介绍了课程的基本情况,本节中我们来看看论文评述的具体要求和目的。

你们已经提交了第一篇论文评述。这意味着你们阅读了课程的第一篇论文。希望你们喜欢它。这是一篇相当不错的早期计算机网络论文。David Clark撰写的任何文章都有人发表。

这是我的论文评述。我想指出几点。

首先,我写了一个贡献声明。贡献声明以粗体开头,说明这篇论文为何重要,以及为何要阅读它。每当你阅读一篇论文时,都应该思考“我为什么要读这篇论文?它的贡献是什么?”。

其次,我列出了三个重要观点。这些观点不要求与我的完全一致。关键是你需要找到论文中合理的、可以辩护为真正重要的观点。这能表明你认真阅读了论文,而不是随机选取段落进行描述。

然后,我提出了一两个问题或评论。这些是可以在课堂上合理提出的问题。例如,从今天的视角看,关于网络设计的安全性问题就是一个很好的提问。

我还包含了足够的参考文献信息,以便日后查找或引用这篇论文时无需额外工作。我使用了BibTeX格式,它方便集成到论文写作中。课程网站上提供了BibTeX条目,你们可以复制使用。


进行论文评述的原因

以下是进行论文评述的原因。

显然,我认为有些论文对你们很重要。论文评述是一种直接的方式,能促使你们阅读这些论文,尤其是在课前阅读,而不是等到考试前夜。同时,提出问题有助于课堂讨论。

我也希望你们思考这个问题:你们正开启研究生生涯。有些人可能会继续攻读博士学位。思考如何处理论文是值得的。

我曾在卡内基梅隆大学读研。我花了很多时间阅读论文。起初,我在论文边缘做笔记。后来,我开始在论文顶部钉上索引卡来记录笔记。但当我开始撰写自己的第一篇论文时,我发现自己几乎需要重读所有论文来查找某个观点。这很糟糕。

论文评述的一个不太明显的目的,是让你们思考如何管理知识。你们将通过阅读论文来学习。有些知识会记住,但那些需要精确引用的内容不能只靠记忆。你们需要一个流程来存储和检索这些知识。

想象一下,作为博士生读了五年论文后撰写毕业论文,你绝不希望面对一堆论文却找不到需要引用的实验数据。你们应该建立一个易于检索知识的流程。


我个人的论文管理流程

以下是我个人总结并沿用至今的流程。这只是一个例子,你们应该思考适合自己的流程。

我阅读的每一篇论文,都会确保获取PDF版本。PDF保存在名为“Papers”的文件夹中,并以第一作者的姓氏和年份命名(例如 Clark88.pdf)。

然后,我会撰写一篇评述,就像你们昨晚为Clark 88论文做的那样。评述保存在“Papers”文件夹下的“reviews”子目录中。每个评述都是一个BibTeX文件(例如 Clark88.bib)。

在这个文件中,包含BibTeX引用、贡献声明、重要观点。我通常会复制粘贴论文摘要。然后注明阅读原因(例如“为14-740课程阅读”)。

这些文本文件易于搜索。如果多年后我想起在高级操作系统课上学过一篇好论文,我可以通过关键词搜索找到它。我也可以搜索所有关于软件定义网络的论文,因为在贡献声明、重要观点或摘要中会包含相关关键词。

关键在于,这个过程必须快捷。如果读论文花一小时,写评述再花一小时,你们可能就不会坚持写评述了。这应该是一个几分钟就能完成的快速流程。这个流程对我很有效,我已经坚持了20年。

记住,我不是要求你们完全照做。我要求你们必须完成的部分是:创建一个包含参考文献引用、贡献声明和重要观点的文件。我要求你们这样做,部分是为了启动你们自己的知识管理流程。也许有更适合你们的笔记应用。关键是建立一个对你们有效的流程。

关于论文评述有任何问题吗?


回顾与继续:分组交换网络

在我们开始今天的内容之前,记得上节课我们没有完全结束。让我们先完成剩下的部分。

我们讨论了网络和一些基本概念。我们讲到了分组交换网络的概念。

我们说分组交换网络不提供带宽保证。它们不使用频分复用或时分复用技术来分配资源,因为它们无法提供保证。

分组交换使用一种称为统计复用的技术。这意味着当数据包到达路由器时,路由器会尽其所能发送它们。没有关于谁能获得多少带宽的精确保证,只能做出基于统计的保证(例如,在假设其他竞争用户行为的前提下,平均能获得多少带宽)。

路由器通常尽可能公平地发送数据包。我们将在课程后续讨论具体细节。


存储转发网络与传输时间

分组交换网络也是存储转发网络。

当一个数据包通过线路发送,并在路由器被接收时,整个数据包必须被路由器完全接收。路由器在处理该数据包之前,必须存储它。

路由器会检查错误(这涉及一些计算),并查找地址以决定数据包的去向。路由器通常有多个输出接口,它需要决定数据包应通过哪个接口发送,以及到达目的地的最快路径。

因此,路由器必须先存储数据包并对其进行处理,然后才能转发。假设数据包长度为 L 比特,链路带宽为 R bps。那么,将数据包完全发送到链路上需要 L/R 秒。路由器存储后转发到下一跳,又需要 L/R 秒。

让我们看一个数值例子。

假设我有一个 7.5 Mb 的文件(网络传输以比特每秒衡量)。我想将它从左边的计算机发送到右边的计算机,中间经过两个路由器作为网络核心。

所有链路的带宽都是 1.5 Mbps。我们暂时忽略其他因素。

如果我们将其作为单个数据包发送,时间是多少?

将数据包放到链路上需要 L/R 时间。L = 7.5 Mb, R = 1.5 Mbps。计算得出需要 5 秒。

网络中有三跳(源主机->路由器1, 路由器1->路由器2, 路由器2->目的主机)。每次转发都需要 L/R 时间。因此总时间为 3 * 5秒 = 15秒

这看起来非常糟糕。7.5 Mb并不是一个大文件。如果跳数增加,时间会线性增加,每跳增加5秒。


分组传输的优势

我们假设整个文件必须在一个数据包完全发送后才能开始发送下一个。但这是存储转发网络的要求吗?数据包在第二跳开始传输之前,必须先在路由器完全接收。

解决方法是:不需要将整个文件作为一个数据包发送

假设我将7.5 Mb文件分割成5000个数据块(即数据包)。每个数据包大小为 1500比特(这是一个合理的数据包大小)。

现在,发送一个数据包的时间是多少?仍然是 L/R,但L现在是1500比特,R是1.5 Mbps。计算得出需要 1毫秒

这个数据包同样需要经过三跳,所以单个数据包端到端延迟是 3毫秒

关键点在于:第二个数据包可以在第一个数据包到达目的主机之前就开始传输

当第一个数据包到达第一个路由器时,路由器开始转发它。同时,源主机可以开始发送第二个数据包。这样,时间就重叠了。

第一个数据包在3毫秒时到达目的主机。
第二个数据包将在第4毫秒到达(因为当第一个数据包到达时,第二个数据包刚到达第二个路由器,只需再传输1毫秒)。
第三个数据包在第5毫秒到达。

以此类推。总共有5000个数据包。整个文件的传输时间是:第一个数据包的端到端时间(3毫秒),加上剩余4999个数据包各1毫秒的间隔时间。

总时间 ≈ 3毫秒 + 4999 * 1毫秒 ≈ 5.002秒。这比15秒好得多。

如果跳数增加到4跳呢?总时间只会增加大约1毫秒(因为每个数据包每跳增加1毫秒传输时间),而不是像单一大包那样每跳增加5秒。

这就是为什么我们将大数据分割成小数据包进行传输。存储转发的特性使得我们能够获得这种性能提升,让我们可以构建更大规模的网络而不会导致速度急剧下降。


分组交换 vs. 电路交换

电路交换为每个用户提供带宽保证,这听起来很好。

但从网络运营商的角度看,这并不理想。假设有一组用户共享一个路由器的出口带宽。他们可以通过电路交换或分组交换来共享。

如果使用电路交换,每个用户获得固定保证(例如每人100 Kbps)。如果链路总带宽为1 Mbps,那么最多只能支持 10个用户,因为需要保证每个人的带宽。

但我们的网络活动通常具有突发性。例如,你撰写电子邮件的时间远长于发送它的时间。这意味着,大部分时间里,保证的带宽被浪费了。在电路交换中,你无法将空闲带宽分配给其他用户,因此无法支持第11个用户。

在分组交换中,由于没有硬性保证,当一个用户不使用带宽时,其他用户可以使用它。因此,实际上可以支持更多用户。

在这个场景中,假设每个用户只有10%的时间活跃使用网络。通过计算可以得出,即使支持40个用户,所有用户同时需要网络的概率也低于0.1%。这相当不错。

这就是分组交换的优势所在。当然,它也有代价。

分组交换的弊端在于拥塞。有0.1%的概率,可能会出现超过10个用户同时需要网络的情况。当这种情况发生时,带宽无法同时满足所有人,有些用户的数据包必须等待。这会导致延迟丢包。我们将在今天的课程中探讨这些。


上节课学习目标回顾

我为每节课都设定了学习目标,并放在幻灯片、网站和测验学习指南中。这是检查你是否掌握了本节课要点的方法。

从上一讲中,你应该学会:

  • 如何从“螺母与螺栓”的角度思考网络(即网络组件)。
  • 能够描述什么是协议及其在互联网中的应用。
  • 能够区分网络边缘和网络核心的设备。

这很重要,因为测验题目将基于这些学习目标来设计。


网络延迟的四种类型

现在,让我们开始今天的主要内容。首先讨论分组交换网络引起的延迟和丢包。

数据包为什么不能瞬间到达目的地?在路由器中,有四种主要操作会导致数据包延迟。

我们需要分析数据包到达路由器后经历的这四个阶段。

1. 处理延迟
路由器需要进行一些处理:消耗CPU周期进行计算。许多操作由硬件加速,但仍需时间。主要任务包括:

  • 检错:使用校验和或循环冗余校验等技术,确保比特在传输过程中未被改变。
  • 查找输出接口:路由器有多个输出接口(例如96个)。它需要查看数据包头部信息,决定数据包应从哪个接口发出(例如,“这个数据包要去南达科他州,走14号接口”)。

此外,可能还有其他处理(如深度包检测)。这些都计入处理延迟。

2. 排队延迟
确定数据包要去的接口(例如“北达科他州”)后,可能已有其他数据包也要去往同一接口。这意味着路由器处发生了拥塞,当前数据包必须等待

路由器为每个输出接口分配了内存(缓冲区)来存储等待发送的数据包。数据包进入队列,排队等待轮到它被发送。从进入队列到开始传输的这段时间就是排队延迟

排队延迟可能为零(如果无其他数据包竞争),也可能很长(如果突然有很多数据包涌向同一接口)。

3. 传输延迟
当数据包到达队列头部时,路由器开始将其比特流发送到链路上。这就是我们一直讨论的 L/R

  • R(带宽) 由链路技术决定(例如,以太网标准规定了形成每个比特所需的时间)。
  • L(数据包长度) 是数据包的比特数(例如1500比特)。

传输延迟就是将L个比特推到链路上所需的时间。

4. 传播延迟
数据包离开路由器后,需要沿物理链路传播到下一个路由器。这与传输延迟不同。

  • 传输延迟取决于链路技术和数据包大小(将比特推入链路的时间)。
  • 传播延迟取决于链路的物理长度(距离)和信号在介质中的传播速度。

例如,你可以有短以太网线或长以太网线。即使以相同的“以太网速度”发送,信号穿过长电缆所需时间也更长。传播速度通常是光速的很大比例(例如在光纤中)。传播延迟的计算公式是:距离 / 传播速度

总延迟(节点延迟) 是这四种延迟之和:节点延迟 = 处理延迟 + 排队延迟 + 传输延迟 + 传播延迟

  • 处理延迟:通常很短(微秒级)。路由器是高性能专用设备。
  • 排队延迟:变化最大,可以从0到数毫秒,取决于队列中的拥塞程度(即你前面有多少数据包)。
  • 传输延迟:由技术决定。随着技术发展(如从10 Mbps到100 Mbps以太网),该延迟显著降低。
  • 传播延迟:取决于距离。跨房间很短,到低轨道卫星则很长。

数据包丢失

路由器内存有限。如果队列变得太大,无法容纳更多数据包,就会发生丢包。通常,路由器会丢弃新到达的数据包(尽管也有其他策略)。

近年来内存变得廉价,路由器拥有大容量内存,这导致了另一个问题——“缓冲区膨胀”:队列总是很长,数据包经历长时间排队。有时,丢弃一些数据包以清空队列反而更好。这是高级网络课程的话题。


排队延迟与流量强度

另一种理解排队延迟的方式是考虑流量强度。

数据包以一定速率到达(λ,长期平均到达率,单位:数据包/秒)。路由器以服务速率μ(单位:数据包/秒)处理它们。服务速率μ与传输延迟相关,μ ≈ R/L。

流量强度定义为:流量强度 = λ / μ = λ * (L/R)

下图(示意性图表,Y轴为延迟,X轴为流量强度)表明,当流量强度过大时,会发生糟糕的情况。

如果流量强度 > 1,意味着数据包到达速率超过处理速率,工作会不断堆积,延迟将变得非常长(许多数据包可能永远得不到服务)。

即使流量强度接近但小于1,由于到达的随机性(突发流量),延迟也会急剧增长(呈现渐近关系)。因此,你希望系统的处理能力远高于平均工作量。


测量网络:Traceroute

网络是动态的,尤其是在长距离多跳路径上。我们可以使用 traceroute 工具进行测量。许多同学可能用过它。

traceroute 可以测量从你的计算机到某个目的地之间,每一跳的延迟。它采用简单的算法:探测到达第一跳、第二跳、第三跳……所需的时间。

它通过发送探测数据包来实现。默认发送3个探测包。它发送目的地为目标地址的数据包,但设置一个“生存时间”字段,要求第N跳的路由器在收到数据包后向源主机发送一个通知(ICMP超时消息)。通过测量从发送探测包到收到回复的时间,可以估算到第N跳的延迟。

需要注意的是,网络是动态的。此时测量的结果下一刻可能就变了。我们假设往返时间的一半是去的延迟,但路由器回复本身也可能有延迟。随着跳数增加,数据包去和回的路径也可能不同。甚至探测第N跳的数据包可能没有经过第N-1跳(因为路径动态变化)。因此,我们得到的是平均意义上的近似值。


Traceroute 实例分析

这是一个从我办公室到日本某Web服务器的 traceroute 输出示例(之前有日本学生时使用的服务器)。命令是:traceroute www.sfc.keio.ac.jp

输出显示,到日本需要 24跳

  • 第一跳是 HH130-router,很可能在Hamerschlag Hall(我办公室所在楼),延迟约382微秒。第一次测量值通常较大,因为需要将网络栈加载到缓存等,后续测量(378微秒)更准确,两者差异在测量误差内。
  • 第二跳是 POD-A-WAN-HALL 路由器。
  • 第三跳显示为星号(*),表示没有收到回复。通常是因为路由器被配置为不回复此类探测(出于错误的安全考虑)。
  • 在第12跳到第13跳之间,延迟从约8毫秒跃升至67毫秒。查看路由器名称,第12跳可能在弗吉尼亚州(NV-A-O2),第13跳可能在洛杉矶(LA)。这很可能是横跨美国的链路。
  • 在第15跳左右,延迟从67毫秒跃升至177毫秒,路由器名称显示在大阪(Osaka)。这很可能是跨太平洋的链路。
  • 第19跳显示了一个有趣现象:它列出了两个不同的IP地址和延迟值(187ms和176ms)。这可能是因为路径在探测过程中发生了变化,或者第19跳路由器故障,网络将流量导向了另一台路由器。
  • 最终,经过24跳到达日本目的地,延迟约175毫秒。

这很酷:24跳意味着至少24台路由器协同工作,将我的数据包送到日本。延迟跨越了三个数量级(从微秒到百毫秒)。网络系统的一个奇妙之处在于,它能在小规模和大规模下都良好工作,拥有很大的动态范围。大多数工程系统(如汽车)无法在三个数量级的速度范围内都运行良好。

如果你经常使用 traceroute,我推荐改进工具 mtr。标准 traceroute 是顺序发送探测包,而 mtr 持续向路径上所有路由器发送探测,能更好地反映网络整体状况。Windows上也有 WinMTR


网络架构:分层模型

如此复杂的网络是如何构建的?有大量移动部件:路由器、协议、应用程序。更重要的是,涉及许多不同的参与者(运营商、机构),没有单一的公司或政府实体控制整个网络。例如,卡内基梅隆大学有自己的IT部门管理自己的网络。

这么多不同的参与者如何协同工作?如何组织网络,将所有部件整合在一起?这是一个架构问题。

架构是关于如何将组件组合起来解决问题。就像建筑学组合楼梯、走廊、房间来建造大楼一样,我们需要用协议和应用程序将路由器、组织等组合起来,这就是网络架构。

采用的架构是分层架构。分层架构是组织系统组件的一种特定方式。

分层架构将组件放入不同的层,并堆叠起来。关键在于:每一层都为其上层提供服务

底层的蓝色层提供“蓝色”服务。绿色的上一层需要“蓝色”时,就向它请求。绿色层使用蓝色服务,通过

3:设计原则

概述

在本节课中,我们将学习互联网的设计原则。我们将回顾网络的分层架构,并通过一个详细的示例来理解数据如何在各层之间传递。接着,我们将探讨构建互联网时遵循的核心设计理念,包括“端到端原则”和“命运共享”等关键概念。


回顾分层架构

上一节我们介绍了网络的分层架构模型。这个模型是理解网络通信的基础。为了更清晰地理解数据如何在各层间流动,我们将通过一个发送推文的示例来演示整个过程。

以下是数据从发送端应用层到接收端应用层的传递步骤:

  1. 应用层:发送端的推特客户端生成一条消息“Hello World!”。应用层将此消息交给传输层,并指定目标(推特服务器上的推特应用)。
  2. 传输层:传输层将消息分割成适合传输的。例如,将“Hello World!”分成“Hello ”和“World!”两段。它为每个段添加头部信息,包括目标应用和序号(如“1/2”、“2/2”)。
  3. 网络层:网络层将每个封装成。它在包的头部写入目标主机的硬件地址(如推特服务器的IP地址),以便在网络中路由。
  4. 数据链路层:数据链路层将封装成,以便在物理链路上传输(如Wi-Fi或以太网)。它计算校验和(例如,通过算法得出帧“颜色”为白色),并将帧交给物理层。
  5. 物理层:物理层将帧转换为电磁信号,通过物理介质(如网线、无线电波)发送出去。
  6. 接收端处理:在接收端(推特服务器),过程反向进行:
    • 物理层接收信号,重建为帧。
    • 数据链路层检查帧的校验和(计算帧“颜色”是否为白色),确认无误后提取出包,交给网络层。
    • 网络层检查包的目标地址,确认是本机后,提取出段,交给传输层。
    • 传输层根据段的序号(1/2, 2/2)将数据重新组装成完整的消息“Hello World!”,并根据头部信息将其递交给正确的应用(推特服务器应用)。

这个演示说明了分层架构如何通过各层的协作,最终实现端到端的应用间通信。


互联网的设计目标与原则

理解了数据流之后,我们来看看构建互联网时遵循的设计哲学。这些原则深刻影响了TCP/IP协议族的形态。

核心目标:互联现有网络

互联网设计的根本目标是互联已有的、异构的网络(如军方的不同网络、各大学的网络),而不是从头创建一个全新的统一网络。这一目标决定了其架构必须足够灵活和包容。

关键设计原则

以下是实现核心目标过程中形成的一些关键原则:

  • 命运共享与无状态核心:这是关于网络可靠性的设计选择。与其在网络内部的路由器上维护通信状态(哪种方法复杂且脆弱),不如将状态(如哪些数据包已确认接收)保存在通信的终端主机上。这样,即使中间的路由器出现故障,只要终端主机还在运行,通信就能恢复。这被称为“命运共享”,同时保持了网络核心(路由器)的简单和高效。
  • 支持多种服务类型:网络需要支持不同类型的应用。例如,文件传输需要可靠、有序的数据交付(由TCP提供),而音视频流则能容忍少量丢失,但不能接受重传带来的延迟(由UDP提供)。因此,传输层被设计为可插拔的,允许不同协议共存。
  • 分布式管理:互联网由众多独立管理的网络(自治系统)组成。没有单一中央机构控制所有路由。网络间通过协议(如边界网关协议BGP)交换路由信息,实现全球互联。这种设计赋予了互联网强大的扩展性和韧性。
  • 端到端原则:这一由Saltzer等人提出的著名论点指出,某些功能(如可靠传输、加密)如果在应用层实现就足够了,那么最好将其放在终端主机上,而不是在网络内部的底层(如链路层或网络层)实现。这避免了功能重复,简化了网络核心,并更利于创新(因为更新终端软件比升级所有路由器容易得多)。当然,出于性能优化考虑(如在丢包率高的无线链路上进行链路层重传),也存在例外。

总结

本节课我们一起学习了互联网的设计原则。我们通过一个端到端的数据传输示例,巩固了对分层架构的理解。随后,我们探讨了互联网设计的核心目标——互联异构网络,并深入分析了由此衍生出的关键原则:命运共享保持了网络核心的简单;支持多种服务类型催生了TCP和UDP;分布式管理实现了网络的规模扩展;而端到端原则则在功能放置上提供了重要的设计指南。这些原则共同塑造了当今互联网强大、灵活且可扩展的架构基础。

4:ISP、骨干网与对等互联

在本节课中,我们将学习互联网的商业层面,了解互联网服务提供商、骨干网以及它们之间如何通过“传输”和“对等互联”等商业关系连接起来,共同构成我们每天使用的全球互联网。

上一节我们介绍了互联网的分层架构和设计目标。本节中,我们来看看构成互联网的各个商业实体是如何组织和交互的。

互联网的层级结构

互联网并非由单一实体运营,而是由众多独立的网络(称为自治系统)相互连接而成。这些网络的所有者就是互联网服务提供商。它们主要分为几个层级。

以下是主要的ISP层级:

  • 一级ISP:它们是最大的网络运营商,拥有广泛的国际或区域覆盖。一级ISP的关键特征是:它们与同一区域内的所有其他一级ISP建立对等互联关系,且不向任何其他网络支付传输费用。例如美国的AT&T、Verizon等。
  • 二级ISP:它们是规模较小的区域性或国家级网络运营商。二级ISP通常需要向一级ISP购买传输服务以获得全球连通性。同时,为了节省成本和提升性能,它们会积极地与其他二级ISP或大型内容提供商建立对等互联
  • 内容提供商:这类公司(如谷歌、Facebook)主要生产内容或服务,而非运营网络。其中,规模大、技术能力强的公司(“复杂的大型参与者”)会建立自己的网络并积极与其他网络对等互联,以降低成本和改善用户体验。规模较小的公司则通常直接向ISP购买连接服务。

商业关系:传输与对等互联

网络之间通过两种主要的商业接口进行连接。

传输关系

这是一种客户-提供商关系。客户(如二级ISP、企业、家庭用户)向提供商(如一级ISP)支付费用,以换取将其数据包传输到互联网任何地方的服务。公式可以简单表示为:
客户支付金钱 -> 提供商传输数据包

对等互联关系

这是一种大致平等的互惠关系。当两个网络之间交换的流量大致平衡时(经验法则是流量比例在1:4到4:1之间),它们会选择对等互联。在这种关系下,双方互相传递流量,但没有金钱交易。公式可以表示为:
网络A发送流量给网络B <-> 网络B发送流量给网络A,且 金钱交换 = 0

对等互联能显著降低双方的运营成本(避免向上级ISP支付传输费),并通常能提高互访流量的性能。

物理连接方式:如何实现互联

网络之间除了商业协议,还需要物理连接。主要有两种方式。

以下是两种主要的物理互联方式:

  • 公共对等互联:通过互联网交换点实现。IXP是一个中立的物理场所,多家网络运营商在此放置路由器并相互连接。任何接入IXP的网络都可以方便地与同样接入该IXP的其他网络建立对等互联。这就像是一个“网络集市”。
  • 私有对等互联:两个网络通过租赁或铺设专线直接连接,不经过IXP。这种方式可能出于成本(如双方地理位置很近)、安全或性能控制等考虑。

网络通常会混合使用公共对等互联、私有对等互联以及通过接入点(POP,网络服务提供商设置的本地接入设施)连接终端用户,以最优化其网络运营。

市场演变与趋势

互联网的商业格局一直在演变。自20世纪90年代初美国国家科学基金会网络(NSFNET)商业化以来,传输价格随着技术进步和规模效应急剧下降。同时,流量需求(尤其是视频和大型内容提供商产生的流量)爆炸式增长。

一个重要趋势是,大型内容提供商越来越多地建立自己的网络并广泛参与对等互联,这减少了对传统一级ISP传输服务的依赖,改变了流量和资金的流动模式。

本节课中我们一起学习了互联网背后的商业生态。我们了解了构成互联网骨干的一级和二级ISP,以及连接它们的两种核心商业关系(传输和对等互联)。我们还探讨了这些网络如何通过IXP或私有线路进行物理连接。理解这些商业动态对于全面认识互联网如何运作、为何以当前形式演化至关重要。

5:应用层 -- HTTP

在本节课中,我们将要学习计算机网络体系结构中的应用层,并深入探讨一个核心协议:超文本传输协议(HTTP)。我们将了解应用层的使命、HTTP协议的基本工作原理、消息格式、连接管理以及缓存机制。

课程概述与提醒

在开始技术内容之前,有几个事项需要提醒大家。

  • 实验截止日期:Lab 0 将于一周后(下周二)截止。该实验主要关于使用 Wireshark 分析简单协议,帮助大家熟悉 Wireshark 工具。
  • 阅读材料:下次课程将回顾 Mockapetris 关于域名系统的论文,这是一篇了解 DNS 工作原理的必读材料。
  • 即将到来的测验:两周后我们将进行一次测验。由于无法线下进行,具体形式仍在设计中。测验将涵盖截至“排队论”讲座的所有内容。如果遇到任何困难,请及时联系助教或我。

上一节我们介绍了课程安排,本节中我们来看看有效的学习方法。

关于学习,我想强调一点:仅仅浏览幻灯片并“识别”知识点是不够的。测验要求你“生成”知识,即根据问题组织答案。因此,更有效的学习方法是主动回忆和应用知识。

以下是几种有效的学习方法:

  • 利用课程目标:针对每个课程目标,自问是否能解释或实现它。
  • 组建学习小组:在小组中互相提问和解答,模拟测验环境。例如,可以提问:“应用层的使命是什么?”或“在HTTP协议中,使用哪种数据单元?”

应用层概述

上一讲我们探讨了网络互联,现在开始深入技术层面,从应用层开始我们的旅程。我们将遵循一个固定模式:首先理解该层的理论和使命,然后研究具体协议。

那么,应用层在做什么呢?如下图所示,应用层包含了大量需要网络服务的应用程序。作为应用层,我们可以忽略下层的大部分细节,但需要利用传输层提供的服务。因此,应用开发者需要根据需求(如是否需要可靠传输)选择合适的传输层协议(如TCP或UDP)。

为了更具体地理解选择不同协议的影响,我们来看一个例子。TCP是面向连接的协议,建立连接需要额外的开销。

下图展示了一个序列图,描述了建立TCP连接、请求文件、传输数据和关闭连接的过程。可以看到,在真正传输数据之前,客户端和服务器需要额外往返一次以建立连接(SYN, SYN-ACK)。这增加了一个往返时间(RTT)的延迟。

应用层的使命与特性

现在,让我们正式定义应用层。

  • 使命:应用层的使命是提供对网络资源的访问,允许我们编写能够利用网络带宽、跨地点传输消息的程序。
  • 寻址机制:应用层需要一种方式来标识通信目标。虽然域名和URL是通用机制,但许多应用有自己特定的地址,如社交媒体账号、游戏内ID等。
  • 数据类型:应用层交换的数据单元称为消息。消息的格式完全由具体应用协议定义,内容可以是任何应用需要的数据,例如网页请求、游戏状态更新等。

HTTP协议详解

了解了应用层的基础后,我们来看一个最重要的应用层协议:HTTP。

HTTP简介与发展

HTTP(HyperText Transfer Protocol)设计用于传输超文本,是万维网的基础。它是一种请求-应答协议,遵循客户端-服务器模型:客户端(如浏览器)发出请求,服务器返回响应。

网络领域充满缩写。一个有用的规律是:许多以“P”结尾的缩写代表“协议”,如TCP、UDP、HTTP。

HTTP无处不在,从操作系统到微型控制器再到超级计算机都在使用。

HTTP的发展历程如下:

  • HTTP/1.0 (1993):初始版本,功能基本,但缺乏缓存控制,TCP使用方式不优。
  • HTTP/1.1 (1990年代末):重大改进版本。由于Web已非常普及,此版本必须考虑向后兼容性。它增加了持久连接、更好的缓存控制等特性,并存活了近二十年。
  • HTTP/2 (2015年批准):专注于优化数据传输效率,例如支持服务器推送。但它为了性能优化,在一定程度上违反了严格的分层架构原则(涉足了传输层的职责),因此我们本节课主要关注HTTP/1.1。

HTTP消息格式

任何通信协议都需要严格定义消息格式,以便发送方编码和接收方解码。HTTP使用一种称为巴科斯-诺尔范式(BNF) 的形式化语言来描述其消息格式。

HTTP消息分为两种:请求响应

一个通用的HTTP消息结构如下(BNF描述):

generic-message = start-line
                  *( message-header CRLF )
                  CRLF
                  [ message-body ]
  • start-line:起始行,对于请求和响应不同。
  • *( message-header CRLF ):零个或多个消息头,每个后面跟着回车换行符(CRLF)。
  • CRLF:一个空行,用于分隔消息头和消息体。
  • [ message-body ]:可选的消息体。

HTTP请求

请求消息是通用消息的一种特化,其起始行是请求行

请求行的BNF格式为:

Request-Line = Method SP Request-URI SP HTTP-Version CRLF
  • Method:请求方法,如GET、POST。
  • SP:空格。
  • Request-URI:请求的资源标识符,通常是我们看到的URL的一部分。
  • HTTP-Version:协议版本,如HTTP/1.1。

HTTP/1.1 定义了数十种消息头。其中,Host头是所有请求必须包含的,这使得一台物理服务器可以托管多个网站(虚拟主机)。

以下是一个HTTP请求的示例:

GET /images/logos.htm HTTP/1.1
Host: www.cmu.edu
User-Agent: Mozilla/5.0
... (其他头部)
  • 第一行是请求行:方法为GET,请求URI为/images/logos.htm,版本为HTTP/1.1
  • 后续每行是一个消息头。
  • 最后有一个空行,由于这个请求没有消息体(例如上传数据),所以到此结束。

主要的请求方法包括:

  • GET:请求获取指定资源。可以通过条件头部(如If-Modified-Since)实现条件GET,或通过Range头部实现部分GET(用于视频流等)。
  • HEAD:与GET类似,但只请求资源的元数据(头部),不返回消息体。
  • POST:向服务器提交数据(如表单内容、上传文件)。
  • OPTIONS:询问服务器支持的功能。

HTTP响应

响应消息的起始行是状态行

状态行的BNF格式为:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
  • Status-Code:三位数的状态码,表示请求结果。
  • Reason-Phrase:状态码的简短文字描述,便于人类理解。

以下是一个HTTP响应的示例:

HTTP/1.1 200 OK
Connection: close
Date: Tue, 22 Sep 2020 04:15:03 GMT
Server: Apache
Last-Modified: Mon, 21 Sep 2020 12:28:53 GMT
Content-Length: 6821
Content-Type: text/html

<!DOCTYPE html>
<html>
... (HTML内容)
</html>
  • 第一行是状态行:版本HTTP/1.1,状态码200,原因短语OK
  • 后续是各种响应头,包含了服务器信息、内容类型(Content-Type)、内容长度(Content-Length)等。
  • 空行之后是消息体,即请求的HTML文档内容。

状态码分类:

  • 1xx (信息):临时响应,表示请求已被接收,继续处理。
  • 2xx (成功):请求已成功处理。例如:200 OK
  • 3xx (重定向):需要客户端进一步操作以完成请求。例如:301 Moved Permanently
  • 4xx (客户端错误):请求包含错误或无法完成。例如:404 Not Found(请求的资源不存在)。
  • 5xx (服务器错误):服务器处理请求时出错。例如:500 Internal Server Error

HTTP连接管理与性能

一个关键概念是:每个HTTP请求只获取一个对象(一个HTML文件、一张图片、一个CSS文件等)。浏览器在解析HTML时,会发现其中引用的其他资源(如图片、脚本),然后为每一个资源发起新的HTTP请求。

在HTTP/1.0中,每个请求都使用独立的TCP连接。这导致了一系列性能问题:

  1. 连接建立开销:每个TCP连接都需要“三次握手”,增加了一个RTT的延迟。
  2. TCP慢启动:TCP为了不拥塞网络,在连接初期会缓慢增加发送速率。对于传输小文件(如网页上的许多小图标),连接可能在达到高速传输前就关闭了,无法充分利用带宽。
  3. 串行请求:浏览器通常需要等待上一个请求的响应到达后,才能发起对下一个资源的请求(因为需要解析HTML才知道还需要什么)。

因此,获取一个包含多个资源的页面总时间可能很长,模型化为:总时间 ≈ 对象数量 × (2个RTT + 传输时间)

为了解决这个问题,工程师们尝试了并行连接(同时打开多个TCP连接),但这可能导致连接间竞争资源,反而降低整体效率。

HTTP/1.1引入了持久连接作为解决方案。在持久连接中,TCP连接在完成一次请求-响应后不会立即关闭,而是保持打开状态,用于后续的多个请求。

这带来了巨大好处:

  • 消除重复握手:只需在第一个请求时建立一次TCP连接。
  • 避免慢启动惩罚:同一个连接可以持续使用,TCP的拥塞控制窗口可以保持较大值,提高后续请求的传输速度。
  • 支持管道化:客户端可以连续发送多个请求,而无需等待每个响应,服务器按顺序返回响应。这进一步减少了等待时间。

优化后的模型变为:总时间 ≈ 1个RTT(建立连接) + 对象数量 × (1个RTT + 传输时间),性能显著提升。

HTTP缓存

缓存是计算机系统中提升性能的通用策略:将之前计算或获取的结果保存起来,下次需要时直接使用,避免重复工作。

HTTP缓存主要有两种位置:

  1. 私有缓存:位于客户端,如浏览器缓存。只服务于单个用户。
  2. 共享缓存:位于网络中,如代理服务器缓存。可以服务于同一网络内的多个用户(例如,大学校园网内的所有用户)。

缓存的关键问题是一致性:当原始服务器上的资源更新后,如何保证缓存中的副本不会过时?

HTTP/1.1通过一系列头部来控制缓存:

  • 过期模型:服务器可以通过ExpiresCache-Control: max-age=头部指定资源的有效期。在有效期内,缓存可以直接使用副本,无需联系服务器。
  • 验证模型:当缓存副本过期后,缓存可以向服务器验证其是否仍有效。通过发送一个包含If-Modified-SinceIf-None-Match头部的条件GET请求。如果资源未改变,服务器返回304 Not Modified(无消息体);如果已改变,则返回200 OK和新资源。

缓存策略(如缓存空间满时替换哪个项目)由缓存实现者决定,HTTP协议只提供了验证和过期机制。

关于浏览器缓存和代理缓存的比较:

  • 浏览器缓存:离用户更近,响应速度最快,甚至可以在离线时提供资源。但只能服务于单个用户。
  • 代理缓存:可以服务于大量用户,减少从内部网络到外部网络的重复流量,节省带宽并提升整体访问速度。但响应速度通常比浏览器缓存慢。

总结

本节课中我们一起学习了计算机网络应用层的基础知识,并深入剖析了HTTP协议。

我们首先明确了应用层的使命是提供网络资源访问,并使用消息进行通信。接着,我们聚焦于HTTP协议,了解了其请求-应答模型、消息格式(包括请求行、状态行、头部、消息体)、常见的请求方法(GET、POST等)和状态码分类。

然后,我们探讨了HTTP的性能问题及其解决方案:从HTTP/1.0的短连接导致的性能低下,到HTTP/1.1引入的持久连接和管道化技术,显著减少了延迟。最后,我们学习了HTTP缓存机制,包括缓存的位置(浏览器、代理)以及通过过期和验证头部来保证缓存一致性的方法。

HTTP作为万维网的基石,其设计演进体现了在网络约束下不断优化性能的工程思想。下一讲,我们将继续探索应用层的另一个核心协议:域名系统(DNS)。

6:域名系统 (DNS) 🏷️

在本节课中,我们将学习域名系统 (DNS)。DNS 是互联网的关键组成部分,它负责将人类可读的域名(如 www.cmu.edu)转换为计算机使用的 IP 地址(如 128.2.42.52)。我们将探讨 DNS 的服务、数据结构和协议,理解它如何作为一个分布式数据库系统工作,并了解其核心功能。

上一节我们介绍了应用层及其协议 HTTP,它利用对传输层的理解来优化性能。本节中我们来看看另一个至关重要的应用层协议——DNS,它是让应用程序能够顺利运行的“粘合剂”之一。

DNS 概述与背景

DNS 是一个地址转换协议。我们需要认识到,网络协议栈的每一层都有自己的地址格式。例如,应用层有 URL 和域名,传输层有端口号,网络层有 IP 地址,数据链路层有 MAC 地址。这些地址的设计都是为了满足其所在协议层的特定需求,因此不存在一个通用的“万能地址”。这意味着数据在不同层之间传递时,经常需要进行地址转换,DNS 就是完成这种转换的关键服务。

对于人类用户而言,使用名称(如域名)比使用数字(如 IP 地址)更加直观和方便。名称是人类可读的字符串,但计算机更倾向于处理数字标识符。因此,DNS 的核心任务就是在域名和 IP 地址之间进行映射。

DNS 这个术语在不同语境下可以指代三件事物:

  1. 服务:提供域名到地址映射的目录服务。
  2. 数据:一个庞大的、分布式的数据库系统,存储着全球的域名信息。
  3. 协议:用于查询和响应这些信息的通信规则。

DNS 历史悠久,早在万维网出现之前就已存在,用于支持早期的互联网服务(如电子邮件、文件传输)。其设计规范最初由 RFC 1034 和 RFC 1035 定义,至今已扩展出数百个相关 RFC,以应对新的需求和安全挑战。

DNS 的核心功能

DNS 的核心使命是将域名映射为 IP 地址。例如,查询 www.ini.cmu.edu 会返回对应的 IP 地址。

此外,DNS 还提供其他重要功能:

以下是 DNS 的主要功能列表:

  • 别名:允许为一个实体设置多个名称。正式名称称为规范名,其他名称称为别名。例如,CMU 官网的真实服务器名可能很长,但我们可以通过别名 www.cmu.edu 轻松访问。
  • 邮件服务器定位:DNS 可以查询组织的邮件交换服务器地址。当发送电子邮件到 someone@andrew.cmu.edu 时,邮件系统会通过 DNS 查找负责处理 andrew.cmu.edu 邮件的服务器列表。
  • 负载分发:DNS 协议内置了简单的负载均衡机制。当为一个服务(如 Web 或邮件服务器)配置多个后端服务器地址时,DNS 服务器在响应查询时会轮转这些地址的顺序,从而将用户请求分散到不同的服务器上。

DNS 协议机制

DNS 采用简单的查询-应答机制。客户端发送一个查询问题,服务器返回一个应答。

DNS 消息通常通过 UDP 协议在 53 号端口 发送。这是一个关键的设计决策。虽然 TCP 提供可靠性,但 DNS 选择 UDP 主要出于对低延迟的考虑。DNS 查询通常是短暂的、一次性的交互,如果使用 TCP 需要经历三次握手建立连接,会引入额外的延迟。对于全球性的基础服务,降低每次查询的延迟至关重要。当然,当传输的数据量很大(如区域传输)或响应报文超过 UDP 承载能力时,DNS 也会使用 TCP。

DNS 查询和应答报文共享基本相同的格式。报文中包含一个标识字段、一些标志位(其中一位指明是查询还是应答)、问题部分、应答部分、权威部分和附加信息部分。

总结

本节课中我们一起学习了域名系统。我们了解到 DNS 不仅仅是一个简单的“电话簿”,它是一个复杂的分布式数据库系统,提供域名到 IP 地址的映射、别名支持、邮件服务器定位和负载分发等功能。其协议基于高效的查询-应答模型,并主要使用 UDP 传输以追求低延迟。理解 DNS 的工作原理对于理解互联网如何将人类友好的名称转换为机器可路由的地址至关重要。

7:对等网络 (P2P) 🖥️

在本节课中,我们将要学习对等网络的基本概念、工作原理以及其发展历程。我们将从早期的集中式对等网络开始,逐步探讨其向分布式和结构化网络演化的过程,并分析每种架构的优缺点。

概述

对等网络是一种应用层网络架构,其中所有参与节点(称为“对等体”)可以直接相互通信和共享资源,而无需依赖中心服务器。这与我们之前讨论的客户端-服务器模型有显著不同。对等网络常用于文件共享、内容分发、分布式计算等场景。

什么是P2P网络?

到目前为止,我们讨论的系统大多使用客户端-服务器通信模型。例如,Web客户端向Web服务器请求信息,DNS客户端向域名服务器查询记录。在对等网络中,没有中心服务器。所有计算机(对等体)都能直接相互通信。

核心概念:在P2P网络中,每个节点既是资源的消费者,也是资源的提供者。

这种模型的优势在于无需支付和维护中心服务器的成本,并且可以利用大量对等体的闲置资源(如存储空间、带宽、计算能力)。

注意:这里的“对等体”一词与之前课程中提到的ISP对等或公共对等点概念无关,这是该词的第三种用法。

为何使用P2P网络?

对等网络通常用于利用对等体自身拥有的资源。以下是几个主要原因:

以下是P2P网络的一些典型应用场景:

  • 文件共享:对等体贡献出部分硬盘空间,共同存储海量文件。
  • 带宽共享:利用众多对等体的上传带宽来分发内容,减轻单一服务器的压力。
  • 计算资源共享:利用对等体闲置的计算能力进行分布式计算。
  • 匿名性:通过众多对等体转发请求和响应,可以隐藏用户的真实身份(这也可能被用于恶意目的,如僵尸网络)。
  • 边缘性/低延迟:将内容存储或缓存在靠近用户的对等体上,可以降低访问延迟。

然而,P2P网络也面临挑战:对等体可能随时加入或离开网络(称为“流失”),资源可能变得不可用。此外,一些对等体可能“作弊”,即享受服务但不贡献资源,网络协议需要设计机制来检测和抑制这种行为。

P2P网络架构的关键问题

在设计P2P网络时,需要考虑几个关键问题:

  1. 数据放置:数百万个文件如何在对等体之间存储和分布?
  2. 数据发现(元数据管理):如何查找和发现哪个对等体拥有我想要的文件?
  3. 信令协议:对等体之间如何发送消息进行通信?协议格式是什么?是否加密?
  4. 文件传输:找到拥有文件的对等体后,如何建立机制来实际传输文件内容?

文件传输通常使用现有协议,如HTTP。这意味着对等体需要能够像服务器一样响应HTTP请求,这是P2P与纯客户端-服务器模型的一个关键区别。

覆盖网络的概念

在讨论P2P网络时,我们通常会绘制一个图,其中节点代表对等体,连线代表它们之间的通信关系。这个逻辑上的通信结构被称为覆盖网络

重要提示:覆盖网络是逻辑上的。实际的通信仍然需要通过底层的互联网基础设施(路由器、链路等)进行。从分层角度看,P2P网络是应用层协议,它利用传输层(如TCP)和网络层(IP)来实现覆盖网络中的逻辑连接。


上一节我们介绍了P2P网络的基本概念和挑战,本节中我们来看看P2P网络的具体发展历程,从第一代集中式架构开始。

第一代:集中式对等网络 (Napster) 🎵

Napster(1999年)是第一代P2P网络的代表。它引入了一个关键创新:集中式目录,分散式数据传输

工作原理

  1. 对等体启动Napster客户端时,会连接到一个中心目录服务器,并上报自己拥有的文件列表。
  2. 当用户A想搜索文件时,向中心服务器发送查询。
  3. 中心服务器检索目录,返回拥有该文件的对等体(例如用户B)的地址。
  4. 用户A根据返回的地址,直接与用户B建立连接,并使用类似HTTP的协议下载文件。

优点:搜索效率高,因为所有元数据(文件位置信息)集中在服务器。
缺点:存在单点故障、性能瓶颈和法律风险。中心服务器成为系统的脆弱点和攻击目标,Napster最终也因此被起诉而关闭。


集中式架构的缺陷促使了下一代完全分布式P2P网络的出现。

第二代:非结构化对等网络 (Gnutella) 🌐

Gnutella的设计目标是完全去中心化,以规避Napster面临的法律和单点故障问题。在Gnutella网络中,目录功能也由对等体自身完成

引导问题

在一个完全分布式的网络中,新节点如何发现并加入网络?这被称为“引导问题”。Gnutella的解决方案是:客户端软件在下载时内置一个初始对等体列表。新节点启动后,尝试连接列表中的对等体,直到成功加入网络。

查询泛洪

Gnutella使用“查询泛洪”机制来搜索文件:

  1. 搜索者向其所有邻居对等体发送一个查询消息。
  2. 每个收到查询的对等体检查自己是否有该文件。如果有,则沿着原路径返回一个“查询命中”消息。
  3. 同时,该对等体(除非达到限制)会将查询消息转发给它的所有邻居(除了发送者)。
  4. 这个过程像洪水一样在网络中扩散。

为了控制泛洪的范围和避免环路,Gnutella引入了有限范围查询泛洪。查询消息带有一个 TTL(生存时间)字段,每经过一跳就减1,当TTL减为0时,不再转发。

优点:完全分布式,无中心点,抗打击能力强。
缺点

  • 可扩展性差:随着网络规模增大,泛洪消息会消耗大量网络带宽和节点资源。
  • 搜索不保证成功:如果目标文件只在距离搜索者TTL跳数范围之外的对等体上,则无法找到。这被称为“大海捞针”问题。

非结构化网络的搜索效率问题催生了需要更智能结构的下一代P2P网络。

第三代:结构化(分层)对等网络 (KaZaA) 🏗️

KaZaA引入了层次化结构来解决搜索效率问题,这是工程师面对规模问题时常用的“超级武器”。

网络结构

  • 超级节点:能力较强(带宽高、在线稳定)的对等体,负责维护元数据和路由。
  • 普通节点:能力较弱的对等体,连接到某个超级节点,构成一个集群。

工作原理

  1. 普通节点加入时,连接到某个超级节点,并上报其文件列表。
  2. 当普通节点A搜索文件时,向其连接的超级节点S1发送查询。
  3. S1先在本地集群(包括它自己和其下属的普通节点)中查找。
  4. 如果未找到,S1代表A向其他超级节点转发查询。
  5. 其他超级节点在其各自集群中查找并回复。
  6. A从返回的多个结果中选择一个源,直接建立连接下载文件。

优点

  • 搜索效率高:一次查询可以搜索整个集群。
  • 可扩展性好:层次结构限制了查询消息的传播范围。
  • 利用了网络异构性:让能力强的节点承担更多责任。

相关研究:你阅读的论文对KaZaA网络进行了测量研究,试图逆向工程其协议。研究发现网络动态性很强(连接持续时间短),超级节点间连接稀疏,普通节点倾向于选择延迟较低的超级节点进行连接。

Skype:P2P在VoIP中的应用

KaZaA的创始团队后来开发了Skype。早期Skype也使用了类似的层次化P2P网络来维护用户在线状态和协助呼叫建立,但包含一个中心化的登录服务器用于身份认证。

工作流程

  1. 用户通过中心登录服务器认证。
  2. 登录服务器引导用户加入一个P2P覆盖网络(可能成为超级节点或普通节点)。
  3. 当用户A呼叫用户B时,A通过P2P网络查询B的当前IP地址(基于B的Skype ID)。
  4. 查询到地址后,A与B建立直接的音频/视频流连接(有时数据也可能通过P2P网络中转)。


总结

本节课中我们一起学习了对等网络的发展与演化:

  1. 第一代(Napster):集中式目录,分散式传输。解决了资源发现问题,但存在中心化缺陷。
  2. 第二代(Gnutella):完全分布式,使用查询泛洪。解决了单点问题,但搜索效率低,可扩展性差。
  3. 第三代(KaZaA):结构化分层网络,引入超级节点。平衡了效率与去中心化,更好地适应了网络规模。

P2P网络的核心思想是利用边缘设备的闲置资源,通过巧妙的覆盖网络组织方式和协议设计,实现高效、鲁棒的资源共享。这种模式深刻影响了文件共享、内容分发和实时通信等应用的发展。BitTorrent等更现代的P2P协议在此基础上又有新的创新,例如将文件分片并从多个对等体并行下载,进一步提升了性能。

8:排队论

在本节课中,我们将要学习一个相当有趣且具有一定挑战性的主题——排队论。这是本学期数学内容最密集的部分之一。不过请不要担心,这里的数学并不困难,我们主要会涉及一些求和、乘积符号以及概率概念。我们的目标不是将大家培养成排队论专家,而是向大家介绍这个在网络工程师工具箱中非常重要的工具。排队论不仅用于分析和构建网络系统,预测其性能,也适用于操作系统负载分析等其他场景。

在开始之前,有几个管理事项需要说明。下一节课将是测验,测验将通过Canvas平台进行。网站上现已发布学习指南,它汇总了每节课的学习目标,是测验内容的参考范围。测验将涵盖包括今天排队论在内的所有已学内容。测验为闭卷,但会提供包含今天所有公式的参考表。测验中无需使用计算器,数字会经过精心选择以便计算。此外,还有一份作业在测验后一天截止,实验一也已发布。

排队论概述 🧑‍💼

排队论研究的是这样一种过程:顾客(或数据包)以某种随机方式到达一个服务能力有限的服务设施。如果服务设施已被占用,新到的顾客就需要排队等待。这个过程在现实生活中随处可见,如超市收银台、银行柜台等。在网络中,这通常对应数据包到达路由器,路由器处理能力有限,数据包需要排队等待处理。

排队系统通常有六个关键特征需要考虑,这些特征决定了适用于该系统的数学模型。

排队系统的六个特征 📋

以下是描述一个排队系统时需要明确的六个方面:

  1. 到达模式:顾客如何到达系统。通常是随机的(随机的),我们无法预知具体到达时间,但可以描述其概率分布。平均到达率(λ)是一个可测量的参数。到达模式可以是平稳的(不随时间变化),也可以是成批到达的。
  2. 服务模式:服务设施如何为顾客服务。服务时间通常也是随机的,平均服务率(μ)是可测量的。服务模式可以是状态相关的(服务速度取决于系统中顾客数量),也可以是平稳的。
  3. 排队规则:顾客从队列中被选出来服务的顺序。最常见的是先进先出(FIFO),但也可能是后进先出(LIFO)、随机选择或基于优先级的规则。
  4. 系统容量:系统能容纳的顾客总数(包括正在服务的和排队的)。在实际系统和网络路由器中,队列长度(缓冲区大小)总是有限的,但为了简化分析,有时会假设容量无限。
  5. 服务通道数量:并行工作的服务设施数量。例如,银行有多个柜员,路由器有多个处理核心。这用参数 C 表示。
  6. 顾客源数量:潜在顾客的总数。通常假设为无限。

肯德尔记号 📝

为了简洁地描述排队系统的类型,我们使用肯德尔记号。其通用格式为:A/B/C[/D/E]

  • A 表示到达间隔时间的分布(如 M 表示马尔可夫/指数分布,D 表示确定型)。
  • B 表示服务时间的分布(同样,M、D 等)。
  • C 表示服务通道的数量。
  • D (可选)表示系统容量。
  • E (可选)表示顾客源数量或排队规则(如 FIFO、LIFO)。

例如,M/M/1 表示到达间隔时间和服务时间都服从指数分布、只有一个服务通道的系统。G/G/1 则表示对到达和服务分布没有特定假设的单通道通用系统。

关键参数与利特尔定律 ⚖️

上一节我们介绍了描述排队系统的特征和记号。本节中,我们来看看用于量化分析的关键参数和一条基本原理。

首先定义几个核心参数:

  • λ:平均到达率(顾客/秒)。
  • μ:单个服务通道的平均服务率(顾客/秒)。
  • C:服务通道数量。
  • ρ:流量强度,计算公式为 ρ = λ / (C * μ)。这是衡量系统繁忙程度的关键指标。为保证系统稳定,必须满足 ρ < 1

我们关心系统的性能指标,例如:

  • L:系统中顾客的平均数量(包括排队和正在服务的)。
  • L_q:队列中顾客的平均数量(仅排队)。
  • W:顾客在系统中的平均逗留时间(排队时间 + 服务时间)。
  • W_q:顾客在队列中的平均等待时间。

这些指标之间通过利特尔定律联系起来,这是一个非常强大且通用的定律:

  • 对于整个系统:L = λ * W
  • 仅对于队列:L_q = λ * W_q

此外,平均逗留时间等于平均等待时间加上平均服务时间:W = W_q + (1/μ)

M/M/1 排队模型 📊

利特尔定律适用于任何排队系统。为了得到更具体的性能指标公式,我们需要对系统做出更多假设。本节我们来看一个最经典且分析简便的模型:M/M/1 模型。

M/M/1 模型假设:

  1. 到达过程是泊松过程(即到达间隔时间服从指数分布),平均到达率为 λ
  2. 服务时间服从指数分布,平均服务率为 μ
  3. 只有一个服务通道(C=1)。
  4. 系统容量无限,顾客源无限,排队规则为 FIFO。

在这些假设下,我们可以推导出系统状态(有 n 个顾客)的概率:

  • P_n = (1 - ρ) * ρ^n,其中 ρ = λ / μ

进而,我们可以得到一系列简洁的性能指标公式(也称为“效能度量”):

  • 系统中平均顾客数:L = ρ / (1 - ρ) = λ / (μ - λ)
  • 队列中平均顾客数:L_q = ρ^2 / (1 - ρ) = λ^2 / [μ(μ - λ)]
  • 系统中平均逗留时间:W = 1 / (μ - λ)
  • 队列中平均等待时间:W_q = ρ / (μ - λ) = λ / [μ(μ - λ)]

这些公式非常优雅,只需测量 λμ,就能轻松估算系统性能。

M/M/c 排队模型 🏦

上一节我们分析了单服务通道的 M/M/1 模型。在实际中,像银行或有多核处理器的路由器,往往有多个并行服务通道。本节中我们来看看 M/M/c 模型。

M/M/c 模型扩展了 M/M/1,它拥有 c 个相同的服务通道。到达过程和服务时间分布的假设与 M/M/1 相同。其状态转移图与 M/M/1 类似,但服务率在状态小于 c 时是变化的(例如,状态2时有2个通道工作,服务率为 2μ),直到状态达到或超过 c 时,服务率稳定为

M/M/c 模型的公式比 M/M/1 复杂一些,但核心思想相同。例如,系统中顾客数为零的概率 P_0 的计算公式更复杂:

  • P_0 = [ Σ_{k=0}^{c-1} ( (cρ)^k / k! ) + ( (cρ)^c / (c! (1-ρ)) ) ]^{-1},其中 ρ = λ / (cμ)

系统中平均顾客数 L 的公式也更为复杂,但一旦计算出 P_0,其他指标如 L_qWW_q 都可以通过利特尔定律等关系推导出来。尽管公式复杂,但它们允许我们分析多通道系统的性能,并帮助决定需要配置多少个服务通道。

总结与测验准备 ✅

本节课我们一起学习了排队论的基础知识。我们首先了解了排队系统的六个特征和用于分类的肯德尔记号。然后,我们学习了关键参数(λ, μ, ρ)和适用于所有排队系统的利特尔定律。接着,我们深入分析了两种具体模型:单通道的 M/M/1 模型和多通道的 M/M/c 模型,并得到了计算平均队列长度、等待时间等性能指标的公式。

对于即将到来的测验,重点在于理解概念、参数含义以及不同公式的适用场景(例如,知道利特尔定律是通用的,而 M/M/1 的公式仅适用于特定模型)。测验中会提供公式表,大家需要能够根据问题描述选择合适的公式并应用。请利用复习课程和 Piazza 论坛解决疑问。

祝大家周末愉快,测验顺利!

9:传输层与UDP

在本节课中,我们将要学习计算机网络体系结构中的传输层。传输层负责在运行于不同主机上的应用程序之间建立逻辑连接。我们将首先了解传输层的通用功能和职责,然后深入探讨一个具体的、简单的传输层协议:用户数据报协议(UDP)。

课程概述与回顾

上一节我们完成了应用层的学习和一次测验。现在,是时候向下进入传输层了,这将是今天的目标。

在开始之前,需要提醒几件即将到来的事项:周二有作业截止,并且下周四没有课,实验报告将在再下一个周二截止。这意味着接下来两次课,大家都会有刚提交的任务。

关于上次的测验,整体进行得比预期顺利。测验的中位数是79%,最低分是50.5%,这是第一次在图表底部看到0分,这是个好现象。但请不要仅仅满足于自己的分数。请务必回顾测验,查看做错的题目,思考错误原因。这是学习过程中至关重要的反馈环节,有助于巩固网络知识并改进未来的应试技巧。在14740课程中,成绩复核请求是无风险的。如果发现评分有误,请通过Piazza私信告知,我们很乐意核查。根据课程政策,你有一周的时间提出复核请求。

传输层的使命与核心功能

现在,我们深入下一层。我们已经完成了应用层,是时候看看应用层所依赖的服务是如何在传输层实现的。

传输层的使命是建立连接。应用层要求将消息从一个计算机上运行的应用程序传送到另一个计算机上运行的应用程序,传输层就负责完成这个任务,即在这两个应用程序之间建立逻辑连接。之所以称为“逻辑”连接,是因为通常在这些应用程序之间并没有直接的物理线路。

当然,传输层并非独立完成所有工作,它会利用其下一层——网络层——提供的服务。网络层负责连接主机,确保数据能从一台计算机传送到另一台计算机。传输层代码运行在发送方和接收方计算机上。当应用程序说“我有一个HTTP消息要发送给那个应用程序”时,本机的传输层软件会接收这些数据,交给网络层并说“请把它送到那台计算机”(而不是直接送到应用程序)。网络层确保数据到达目标计算机,然后交给那台计算机上的传输层代码,由传输层代码负责将数据传递给正确的应用程序。

那么,传输层需要完成哪些关键功能来实现其职责、建立逻辑连接呢?以下是任何传输层协议几乎都必须完成的两大关键功能。

功能一:复用与解复用

我们需要能够复用和解复用消息。这意味着我的笔记本电脑上会运行许多应用程序,它们都想要发送数据。这些数据都会汇入传输层的同一段代码。同样,作为接收方,网络层会给我们送来给笔记本电脑上许多应用程序的数据,我们需要解复用这些数据,以便将它们安排给正确的应用程序。

传输层还需要一种机制来标记或编号这些应用程序,即需要一个应用程序的寻址机制。在大多数传输协议中(尤其是TCP和UDP),使用的寻址机制是端口号的概念。端口号是一个16位的无符号整数,范围从0到65535。其中一些号码被预留用于众所周知的服务,例如Web服务器通常使用端口80(HTTP)或443(HTTPS)。这些端口号由互联网号码分配机构管理,以确保不会冲突。

需要理解的是,TCP和UDP是两种独立的协议,它们有各自独立的端口号空间。网络层在收到数据包时,会根据协议类型(如TCP或UDP)将其交给相应的传输层软件处理。因此,TCP的端口80和UDP的端口80不会冲突,因为处理它们的是两套不同的代码。

以下是关于端口号的一些关键点:

  • 绑定:应用程序需要通过一个称为“绑定”的过程,将自己与一个特定的端口号关联起来,这样传输层才知道该将数据发送给哪个应用程序。
  • 临时端口:客户端应用程序通常使用临时端口,由传输层动态分配,用于发送数据。每次运行时可能获得不同的端口号。
  • 唯一性:在运行时,端口号在单台主机上对于特定协议必须是唯一的,以确保数据能准确送达。

功能二:分段

传输层负责处理来自应用层的、任意大小的消息。例如,一个要观看的视频文件可能非常庞大。传输层需要将这个单一的大消息分割成适合在网络中传输的小块,这个过程称为分段。每个小块称为一个,会被独立处理。

虽然分段会增加一些头部开销,但回想我们在早期课程中讨论过的存储转发网络,将大消息分割成小段进行流水线传输,实际上能带来更高的网络性能。

用户数据报协议详解

以上是传输层的通用概念。现在,让我们来看一个具体的传输层协议。今天我们先学习简单的一个,因为TCP需要花费四到五节课来详细讲解。

UDP,即用户数据报协议。首先,“数据报”是一个基本等同于“分组”的术语。UDP是一个极其简单、无额外功能的传输层协议。它本质上只是提供了对网络层数据包的直接访问。UDP段几乎就直接成为网络层的分组。

UDP的设计目标与特点

UDP是一个古老的协议(RFC 768),其设计目标非常明确:提供最基础的服务。它不提供网络层本身所没有的任何额外保证。具体特点如下:

  • 无连接:无需建立连接即可发送数据。
  • 不可靠:除了基础的校验和外,不提供数据丢失、重复或顺序错乱的保证。网络层尽力而为,UDP也如此。
  • 无拥塞控制:发送方可以任意速率发送数据,没有TCP那样的拥塞控制机制。
  • 头部开销小:UDP头部非常简单,只有8个字节。

为何使用UDP?

既然UDP如此“简陋”,为何还要使用它?主要原因在于,TCP提供的可靠性保证(如丢包重传)并不适合所有应用场景。

  • 实时应用:如语音通话(Zoom)、视频流。对这些应用而言,延迟比丢包更糟糕。TCP的重传机制会引入额外延迟,而UDP允许应用直接处理丢包(如重复上一帧画面)。
  • 自定义可靠性:如DNS。DNS希望查询失败时能重试另一个冗余的服务器,而不是TCP那样重传给同一个服务器。使用UDP可以让应用层自己实现更灵活的重传逻辑。

因此,选择UDP通常不是因为它的“简单”或“无连接”,而是因为应用有不同于TCP的可靠性或时序需求

UDP数据段格式

每个协议都需要定义其消息格式。UDP采用固定格式,其头部包含四个字段,每个16位(2字节):

  1. 源端口号:发送方应用程序的端口。
  2. 目的端口号:接收方应用程序的端口。
  3. 长度:指整个UDP数据段(头部+数据载荷)的长度,单位为字节
  4. 校验和:用于检测数据在传输过程中是否出现比特差错。

校验和算法详解

校验和是UDP提供的唯一差错检测机制。其目标是让接收方能够发现传输过程中发生的比特错误。

发送方计算步骤:

  1. 求和:将整个UDP段(在计算时校验和字段先置为0)视为一系列16位的字(word)。将所有16位字相加(二进制加法)。
  2. 处理进位:如果加法过程中产生超出16位的进位(即第17位),将这个进位“回卷”到最低位并继续相加。重复此过程直到没有进位。
  3. 取反:对最终得到的16位和值进行按位取反(0变1,1变0)。结果即为校验和,填入UDP头部的校验和字段。

接收方验证步骤:

  1. 求和:接收方将收到的整个UDP段(包括校验和字段)的所有16位字相加。
  2. 处理进位:同样处理所有进位回卷。
  3. 检查结果:如果最终结果的所有16位全为1(即二进制1111111111111111),则认为数据在传输过程中没有出错。否则,数据段有误,应被丢弃。

算法示例:
假设有一个极短的UDP段,包含三个16位字(例如,来自源端口、目的端口和长度字段的某些值)。发送方计算这三个字的和,取反后得到校验和。接收方收到四个16位字(原始三个字加上校验和),将它们全部相加。如果计算正确,最终结果将是全1。

校验和的能力与局限:

  • 能力:可以检测任何单个比特的错误,以及部分多个比特的错误
  • 局限:无法检测所有错误模式。例如,如果两个不同16位字中相同位置的比特同时发生翻转,校验和可能无法发现。
  • 设计权衡:校验和算法在差错检测能力、计算开销(简单的加法)和额外数据开销(仅16位)之间取得了平衡。对于大多数情况,它被认为是“足够好”的。如果应用需要更强的可靠性,可以在UDP的数据载荷中实现自己的差错控制机制。

关于UDP的常见问题澄清

  • 错误处理:如果校验和检测到错误,UDP唯一能做的就是丢弃该数据段。不会重传,也不会影响其他数据段。
  • 数据完整性:UDP不保证数据顺序、不防止丢包、不防止重复。应用必须能容忍这些情况,或自行在应用层处理。
  • 长度字段错误:如果长度字段在传输中出错,校验和计算也会将其捕获,从而导致数据段被丢弃。

本节总结

本节课我们一起学习了传输层的基础知识和UDP协议。

首先,我们明确了传输层的核心使命是在不同主机的应用程序间建立逻辑连接,并依赖于网络层的服务。传输层必须完成两个通用功能:复用/解复用(通过端口号寻址应用程序)和分段(将大应用消息分割成适合网络传输的段)。

接着,我们深入研究了用户数据报协议。UDP是一个极其简单的无连接传输协议。我们了解了它的特点:不可靠、无拥塞控制、头部开销小。选择UDP的关键原因通常是应用需要避开TCP的可靠性保证(如重传带来的延迟),例如在实时流媒体或DNS中。

我们详细剖析了UDP数据段格式,特别是其校验和算法。你应当理解校验和的计算与验证过程,以及它在端到端差错检测中的作用和局限性。

最后,我们讨论了使用UDP时应用需要面对的问题:数据可能丢失、重复、失序。如果应用无法容忍这些,则不应使用UDP,或者需要在应用层实现额外的控制逻辑。

通过本课,你应该能够解释传输层的基本职责,说明UDP的用途与优缺点,并理解其校验和机制的原理。

10:可靠传输原理 🛠️

在本节课中,我们将学习构建可靠数据传输协议所需的核心工具和概念。我们将从最简单的协议开始,逐步引入更复杂的机制,为后续学习TCP协议打下坚实基础。

概述

可靠数据传输的目标是让网络表现得像一个可靠的通道。我们希望数据能够无差错、不丢失、不重复且按序地从发送方传递到接收方。然而,底层网络存在比特错误、丢包、重复和乱序等问题。本节课将介绍一系列工具(如确认、定时器、重传、序列号和滑动窗口),并通过几个学术协议(如停等协议、回退N步协议和选择重传协议)来演示这些工具如何协同工作,以克服网络中的故障。

故障模型与核心工具

上一节我们介绍了可靠传输的目标。为了达成这些目标,我们首先需要明确要防范哪些网络故障,并了解可用的工具。

我们关注的网络故障模型包括:

  • 比特错误:数据在传输过程中某些比特位发生改变。
  • 丢包:数据包或确认包在传输过程中完全丢失。
  • 重复交付:接收方收到同一个数据包的多个副本。
  • 乱序交付:数据包到达接收方的顺序与发送顺序不一致。

为了应对这些故障,我们拥有以下核心工具:

  • 接收方反馈:接收方发送确认(ACK)或否定确认(NAK)消息,告知发送方数据接收状态。
  • 差错检测:使用校验和等数学方法,验证接收到的数据是否与发送时一致。
  • 定时器:发送方设置软件定时器,用于检测数据包或确认包是否丢失。
  • 重传:当怀疑数据包未成功送达时,发送方从缓冲区中取出副本再次发送。
  • 序列号:为每个数据包分配一个唯一编号,用于识别数据包是新数据还是重复数据。
  • 窗口与流水线:允许发送方在收到确认前连续发送多个数据包,以提高网络利用率。

停等协议:版本演进

本节中,我们通过停等协议的三个版本来具体看看这些工具是如何被引入和使用的。停等协议是最简单的可靠传输协议,其核心思想是发送方每发送一个数据包后,必须等待确认,才能发送下一个。

版本1:基础反馈

第一个版本引入了接收方反馈和差错检测。

以下是发送方和接收方需要遵循的规则:

  • 发送方规则
    1. 从应用层获取数据,封装成段。
    2. 发送该数据段。
    3. 等待接收方反馈。
    4. 若收到ACK,则发送下一个数据段。
    5. 若收到NAK,则重传当前数据段。
  • 接收方规则
    1. 等待数据段到达。
    2. 计算校验和。
    3. 若校验和正确,则向发送方发送ACK,并将数据交付给应用层。
    4. 若校验和错误,则向发送方发送NAK。

问题:此版本无法处理ACK或NAK消息本身在传输中损坏的情况。

版本2:处理损坏的反馈

为了解决反馈消息损坏的问题,我们为反馈消息也添加校验和,并引入序列号来区分数据包。

规则更新如下:

  • 发送方规则
    1. 发送数据段时,为其分配一个序列号(例如,0或1)。
    2. 发送数据段,并保留副本。
    3. 等待反馈。
    4. 若收到校验和正确的ACK,且ACK中的序列号匹配,则发送下一个数据段。
    5. 若收到损坏的反馈(校验和错误)或NAK,则重传当前数据段。
  • 接收方规则
    1. 接收数据段并检查校验和。
    2. 若校验和正确,则发送带有对应序列号的ACK,并将数据交付应用层(如果是新数据)。
    3. 若校验和错误,则发送NAK。

关键点:序列号使得接收方能够识别重传的数据包是重复的,从而避免将相同数据重复交付给应用层。

问题:此版本仍无法处理数据包或确认包完全丢失的情况。

版本3:处理丢包——引入定时器

为了检测丢包,我们引入定时器工具。

规则进一步更新:

  • 发送方规则
    1. 发送数据段(带序列号)后,启动一个定时器
    2. 若在定时器超时前收到正确的ACK,则取消定时器,发送下一个数据段。
    3. 若收到NAK或损坏的反馈,则重启定时器并重传当前数据段。
    4. 定时器超时,则重传当前数据段(并重启定时器)。
  • 接收方规则:与版本2相同。

关键点:定时器超时是发送方推断数据包可能丢失的唯一方式。发送方无法区分是数据包丢失还是ACK丢失。

效率问题:停等协议在等待ACK期间链路空闲,利用率很低。利用率公式为:
利用率 = (L/R) / (RTT + L/R)
其中 L 是数据包长度,R 是链路速率,RTT 是往返时间。在长延迟或高速链路上,效率极低。

提升效率:滑动窗口协议

上一节我们看到停等协议效率低下。为了提高效率,我们需要允许发送方在不等待确认的情况下连续发送多个数据包,即采用流水线技术。这通过滑动窗口协议来实现。

滑动窗口的核心是带宽时延积(BDP),它决定了为了填满管道,最多可以有多少数据“在飞”。公式为:
BDP = 带宽 * 往返时延
例如,带宽为1.5 Mbps,RTT为45ms,则BDP约为67.5 Kb。若每个数据段为1KB(8Kb),则窗口大小应约为8个数据段。

回退N步协议

GBN协议使用累积确认和单个重传定时器。

以下是GBN协议的工作方式:

  • 发送方
    • 维护一个发送窗口,窗口大小 N
    • 可以连续发送窗口内的所有数据包。
    • 为每个发送的数据包启动定时器(但通常只维护一个基于最早未确认包的定时器)。
    • 接收累积ACK:收到ACK(n)表示所有序列号小于等于n的数据包都已被正确接收。
    • 如果超时,则重传所有已发送但未确认的数据包(即从超时的数据包开始,到窗口内的所有数据包)。
  • 接收方
    • 只按序接收数据包。
    • 如果收到乱序的数据包,则将其丢弃,并重新发送最近按序接收的数据包的ACK(即累积ACK)。
    • 接收方缓冲区需求小。

优点:实现简单,接收方状态少。
缺点:单个数据包出错或丢失会导致大量不必要的重传,效率低下。

选择重传协议

SR协议通过为每个数据包单独确认和缓存,解决了GBN的缺点。

以下是SR协议的工作方式:

  • 发送方
    • 维护发送窗口。
    • 每个数据包单独设置定时器
    • 只重传超时的那个数据包。
    • 收到ACK后,标记该数据包已接收。如果该数据包是窗口最左侧的,则滑动窗口。
  • 接收方
    • 维护接收窗口。
    • 单独确认每个正确接收的数据包(无论是否按序)。
    • 缓存乱序但正确的数据包。
    • 当按序的数据包到达时,将一批按序数据交付给应用层,并滑动接收窗口。
    • 对于窗口外但序列号在 [rcv_base - N, rcv_base - 1] 范围内的数据包(很可能是之前丢失的ACK导致的重传),也必须发送ACK,以防止发送方窗口停滞。

关键挑战——序列号空间大小:窗口大小 N 和序列号位数必须满足:序列号空间大小 >= 2 * N。这是为了避免新旧数据包序列号重叠造成的歧义。例如,如果 N=4,则至少需要3位序列号(0-7),因为发送方和接收方的窗口可能完全不重叠,需要区分开所有“在飞”的数据包。

总结

本节课中我们一起学习了可靠数据传输的基本原理和构建模块。

我们首先明确了可靠传输的目标和网络故障模型。然后,我们系统地学习了实现可靠传输的六大工具:接收方反馈(ACK/NAK)差错检测(校验和)定时器重传序列号滑动窗口

通过停等协议(Stop-and-Wait)的三个版本演进,我们看到了如何逐步引入这些工具来处理比特错误、反馈损坏和丢包问题,同时也暴露了其效率低下的根本缺陷。

为了提升效率,我们引入了滑动窗口协议,允许流水线发送数据。我们深入分析了两种经典的滑动窗口协议:

  1. 回退N步(Go-Back-N):使用累积确认,实现简单,但错误时重传开销大。
  2. 选择重传(Selective Repeat):使用单独确认和接收方缓存,效率更高,但实现更复杂,需要仔细设计序列号空间(序列号空间 >= 2 * 窗口大小)。

这些学术协议虽然本身不用于实际网络,但它们清晰地展示了核心工具的工作原理和交互方式,为我们理解接下来要学习的、高度优化的工业标准协议——TCP——奠定了坚实的基础。

11:TCP 协议基础 🚀

在本节课中,我们将要学习传输控制协议(TCP)的基础知识。TCP是互联网中最重要的协议之一,负责在两个端点之间提供可靠、有序的字节流传输。我们将从TCP的核心特性、数据格式、连接管理以及可靠数据传输机制等方面进行详细讲解。


TCP 协议概述 📖

上一节我们介绍了可靠数据传输的基本工具。本节中,我们来看看这些工具如何在一个复杂且广泛使用的协议——TCP中得以应用。

TCP是一个点对点的协议,连接单个发送方和单个接收方。它的核心目标是提供可靠的数据传输,确保数据按序、无重复、无丢失地送达。为了实现这一点,TCP使用了我们之前讨论过的多种工具,如序列号、确认、定时器和滑动窗口。

TCP将数据视为一个有序的字节流,这意味着应用程序发送的数据没有预定义的结构或记录边界,所有字节都按顺序编号。它也是一个全双工的协议,允许连接的两端同时发送和接收数据。此外,TCP是面向连接的,在数据传输开始前,通信双方需要通过“握手”过程来同步状态信息。

在传输层,TCP需要管理多个缓冲区来处理发送方、接收方以及网络本身速度不匹配的问题。这引出了两个关键的控制机制:

  • 流量控制:防止发送方发送数据过快,导致接收方的缓冲区溢出。
  • 拥塞控制:防止发送方发送数据过快,导致网络中的路由器缓冲区溢出。我们将在后续课程中详细讨论拥塞控制。

TCP 数据段格式 📦

了解了TCP的基本角色后,我们来看看TCP数据段的具体格式。每个TCP数据段都包含一个头部,其中承载了实现协议功能所需的各种信息。

以下是TCP头部各字段的详细说明:

  • 源端口号 (16位) 和 目的端口号 (16位):用于标识发送和接收应用程序。这是TCP的寻址方案。
  • 序列号 (32位):表示该数据段中第一个数据字节在整个字节流中的编号。例如,如果序列号是100,且数据段包含500字节数据,则该数据段包含字节100到599。
  • 确认号 (32位):这是一个累积确认。当ACK标志置位时,此字段有效。它表示接收方期望收到的下一个字节的编号。例如,确认号为600意味着接收方已正确收到字节0-599。
  • 头部长度 (4位):指示TCP头部的长度,单位为32位字。由于头部最小为20字节(5个字),所以此字段值至少为5。它用于定位可变长的选项字段和数据部分的起始位置。
  • 保留字段 (6位):目前未使用。
  • 标志位 (6位)
    • URG:紧急指针有效(不常用)。
    • ACK:确认号字段有效。
    • PSH:提示接收方应尽快将数据交付给应用层(不常用)。
    • RST:重置连接(通常表示错误)。
    • SYN:在连接建立时用于同步序列号。
    • FIN:用于释放连接,表示发送方没有更多数据要发送。
  • 接收窗口 (16位):用于流量控制。接收方通过此字段告知发送方自己当前可用的缓冲区空间大小(单位:字节),发送方不应发送超过此窗口大小的未确认数据。
  • 校验和 (16位):用于检测头部和数据在传输过程中的错误。计算方法与UDP相同。
  • 紧急指针 (16位):与URG标志配合使用,指向数据段中紧急数据的末尾(不常用)。
  • 选项字段 (可变长):最多40字节,用于一些扩展功能,例如:
    • 协商最大报文段长度。
    • 窗口缩放因子(用于支持大于64KB的窗口)。
    • 时间戳。

一个重要的概念是最大报文段长度。它定义了TCP数据段中应用层数据的最大长度,其值由下层网络的最大传输单元决定。计算公式为:
MSS = MTU - IP头部长度 - TCP头部长度
例如,在标准以太网中,MTU为1500字节,典型的MSS为1460字节。


TCP 连接管理 🤝

TCP是面向连接的协议,这意味着在数据传输前后,需要进行连接的建立和释放。这个过程确保了通信双方状态的同步。

连接建立:三次握手

TCP使用“三次握手”来建立连接。这个过程交换三个数据段来同步双方的初始序列号。

以下是三次握手的步骤:

  1. 客户端发送 SYN:客户端发送一个数据段,将SYN标志置为1,并选择一个随机初始序列号(例如,seq = x)。此数据段不携带应用数据。
  2. 服务器发送 SYN-ACK:服务器收到SYN后,如果同意建立连接,则回复一个数据段。该数据段将SYNACK标志均置为1。ACK号字段设置为x+1,同时服务器也选择一个自己的随机初始序列号(例如,seq = y)。
  3. 客户端发送 ACK:客户端收到SYN-ACK后,发送最后一个确认数据段。将ACK标志置为1,确认号设置为y+1ack = y+1)。此时,连接建立完成。这个数据段可以开始携带应用数据

为什么使用随机初始序列号?
主要是为了防止“旧连接的重复数据段”干扰新连接。如果序列号总是从0开始,一个在网络中滞留的旧数据段可能在新连接建立后到达,并被错误地接受。随机化序列号极大地降低了这种风险。

如果客户端尝试连接一个未监听的端口,服务器会回复一个RST标志置位的数据段来拒绝连接。

连接释放:四次挥手

TCP连接是全双工的,因此每个方向必须单独关闭。连接释放通常需要四个数据段,称为“四次挥手”。

以下是连接释放的典型步骤:

  1. 主动关闭方发送 FIN:当一方(如客户端)完成数据发送后,发送一个FIN标志置位的数据段,表示它没有更多数据要发送了。
  2. 被动关闭方发送 ACK:另一方(如服务器)收到FIN后,发送一个ACK进行确认。
  3. 被动关闭方发送 FIN:当服务器也准备好关闭时,它发送自己的FIN数据段。
  4. 主动关闭方发送 ACK:客户端收到服务器的FIN后,发送最终的ACK进行确认。

此时,连接并未立即完全关闭。主动关闭方(客户端)会进入 TIME_WAIT状态,持续2倍的最大报文段生存时间(通常为2分钟)。在此状态下,如果最后一个ACK丢失,被动关闭方重传的FIN仍然能被响应。这确保了连接能可靠地关闭,并防止旧连接的报文干扰可能立即建立的新连接。


TCP 可靠数据传输机制 ⚙️

连接建立后,TCP的核心任务就是可靠地传输数据流。它综合运用了之前学过的多种工具。

TCP可靠数据传输机制基于以下关键设计:

  • 累积确认与按字节编号:确认号ACK是对已按序接收的所有字节的确认。序列号seq标识数据段中第一个字节的编号。
  • 管道化与滑动窗口:允许发送方在未收到确认前连续发送多个数据段,以充分利用网络带宽。
  • 超时重传:为每个已发送但未确认的数据段启动一个重传定时器。如果定时器超时仍未收到确认,则重传该数据段。
  • 快速重传:如果发送方连续收到3个重复的ACK,则推断某个数据段可能丢失(而非严重延迟),并立即重传该数据段,而不必等待超时。这提高了对丢包的反应速度。

发送方事件与动作

以下是TCP发送方在主要事件触发时的动作:

  • 从应用层接收数据
    1. 根据MSS将数据封装成TCP段。
    2. 分配下一个序列号。
    3. 检查流量控制和拥塞控制窗口是否允许发送。
    4. 如果允许,则启动该数据段的定时器并发送。
  • 定时器超时:重传导致超时的数据段,并重启其定时器。
  • 收到ACK
    • 如果ACK确认了新的数据,则更新发送窗口,并可能发送新的已就绪数据。
    • 如果收到重复ACK,则计数。当收到第3个重复ACK时,触发快速重传

接收方事件与动作

以下是TCP接收方在主要事件触发时的动作:

  • 按序到达的数据段:期望序列号与到达数据段的序列号匹配。接收方发送累积ACK,并将数据交付给应用层。
  • 乱序到达的数据段:序列号大于期望值。TCP会缓存这个数据段,并立即发送一个重复ACK,其确认号为当前期望的序列号。这个重复ACK有两个作用:1)告知发送方数据已收到但存在间隔;2)作为可能丢包的早期信号。
  • 部分或完全填充间隔的数据段到达:当之前缺失的数据段到达,填补了接收缓存中的间隔时,接收方立即发送一个ACK,确认所有已按序接收的字节。

示例:快速重传

考虑一个场景:发送方发送了序列号为92、100、120的三个数据段。数据段100在网络中丢失。

  1. 接收方收到92,回复ACK=100
  2. 接收方收到120(乱序),由于期望的是100,它回复一个重复ACKACK=100
  3. 接收方可能继续收到后续数据(如140),对于每一个乱序到达,它都回复ACK=100
  4. 当发送方收到第3个重复的ACK=100时,它推断数据段100很可能丢失,于是立即重传数据段100(快速重传),而不等待其超时。
  5. 当接收方最终收到重传的100后,它已经有了120,于是可以回复一个累积ACK,确认所有已接收的数据(例如ACK=180)。

总结 📝

本节课中我们一起学习了TCP协议的基础知识。我们了解到TCP是一个面向连接的、可靠的、全双工的字节流协议。我们详细分析了TCP数据段的格式,理解了序列号、确认号、标志位和窗口等关键字段的作用。我们探讨了通过“三次握手”建立连接和通过“四次挥手”释放连接的过程及其重要性。最后,我们深入研究了TCP实现可靠数据传输的核心机制,包括累积确认、超时重传以及快速重传算法。

掌握这些基础是理解TCP更高级特性(如流量控制和拥塞控制)的关键。在接下来的课程中,我们将继续探索TCP如何智能地管理网络资源以避免拥塞。

12:主机端的拥塞控制

在本节课中,我们将要学习TCP协议中的两个核心控制机制:流量控制和拥塞控制。我们将了解它们如何协同工作,以确保数据在网络中高效、可靠地传输,同时避免网络过载。

概述

TCP协议通过两个独立的窗口机制来控制发送方的行为:流量控制窗口和拥塞控制窗口。发送方在发送任何数据段之前,必须确保该数据段同时位于这两个窗口允许的范围内。这两个窗口分别解决了不同的问题:流量控制保护接收方,而拥塞控制保护网络本身。

流量控制:保护接收方

上一节我们介绍了TCP的基本工作原理,本节中我们来看看流量控制。流量控制旨在管理接收方作为数据段消费者的能力,确保发送方不会以超过接收方处理能力的速度发送数据,从而避免接收方缓冲区溢出。

接收方会分配一块固定大小的内存作为接收缓冲区(RCV Buffer),用于临时存储从网络到达但尚未被应用程序取走的数据。接收窗口(RCV Window)的大小等于接收缓冲区中的剩余空闲空间。

接收方通过TCP报文段首部中的“接收窗口”字段,将其当前的接收窗口大小告知发送方。发送方根据收到的确认号(ACK number)和接收窗口值,计算出自己可以发送的数据字节范围。

以下是流量控制的关键点:

  • 目的:防止发送方淹没接收方。
  • 控制依据:接收方缓冲区的剩余空间。
  • 通信机制:通过TCP首部的RCV Window字段由接收方告知发送方。
  • 计算接收窗口 = 接收缓冲区总大小 - 已占用缓冲区大小

拥塞控制:保护网络

流量控制解决了端到端的问题,但数据在网络中传输时,还可能遇到另一个问题:网络拥塞。本节我们将探讨拥塞控制,这是一个更为复杂的分布式问题。

网络拥塞发生在当网络中的路由器或链路负载过重,导致数据包经历长时延甚至被丢弃时。拥塞的代价很高。

以下是网络拥塞可能导致的一些问题:

  • 数据包经历排队时延:在路由器缓冲区中等待。
  • 数据包被丢弃:当路由器缓冲区满时。
  • 发送方不必要的重传:可能由于时延过长导致超时,即使数据包并未丢失。
  • 浪费网络资源:重传加剧了网络负载。
  • 可能导致拥塞崩溃:重传的数据包进一步加剧拥塞,形成恶性循环,有效吞吐量急剧下降。

我们的目标是使网络运行在吞吐量高而时延低的“最佳点”(knee point),避免进入吞吐量低而时延高的“拥塞崩溃区”(cliff region)。为此,发送方需要一个反馈机制来感知网络状态。TCP采用端到端的拥塞控制方法,即通过观察数据包丢失(超时或收到三个重复ACK)来推断网络发生了拥塞,而不是依赖网络设备(如路由器)发送显式的拥塞信号。

TCP拥塞控制基础

TCP通过维护一个拥塞窗口变量来实现拥塞控制。拥塞窗口限制了发送方在收到确认之前可以注入网络的数据量。发送方的实际发送速率大约等于拥塞窗口大小除以往返时间。

公式发送速率 ≈ 拥塞窗口大小 / 往返时间

这源于带宽时延积的概念:带宽 × 往返时间 = 网络中可容纳的最大数据量。因此,速率 = (带宽 × 往返时间) / 往返时间 = 拥塞窗口 / 往返时间

TCP拥塞控制算法主要由几个部分组成:慢启动、拥塞避免,以及用于设置重传超时时间的RTT估计算法。TCP是一个自时钟系统,其发送速率由确认(ACK)的返回速率驱动,而不是依赖外部计时器。

慢启动算法

当一个TCP连接刚建立或检测到严重丢包后,它对网络的可用带宽一无所知。慢启动算法的目的是快速但不过分激进地探测出网络的可用容量。

慢启动算法过程如下:

  1. 初始时,设置拥塞窗口为一个最大报文段长度。
  2. 每收到一个对新数据的确认,拥塞窗口就增加一个MSS大小。
  3. 这使得拥塞窗口在每个往返时间内大约翻倍,实现指数级增长。

慢启动会持续到发生以下情况之一:

  • 发生数据包丢失(由超时或三个重复ACK指示)。
  • 拥塞窗口增长到一个预设的慢启动阈值
  • 接收方的流量控制窗口成为限制因素。

当遇到丢包或达到阈值时,慢启动阶段结束,进入拥塞避免阶段。

拥塞避免与AIMD

进入拥塞避免阶段后,TCP认为它已经接近网络的可用带宽。此时,目标从快速探测转变为谨慎地避免引发拥塞,同时尝试利用可能出现的额外带宽。

这通过加性增、乘性减算法实现:

  • 加性增:在每个往返时间内,拥塞窗口增加一个MSS,而不是每个ACK增加一个MSS。这是线性增长。
  • 乘性减:当检测到丢包时(无论是超时还是三个重复ACK),将拥塞窗口减半(乘以0.5)。对于超时,通常还会将慢启动阈值设置为当前拥塞窗口的一半,并重新进入慢启动;对于三个重复ACK(快速重传),则执行快速恢复,将拥塞窗口减半后直接进入拥塞避免阶段。

这种机制导致拥塞窗口呈锯齿状变化,不断试探带宽上限并在拥塞时快速后退。

往返时间估计与超时设置

准确估计往返时间对于设置合理的重传超时至关重要。超时设置过短会导致不必要的重传;设置过长则对丢包反应迟钝。

TCP通过以下步骤动态计算超时值:

  1. 采样RTT:测量从发送一个数据段到收到其确认的时间(忽略重传数据段的采样)。
  2. 计算估计RTT:使用指数加权移动平均来平滑RTT采样值,公式为:EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT,通常α取1/8。
  3. 计算RTT偏差:衡量RTT的变化程度,公式为:DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT|,通常β取1/4。
  4. 设置超时时间TimeoutInterval = EstimatedRTT + 4 * DevRTT。这个公式使得在网络波动大时,超时值会设置得更大以提供更多余量。

总结

本节课中我们一起学习了TCP中两个关键的发送方控制机制。流量控制是一种端到端机制,通过接收窗口保护接收方免于缓冲区溢出。拥塞控制则是一个复杂的分布式问题解决方案,它通过拥塞窗口来保护网络本身免于过载。我们详细探讨了慢启动如何帮助连接快速找到合适的发送速率,以及拥塞避免阶段的AIMD算法如何帮助维持网络在高吞吐量、低时延的状态下运行。最后,我们了解了如何通过动态估计RTT及其偏差来设置合理的重传超时,这是TCP可靠传输和拥塞控制的基础。理解这些机制是掌握现代网络传输性能的关键。

13:主机端高级拥塞控制 🚦

在本节课中,我们将继续探讨TCP拥塞控制,并深入了解几种高级的拥塞控制算法变体。我们将看到,除了经典的Tahoe和Reno算法外,研究者们还提出了许多改进方案,以应对不同的网络场景和挑战。

上一节我们介绍了TCP拥塞控制的基本原理,包括慢启动和拥塞避免阶段。本节中,我们来看看一些更高级的算法变体,它们通过不同的方式来探测和管理网络带宽。

算法变体概述

由于拥塞控制算法主要在发送端实现,相对容易进行研究和修改,因此出现了大量不同的算法变体。以下是几种具有代表性的算法:

  • TCP New Reno:在Reno的快速恢复机制基础上进行优化,主要改进在于处理多个数据包同时丢失的情况。
  • TCP Vegas:一种基于延迟的算法,通过监测往返时间的变化来预测和预防拥塞,而非等待丢包发生。
  • High Blood (针对LFN网络):专为长肥网络设计,解决在高带宽延迟积网络中,传统慢启动和拥塞避免效率低下的问题。
  • BIC (Binary Increase Congestion):使用二分搜索的思想来寻找合适的拥塞窗口大小,力求快速收敛到公平带宽点。
  • Compound TCP:一种混合算法,同时包含基于丢包和基于延迟的拥塞窗口组件,旨在兼顾效率和公平性。

TCP New Reno:优化快速恢复

New Reno 是对 Reno 算法的一个直接优化,它没有重新设计拥塞控制,而是改进了快速恢复阶段的行为,特别是在处理多个数据包丢失的突发情况时表现更佳。

以下是 New Reno 在快速恢复阶段的主要改进点:

  • 更精确的恢复结束判断:持续进行快速恢复,直到收到已发送数据中最高序列号的确认。
  • 保持管道活跃:每收到一个重复确认,就发送一个新数据包,试图保持网络管道中有数据在传输。
  • 及时重传:当收到一个“好的”新确认时,如果它表明后面可能存在空洞,则立即重传可能丢失的数据包。

TCP Vegas:基于延迟的拥塞预防

Vegas 采用了一种根本不同的哲学。它不依赖丢包作为拥塞信号,而是通过持续测量往返时间的变化来推断网络状态。

其核心逻辑可以用以下伪代码描述:

if (measured_rtt > base_rtt) {
    // 延迟增加,表明可能出现拥塞
    decrease_congestion_window();
} else if (measured_rtt < base_rtt) {
    // 延迟减少,表明网络有可用带宽
    increase_congestion_window();
}

Vegas 的目标是在拥塞实际发生之前就采取行动,从而获得更平滑的流量和更高的总体吞吐量。然而,它的一个主要问题是与像 Reno 这样的激进算法竞争时会处于劣势,因为Vegas的“礼貌”退让会被Reno立刻占用空出的带宽。

长肥网络与High Blood算法

长肥网络是指具有高带宽和高延迟的网络。在这种网络中,带宽延迟积非常大,意味着可以同时在途传输大量数据包。

例如,对于一个10 Gbps带宽、100 ms RTT的网络,使用1500字节的MSS,其带宽延迟积计算如下:
窗口容量 = (带宽 * RTT) / MSS = (10e9 bps * 0.1 s) / (1500 bytes * 8 bits/byte) ≈ 83333 个段

传统TCP的慢启动(每次RTT窗口翻倍)和拥塞避免(每次RTT窗口增加1个MSS)在这种环境下效率极低,需要极低的误码率才能正常工作。High Blood等算法通过修改增长策略来加速慢启动和更积极地探索带宽,以适配LFN网络。

BIC与Cubic:搜索与平滑

BIC算法将寻找合适拥塞窗口的过程视为一个二分搜索问题。它维护两个控制变量:minmax,并将目标窗口 target 设置为两者的中点。拥塞窗口朝 target 增长,达到后则调整 minmax 并重新计算 target

Cubic是BIC的后续演进,其拥塞避免阶段的窗口增长使用一个三次函数,在远离最近拥塞点时增长迅速,接近时增长放缓,从而在追求高吞吐量的同时,也考虑了与其他流的公平性。

Compound TCP:混合方法

Compound TCP 是一种混合型算法,旨在结合基于丢包和基于延迟两种方法的优点。它维护两个独立的拥塞窗口:

  • Cwnd (基于丢包):由传统的AIMD(加性增、乘性减)规则控制。
  • Dwnd (基于延迟):根据测量的RTT变化进行调整。当网络利用率不足时增加,当检测到排队延迟时减少。

总拥塞窗口 = Cwnd + Dwnd

这种设计使得Compound TCP既能对丢包做出快速反应,又能根据延迟趋势进行更精细的调整,从而在效率和公平性之间取得更好的平衡。

公平性与“囚徒困境”

TCP拥塞控制规则是自我约束的,没有网络警察强制执行。从理论上讲,用户可以修改自己的TCP实现,采用更激进的策略来获取更多带宽(例如,不按规则减小窗口、伪造ACK等)。这引出了网络中的“囚徒困境”。

如果每个人都遵守规则(合作),网络整体运行良好。但如果有人开始作弊(背叛),他能在短期内获得利益。然而,如果每个人都开始作弊,网络将陷入拥塞崩溃,所有人的性能都会下降。因此,长期来看,合作(使用公平的拥塞控制算法)对整体是最优的。这也是为什么主流操作系统都倾向于部署具有公平性考虑的算法。

本节课中我们一起学习了多种TCP拥塞控制的高级变体。我们看到,从简单的算法优化到根本性的设计哲学改变,研究者们不断探索更高效、更公平的带宽管理方式。同时,我们也理解了网络协议中自我约束与协作的重要性,这不仅是技术问题,也涉及到博弈论和社会协作的层面。

14:网络层

概述

在本节课中,我们将学习计算机网络体系结构中的网络层。网络层负责在主机之间提供逻辑连接,其核心任务是将数据包从源主机发送到目标主机。我们将探讨网络层的核心功能、两种主要的网络类型(数据报网络和电路交换网络),并深入分析互联网协议(IP)的细节,包括其数据包格式、分片机制和寻址方案。

网络层简介

上一节我们完成了传输层的学习。本节中,我们来看看网络层。网络层在网络体系结构中处于核心位置,它利用下层(数据链路层)提供的服务,在主机之间建立逻辑连接。其核心任务是传输数据包。

网络层与传输层的区别在于:传输层在应用程序之间建立连接,而网络层则在主机之间建立连接。网络层通过封装传输层传递下来的,形成数据包,并将其通过路由器逐跳转发至目的地。

网络层有两个关键功能:

  • 控制平面(路由):这是一个分布式算法过程,用于确定数据包从源到目的地的最佳路径。所有路由器通过交换信息来构建转发表
  • 数据平面(转发):这是每个路由器对到达的每个数据包执行的操作。路由器查看数据包头部的信息,查询转发表,以决定从哪个出站链路发送该数据包。

网络层服务模型:数据报与虚电路

网络层可以分为两种服务模型:无连接的数据报网络和面向连接的虚电路网络。这是一个在网络构建时就确定的基础架构选择,而非应用程序可选的。

数据报(分组交换)网络

在数据报网络中,没有连接的概念,每个数据包都被独立处理。数据包头包含目标主机的全局唯一地址。每个路由器根据该地址和自身的转发表,独立决定每个数据包的转发路径。这意味着同一数据流的不同数据包可能通过不同路径到达目的地。

以下是数据报网络转发表的一个简化示例:

目标地址范围         -> 出站链路
11001000 00010111 0001**** ******** -> 接口 0
11001000 00010111 0001100* ******** -> 接口 1
200.23.16.0/20      -> 接口 2

(其中 * 表示“任意”比特)

虚电路网络

在虚电路网络中,数据传输前需要先建立一条端到端的路径(虚电路)。建立过程中,沿途路由器会记录连接状态。数据包头部携带的不是目标主机地址,而是虚电路标识符。每个路由器根据数据包到达的链路和其VCI,查找转发表,决定转发链路并更新VCI。

以下是虚电路网络转发表的一个示例:

入站链路 | 入站VCI -> 出站链路 | 出站VCI
   1    |   12   ->     2     |   22
   2    |   63   ->     1     |   18
   1    |   58   ->     3     |   17

使用每段链路独立的VCI,而非全局唯一标识符,简化了协调工作。

互联网协议(IP)

互联网是一个数据报网络,其网络层协议是互联网协议。目前广泛使用的是IPv4,我们正在向IPv6过渡。

IPv4数据包格式

IPv4头部具有固定格式,包含多个字段。以下是关键字段的说明:

  • 版本:4比特,对于IPv4,此值为 4
  • 头部长度:4比特,以32比特字为单位指示IP头部的长度。因为头部可能包含可变长的选项字段。
  • 服务类型:8比特,原用于区分服务(如优先级),但未广泛使用。
  • 数据报总长度:16比特,定义整个数据包(头部+数据)的长度,单位是字节。最大理论值为65535字节。
  • 标识、标志、片偏移:这三个字段用于管理分片,我们稍后详细讨论。
  • 生存时间:8比特,数据包每经过一个路由器,此值减1。当TTL为0时,数据包被丢弃。这用于防止因路由环路导致数据包无限循环。
  • 上层协议:8比特,指示数据部分应交给哪个上层协议(如TCP=6,UDP=17)。
  • 头部校验和:16比特,仅针对IP头部计算校验和,用于检测头部传输错误。每个路由器在修改头部(如递减TTL)后都必须重新计算。
  • 源IP地址和目标IP地址:各32比特,数据包的发送方和接收方的逻辑地址。
  • 选项:可变长,很少使用,因为对高速路由器处理不友好。
  • 数据:承载传输层段(如TCP段、UDP数据报)或其他数据。

IP分片

数据链路层有最大传输单元的限制。当路由器收到的IP数据包大于其出站链路的MTU时,就需要进行分片

分片涉及以下头部字段:

  • 标识:发送主机或分片路由器为原始数据包分配的唯一ID,所有属于该数据包的片段都携带相同的ID。
  • 标志
    • DF:不分片。如果设置,路由器不能分片,只能丢弃并返回错误。
    • MF:更多分片。除最后一个片段外,其他所有片段都设置此位为1。
  • 片偏移:13比特,指示本片段的数据在原始数据包数据部分中的起始位置,单位是8字节

分片示例
假设一个1500字节的数据包(20字节头部 + 1480字节数据)到达一个路由器,需要从MTU为536字节的链路发出。

  1. 每个片段需要自己的20字节IP头部。
  2. 每个片段的数据部分最大为 536 - 20 = 516 字节。但片偏移以8字节为单位,因此实际取 512 字节(512是8的倍数)。
  3. 因此,生成三个片段:
    • 片段1:偏移=0,MF=1,数据长度=512
    • 片段2:偏移=64(512/8),MF=1,数据长度=512
    • 片段3:偏移=128(1024/8),MF=0,数据长度=456(1480-512-512)
  4. 所有片段共享相同的标识符。

重要说明

  • 分片重组在目的主机进行,而非中间路由器。
  • 网络层不提供可靠性。如果任何一个片段丢失,整个原始数据包都将被丢弃。
  • 分片被认为效率低下且存在安全隐患,因此IPv6已取消分片功能。在IPv6中,如果数据包太大,路由器会丢弃它并向源主机发送错误消息,由源主机调整数据包大小。

IP寻址与子网

IP地址是分层的32比特标识符,通常写作点分十进制形式(如 192.168.1.1)。它分为两部分:

  • 网络部分(前缀):标识主机所属的网络。
  • 主机部分:标识该网络内的特定主机。

这种结构有助于路由聚合,减少转发表大小。

我们使用无类别域间路由表示法来指定地址范围:
200.23.16.0/20
这表示前20比特是网络前缀,剩下的12比特用于主机,总共可以容纳 2^12 = 4096 个地址(实际可用略少)。

最长前缀匹配
路由器转发表由许多此类前缀条目组成。当一个数据包到达时,其目标地址可能与多个前缀条目匹配。路由器遵循最长前缀匹配规则:选择前缀长度最长(即最具体)的条目进行转发。

示例转发表

目标网络         -> 出站接口
200.23.16.0/20  -> 接口0
200.23.16.0/23  -> 接口1

对于目标地址 200.23.17.1,它同时匹配 /20/23 两个条目。根据最长前缀匹配规则,路由器会选择 /23 的条目,通过接口1转发。

CIDR和最长前缀匹配支持强大的路由聚合,允许将多个连续的小网络地址块合并为一个大的网络前缀进行通告,从而显著减少全球路由表的规模。

总结

本节课我们一起学习了计算机网络中的网络层。我们了解了网络层在主机间提供逻辑连接的核心使命,区分了控制平面的路由和数据平面的转发。我们深入探讨了两种网络服务模型:无连接的数据报网络(如互联网)和面向连接的虚电路网络,并分析了它们的工作原理和寻址差异。

我们重点研究了互联网协议,详细解析了IPv4数据包的格式、各字段功能,特别是分片机制的原理与过程。最后,我们学习了IP的分层寻址方案、CIDR表示法以及路由器转发时使用的最长前缀匹配规则,这些是互联网能够高效、可扩展运行的基础。在下一讲中,我们将继续学习与IP配套的网际控制报文协议

15:路由算法

在本节课中,我们将学习网络层的核心功能之一:路由。我们将探讨路由器如何决定数据包从源到目的地的路径,并学习两种主要的路由算法类别:链路状态算法和距离向量算法。


概述:网络层与路由

上一节我们介绍了网络层的转发功能。本节中,我们来看看驱动转发决策的另一个关键过程:路由。

路由过程负责构建和维护路由器的转发表。它需要解决一个核心问题:在由众多路由器(节点)和连接(边)构成的网络图中,如何找到从源节点到目的节点的最低成本路径?这里的“成本”可以抽象为延迟、带宽开销或实际费用。

为了理解路由,我们将网络抽象为一个图 G = (N, E),其中:

  • N 是节点(路由器)的集合。
  • E 是边(链路)的集合。
  • 每条边 (u, v) 都有一个关联的成本 c(u, v)。如果两个节点间没有直接连接,则成本为

一条路径的成本是其所有链路成本之和。路由算法的目标就是为每个源节点找到到达所有其他目的节点的最低成本路径,并确定转发表中的“下一跳”。


链路状态路由算法

链路状态算法要求每个路由器都拥有整个网络的全局信息,即完整的网络拓扑图和所有链路的成本。路由器通过一种称为泛洪的机制来交换和同步这些信息。一旦所有路由器都拥有了相同的全局视图,它们就可以独立地运行相同的确定性算法来计算最短路径。

最著名的链路状态算法是迪杰斯特拉算法。这是一个迭代算法,从一个源节点开始,逐步确定到达所有其他节点的最短路径。

以下是算法步骤的简要介绍:

  1. 初始化

    • N‘ 为已知最短路径的节点集合。初始时,N‘ = {u},其中 u 是源节点。
    • 对于每个节点 v,记录当前已知的从 u 到 v 的最低成本估计 D(v) 和路径上的前驱节点 p(v)
      • 对于 u 的直接邻居 v:D(v) = c(u, v), p(v) = u
      • 对于其他节点:D(v) = ∞, p(v) = null
  2. 迭代循环

    • 加入 N‘ 的节点中,找出 D(w) 值最小的节点 w。
    • 将 w 加入 N‘。此时,D(w) 就是从 u 到 w 的最终最低成本。
    • 检查 w 的每个邻居 v。
      • 如果 D(w) + c(w, v) < D(v),则更新:D(v) = D(w) + c(w, v),并设置 p(v) = w
    • 重复此循环,直到 N‘ 包含所有节点。

算法结束后,通过回溯每个节点的前驱节点 p(v),可以构建出一棵以源节点 u 为根的最短路径树。转发表则通过这棵树来确定:要到达目的节点 v,数据包应发送给哪个下一跳邻居(即路径上 u 的第一个邻居)。

复杂度:使用最小堆等数据结构优化查找最小 D(w) 的过程后,算法复杂度为 O(n log n),其中 n 是网络中的节点数。

链路状态算法对网络变化反应较慢,因为任何链路成本的变化都需要重新泛洪拓扑信息,然后所有路由器重新运行迪杰斯特拉算法。


距离向量路由算法

与需要全局知识的链路状态算法不同,距离向量算法是分布式迭代式的。每个路由器开始时只了解直接相连的邻居及其链路成本。

其核心思想是邻居间交换路由信息。每个路由器维护一个距离向量,即一个列表,记录它自己计算出的、到达网络中所有已知目的节点的最低成本估计。路由器会定期或当成本变化时,将自己的距离向量发送给所有直接邻居。

当路由器从邻居收到一个新的距离向量时,它会使用贝尔曼-福特方程来更新自己的路由表:

D_x(y) = min_v { c(x, v) + D_v(y) }

其中:

  • D_x(y):节点 x 计算出的到达节点 y 的最低成本。
  • c(x, v):节点 x 到其邻居 v 的直接链路成本。
  • D_v(y):邻居 v 告知的、它自己到达节点 y 的成本。
  • min_v:遍历 x 的所有邻居 v,取最小值。

这个方程的含义是:“如果我要去 y,我可以先到邻居 v,成本是 c(x, v),然后按照 v 说的路线去 y,成本是 D_v(y)。我对所有邻居 v 都这么算一遍,选总成本最小的那条路。”

算法动态性与问题

距离向量算法是持续运行的。好消息(如成本降低)会快速传播。然而,它存在“坏消息传播慢”的问题,也称为“计数到无穷大”。

考虑一个简单网络:X—Y—Z。假设 X-Y 链路成本从 4 剧增到 60。Y 无法立刻感知到直达 X 的路径变差,因为它还记录着 Z 曾告诉它“我到 X 的成本是 5”。Y 会错误地认为通过 Z 到 X 的成本是 1+5=6(假设 Y-Z 成本为1),这比 60 好,于是 Y 更新自己的成本为 6 并告知 Z。Z 收到 Y 的 6 后,会更新自己到 X 的成本为 1+6=7,并再告知 Y…… 如此循环,成本会缓慢递增(6, 7, 8, …),直到最终超过直接链路的成本(60),过程缓慢且期间可能形成路由环路

稳定性增强技术

为了缓解上述问题,有两种常用的技术:

  • 水平分割:如果节点 A 到达目的节点 X 的最短路径经过了邻居 B,那么 A 在发送距离向量给 B 时,不包含关于 X 的路由信息。这样 B 就不会用 A 的信息来更新到 X 的路由,从而避免环路。
  • 带毒性逆转的水平分割:是水平分割的增强版。A 在发给 B 的距离向量中,仍然包含目的 X 的信息,但将其成本设置为 (或一个非常大的数)。这相当于明确告诉 B:“你不要试图通过我去 X”。这能更快地消除环路。

尽管有这些技术,在复杂的网络拓扑中,距离向量算法仍可能收敛缓慢或产生临时环路。


算法比较

上一节我们分别介绍了链路状态和距离向量算法。本节我们来总结和比较它们的特性:

  • 消息复杂度
    • 链路状态:需要 O(n * e) 条消息进行泛洪(n 节点数,e 边数),可能较多。
    • 距离向量:只在邻居间交换消息,每次交换的信息量较小,但在迭代过程中消息总数可能也不少。
  • 收敛速度
    • 链路状态:O(n log n) 算法,一旦拥有全局信息,计算速度快。
    • 距离向量:收敛时间与网络直径相关,遇到坏消息时可能很慢,存在计数到无穷大问题。
  • 健壮性
    • 链路状态:每个路由器基于全局信息独立计算,一个路由器的计算错误通常不会扩散。
    • 距离向量:一个路由器的错误信息(如过低的成本)会传播给邻居,并可能扩散到整个网络,影响范围广。

在实际的互联网中,这两种思想都有应用。通常,在一个自治系统内部(如一个大学或公司的网络),常使用基于链路状态算法的协议(如 OSPF)。而在不同自治系统之间进行路由时,则使用基于距离向量思想增强后的路径向量协议(如 BGP)。


总结

本节课中我们一起学习了网络层路由的核心算法。我们首先将网络抽象为图,并定义了最低成本路径的路由问题。接着,我们深入探讨了两种主要的解决方案:链路状态算法(以迪杰斯特拉算法为例),它依赖全局拓扑信息;以及距离向量算法,它通过邻居间迭代交换距离向量来分布式地求解。我们分析了它们的工作原理、动态特性以及各自的优缺点(如收敛速度、健壮性和对网络变化的反应)。理解这些基础算法,是学习实际互联网路由协议(如 RIP、OSPF、BGP)的关键前提。下一节课,我们将看到这些理论如何应用于真实的网络协议之中。

16:互联网路由 🌐

在本节课中,我们将学习如何将理论上的路由算法应用于真实的互联网。我们将探讨分层路由的概念,了解不同的内部网关协议,并深入研究连接整个互联网的外部网关协议——边界网关协议。


概述

上一节我们学习了链路状态(Dijkstra算法)和距离向量(Bellman-Ford方程)等理论路由算法。本节中,我们来看看这些算法如何被实现为实际运行在互联网中的真实协议。核心挑战在于互联网的规模组织自治性。为了解决这些问题,我们引入了分层路由的概念。


分层路由与自治系统

互联网规模庞大,包含近70,000个不同的网络组织和约850,000台核心路由器。直接运行Dijkstra算法(复杂度为 O(N log N))是不现实的。此外,每个组织都希望自主管理自己的网络,不受单一中央机构控制。

计算机工程中解决此类问题的常用方法是引入层次结构。在互联网路由中,我们采用两层结构:

  1. 自治系统:每个组织在其网络内部自主运行,称为一个自治系统。
  2. 系统间路由:使用统一的协议将各个AS连接起来。

自治系统 是指运行大型网络并需要做出路由决策的组织,例如互联网服务提供商、大公司或大学校园。每个AS会被分配一个唯一的AS编号。例如,卡内基梅隆大学的AS编号是9。

并非所有网络都是AS。如果一个网络只有单一的上游连接(例如家庭网络),它就不需要成为AS,其IP地址范围会被包含在其上游ISP的AS中。


内部网关协议

在AS内部,用于决定如何路由数据包的协议称为内部网关协议。以下是几种常见的IGP:

链路状态协议

这类协议基于Dijkstra算法。

开放最短路径优先
OSPF将Dijkstra算法封装成一个协议。它是开放标准,消息直接封装在IP包中(使用独立的协议号),并内置了可靠性和错误纠正机制。网络管理员可以自主设置链路权重。OSPF还通过划分区域来解决大规模网络的管理问题,各个区域通过一个骨干区域连接,只在区域内进行链路状态泛洪和计算。

中间系统到中间系统
IS-IS是另一种链路状态协议,在大型电信ISP中更常见。它同样是标准协议,并针对大规模网络进行了优化,旨在减少消息开销。

距离向量协议

这类协议基于Bellman-Ford算法。

路由信息协议
RIP是一个简单、历史悠久的距离向量协议。它假设所有链路成本为1(即跳数),并且路径最大成本不能超过15(4位字段限制),因此只适用于小型网络。RIP路由器每30秒向邻居发送一次更新,这些更新也充当故障检测的“心跳”信号。RIP消息通过UDP端口520发送,这意味着路由守护进程运行在应用层,计算完成后将路由条目写入网络层的转发表。

增强型内部网关路由协议
EIGRP是思科开发的专有协议,后来也被标准化。它同样是距离向量算法,但宣传其收敛速度更快,占用路由器资源更少。


外部网关协议:边界网关协议

AS之间用于交换网络可达性信息的协议称为外部网关协议。互联网上实际运行的唯一EGP是边界网关协议

BGP的核心任务是让网络能够通告其IP前缀,并使这些通告能在AS之间传播,从而让整个互联网知道如何到达某个网络。由于一个AS可能从多个邻居收到通往同一目的地的通告,因此BGP通告中包含了丰富的属性,用于基于策略(而不仅仅是性能)做出路由选择。

BGP被称为路径向量协议。它不通告成本,而是通告完整的AS路径列表,这有助于检测和防止路由环路。

BGP工作原理

  1. BGP会话:两个AS的边界路由器通过直接连接建立BGP会话,使用TCP(端口179)来可靠地交换BGP消息。
  2. BGP消息类型
    • OPEN:建立会话。
    • UPDATE:最重要的消息,用于通告撤销路由。
    • KEEPALIVE:维持会话,兼作故障检测。
    • NOTIFICATION:优雅地关闭会话或报告错误。
  3. 内部BGP:为了将从一个邻居学到的路由传递给其他邻居,一个AS内部的所有边界路由器之间也需要运行BGP,这称为iBGP。它与eBGP在细节上略有不同,主要用于区分信息来自内部还是外部。

关键BGP属性

UPDATE消息中,前缀会附带多个属性,用于决策:

  1. AS_PATH 🛣️:列出到达该前缀需要经过的AS编号序列。这是路径向量的核心,用于避免环路和进行路由选择。
  2. NEXT_HOP ➡️:指明发送往该前缀的流量应转发到的下一跳IP地址。这是分层路由能工作的关键,AS内部的路由器依靠IGP来学习如何到达这个NEXT_HOP地址。
  3. MULTI_EXIT_DISC ⚖️:仅在两个AS之间存在多条连接时使用。用于向邻居“礼貌地”建议优先使用哪条入口链路,而不是默认的“热土豆路由”(尽快将流量送出本AS)。
  4. LOCAL_PREF ⭐:由本地网络管理员设置的一个优先级数值,用于明确指示本AS内的路由器优先选择哪条路由。这是非常强力的策略控制工具。

路由选择过程

当一个AS的边界路由器从不同邻居收到通往同一前缀的多个BGP通告时,它会按照一个固定的顺序比较属性来选择最佳路径。一个简化的决策顺序如下:

  1. 丢弃下一跳不可达的路由。
  2. 选择 LOCAL_PREF 值最高的路由。
  3. 选择 AS_PATH 最短的路由。
  4. 选择 MULTI_EXIT_DISC 值最低的路由。
  5. 优先选择通过eBGP学到的路由(而非iBGP)。
  6. 选择到NEXT_HOP成本最低的路由(即“热土豆路由”)。
  7. 如果仍持平,则使用BGP路由器ID等附加条件打破平局。

BGP的安全与挑战

BGP的复杂性使其容易因配置错误或恶意攻击而出错,例如路由劫持,即错误地通告不属于自己的IP前缀,从而将流量引向他处。历史上发生过多次此类事件,导致大型互联网服务中断。

防御措施包括:

  • 资源公钥基础设施:为BGP通告提供加密验证。
  • TTL安全机制:一种巧妙的“黑客”方法,检查BGP消息IP包的TTL值,确保它来自直接邻居,而非被转发多次的伪造源。

总结

本节课中,我们一起学习了互联网路由的实际实现。我们从分层路由自治系统的概念出发,理解了互联网如何通过划分管理域来应对规模和自治性挑战。我们探讨了多种内部网关协议,如OSPF、IS-IS、RIP和EIGRP,它们允许每个AS内部自主决定路由。最后,我们深入研究了边界网关协议,这个复杂但至关重要的外部网关协议,它通过交换包含丰富属性(如AS_PATH、NEXT_HOP)的通告,将全球数以万计的AS连接起来,并在很大程度上依赖于商业策略来进行路由决策。理解BGP是理解互联网核心运作机制的关键。

17:即插即用网络与IPv6

在本节课中,我们将完成网络层剩余的几个重要主题。这些技术虽然相对独立,但共同构成了现代网络“即插即用”能力的基础,极大地简化了用户接入网络的复杂度。我们将主要探讨三个关键技术:动态主机配置协议、网络地址转换以及下一代互联网协议IPv6。

课程管理与复习

在深入技术内容之前,有几个管理事项需要说明。

首先,下周将进行第二次测验。测验将在下周二进行,形式与上次相同,为闭卷考试,时长为75分钟。测验题目将严格基于每节课幻灯片末尾列出的“课程目标”。我建议各位以此为指导进行复习。

本周末将安排一次复习课,具体时间和地点已在Piazza上公布。此外,在测验前我们仍会安排答疑时间。如果大家有任何问题,可以通过Piazza提问或邮件预约时间。

其次,请注意课程日程。测验之后将有几篇论文阅读任务需要提交。同时,第二次作业已经发布,截止日期在一个月后。这次作业涉及使用软件工具分析大型数据集,建议尽早开始准备。

动态主机配置协议

上一节我们回顾了网络层的基本路由机制。本节中,我们来看看如何让一台新设备自动、便捷地加入网络,这正是DHCP的核心使命。

DHCP旨在使加入网络的过程变得简单、自然且自动化。它为新加入网络的计算机提供必要的配置数据包。

以下是设备加入网络时通常需要的关键信息:

  • IP地址:设备在特定子网中使用的唯一地址。由于路由的层次性,设备不能随意使用IP地址,必须使用本地子网认可的地址。
  • 默认网关:数据包离开本地子网时需要经过的路由器地址。
  • 子网掩码:用于确定本地网络的IP地址前缀长度。
  • DNS服务器:用于域名解析的本地DNS服务器地址。

DHCP的工作过程是一个典型的“引导”过程。新启动的客户端对网络一无所知,因此它通过广播发送DHCP Discover消息来寻找DHCP服务器。网络中的DHCP服务器收到请求后,会以DHCP Offer消息进行响应,提供一个可用的IP地址及其他配置信息。客户端选择一个Offer后,发送DHCP Request消息进行确认,服务器最终回复DHCP Ack完成分配。

为了高效管理有限的IP地址资源,DHCP采用了租约机制。服务器分配给客户端的IP地址具有一个有效期(例如30分钟)。租约到期前,客户端可以请求续租;到期后,服务器会回收该地址并可能分配给其他设备。

关于DHCP,有几点需要注意:

  • 安全性:DHCP协议本身缺乏强大的安全机制,理论上可能存在恶意服务器响应或客户端耗尽地址池的攻击。
  • 重要性:尽管存在限制,DHCP极大地简化了网络配置,是使互联网对普通用户变得友好的关键技术之一。

网络地址转换

我们了解了DHCP如何为设备分配内部地址。接下来,我们看看NAT如何让使用私有地址的多个设备共享一个公有IP地址与外部互联网通信。

NAT通常部署在家庭或企业网络的边界路由器上。其核心思想是:内部网络使用私有(不可路由)的IP地址范围(如192.168.x.x),而对外则呈现为一个或多个公有IP地址。

NAT的工作机制涉及地址和端口的重写。当内部主机发送数据包到外部网络时,NAT设备会进行以下操作:

  1. 将数据包源IP地址从私有地址(如192.168.1.2)替换为NAT设备的公有IP地址(如128.2.0.250)。
  2. 同时,通常会重写源端口号,并将其映射关系记录在一个内部状态表中。
  3. 当外部服务器返回响应数据包时,NAT设备根据目的端口号查询状态表,确定应将数据包转发给哪个内部主机,并重写目的IP和端口。

NAT的优点包括:

  • 缓解地址耗尽:允许多个设备共享一个公有IP地址。
  • 简化地址管理:用户无需为每台新设备向ISP申请新的公有IP。

然而,NAT也带来了诸多问题和争议:

  • 违背端到端原则:网络中间设备(NAT)需要维护连接状态并解析高层协议(如端口号),破坏了网络层的简单性。
  • 破坏协议兼容性:某些协议(如FTP、SIP)在应用层数据中嵌入IP地址,NAT设备需要识别并修改这些内容,处理复杂且可能失败(尤其是数据加密时)。
  • 阻碍端到端连接:外部主机难以主动发起与NAT内部主机的连接,通常需要借助端口转发或第三方中继服务。

尽管存在这些缺陷,由于其实用性,NAT在IPv4网络中被广泛部署。

互联网协议第6版

既然NAT主要用于解决IPv4地址不足的问题,那么最根本的解决方案是什么呢?这就是我们最后要探讨的IPv6。

IPv6的设计主要为了解决IPv4地址耗尽问题,同时也对协议头部进行了简化和改进。

最显著的变化是地址空间的极大扩展。IPv6地址长度为128位,其数量极其庞大。地址书写采用十六进制,以冒号分隔,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334。为了简洁,可以省略前导零,并用::表示连续的多组零。

IPv6的协议头部也更加精简高效:

  • 固定长度:基本头部长度为40字节,处理更快速。
  • 字段简化:移除了IPv4中的首部校验和、分片相关字段(鼓励在端系统进行分片)等。
  • 改进的选项处理:通过“下一个首部”字段链式组织扩展选项,更加灵活。

IPv6的一个实用特性是无状态地址自动配置。设备可以利用其唯一的标识符(如MAC地址)和固定的本地链路前缀(fe80::/10),自动生成一个本地链路IPv6地址,无需DHCP服务器即可在本地网络通信。这进一步体现了“即插即用”的理念。

总结

本节课中,我们一起学习了三项关键的“即插即用”网络技术。

  1. DHCP:自动为网络设备分配IP地址等配置信息,极大简化了网络接入。
  2. NAT:通过地址转换,让多个设备共享一个公有IP地址,缓解了IPv4地址压力,但引入了复杂性和兼容性问题。
  3. IPv6:通过庞大的128位地址空间从根本上解决地址耗尽问题,并提供了更简洁高效的协议头部和自动配置能力。

这些技术共同塑造了我们今天所体验的便捷、易用的互联网环境。尽管IPv6的全面普及仍在进行中,但理解这些基础协议的工作原理对于深入理解计算机网络至关重要。

18:第二次测验复习课

在本节课中,我们将一起回顾第二次测验可能涉及的核心概念。我们将通过分析助教提供的几道样题,来梳理距离向量路由、BGP协议以及可靠数据传输等关键知识点。请注意,本次复习涵盖的题目仅作为示例,测验范围可能更广。


问题 P9:毒性逆转

上一节我们介绍了复习课的目标,现在让我们来看第一个关于路由协议的问题。

毒性逆转是距离向量路由协议中用于解决计数到无穷问题的一种技术。它的核心思想是:当一个路由器通过某个邻居得知到达目的网络的最佳路径时,它会向该邻居通告到达该目的网络的距离为无穷大(例如,在RIP中是16),从而阻止该邻居选择通过自己再回到目的地的路径,以此打破路由环路。

以下是关于毒性逆转有效性的一道判断题:

毒性逆转通常能解决计数到无穷问题。

请思考:这个说法是否正确?请说明你的理由。

分析与讨论
毒性逆转在特定网络拓扑场景下能有效防止计数到无穷问题。它通过向产生最佳路径的邻居发送“毒化”更新,切断了环路形成的可能。然而,它并非适用于所有场景的通用解决方案。在更复杂的网络拓扑中(例如涉及三个或更多节点的环路),仍然可能产生计数到无穷问题。因此,该说法是有条件成立的


问题 P14 & P15:BGP 路由传播与选路

在了解了毒性逆转的局限性后,本节我们将深入探讨自治系统间的路由协议——BGP。

以下问题基于一个包含四个自治系统(AS1, AS2, AS3, AS4)的网络。前缀 x 起源于 AS4 中的路由器 4a。各AS内部运行IGP(OSPF或RIP),AS间运行BGP。

问题 P14:路由学习协议

路由器通过何种协议学习到前缀 x 的可达性?

  1. 路由器 3c 学习到 x 的协议是:eBGP。因为 3c 是AS3的边界路由器,它直接从邻居AS(AS4)的边界路由器 4a 通过外部BGP学习该路由。
  2. 路由器 3a 学习到 x 的协议是:iBGP3a 也是AS3的边界路由器。它从本AS内的另一个边界路由器 3c 通过内部BGP(iBGP)学习该路由。iBGP消息通过AS3的内部网络(由 3b 转发)传递,但 3b 本身不运行BGP。
  3. 路由器 1c 学习到 x 的协议是:eBGP1c 是AS1的边界路由器,它从邻居AS(AS2)的边界路由器 2c 通过外部BGP学习该路由。
  4. 路由器 1d 学习到 x 的协议是:RIP1d 是AS1的内部路由器,不运行BGP。它通过AS1内部运行的IGP(本例中为RIP)从本AS的边界路由器(如 1c)学习到该路由。

关键点:BGP路由在AS内部通过iBGP在边界路由器间传播,再通过IGP分发给内部路由器。

问题 P15:BGP 路由选择

现在,我们聚焦于路由器 1d 的路由选择。1d 有两个接口(I1, I2)可以学习到前缀 x 的BGP通告。假设所有链路开销相同,BGP属性也类似。

BGP使用一个路由选择算法来决定最佳路径。该算法按顺序检查以下属性,直到打破平局:

  1. 最高本地优先级(Local Pref)
  2. 最短AS路径(AS Path)
  3. 最低起源类型(Origin)
  4. 最低MED值
  5. eBGP路径优于iBGP路径
  6. 到达下一跳的IGP开销最低
  7. ...(后续步骤)

问题

  • A部分:当 1d 仅从 I1(通过 AS2, AS3, AS4)和 I2(通过 AS2, AS4)学习到 x 时,它会选择哪个接口?答案是 I2,因为其AS路径更短(2跳 vs 3跳)。
  • B部分:如果新增一条从 4a 直接到 2c 的链路(图中虚线),1d 现在可以通过 I2 学习到路径 AS2, AS5, AS4。此时会选择哪个接口?答案是 I2,因为AS路径长度仍为3跳(与I1相同),需要进入下一步判断。根据常见配置和算法,通常eBGP路径(I2)会优于通过iBGP学到的路径(I1,如果AS2内是iBGP传播),或者比较MED等属性。但根据给定信息,最可能的选择仍是I2。
  • C部分:要使 1d 选择 I1 的路径,需要满足什么条件?需要让通过 I1 的路径在BGP选路规则中优于 I2 的路径。例如,可以为通过 I1 的路径设置更高的本地优先级(Local Pref),这是BGP选路中优先级最高的属性。

核心概念:BGP选路不是基于端到端的跳数,而是基于一系列路径属性,其中AS路径长度是早期且重要的比较因素


距离向量路由计算

从AS间的路由回到AS内部,我们复习一下距离向量算法。这是距离向量路由协议(如RIP)的核心。

考虑一个网络子集,节点 x 需要计算到达节点 u 的最短路径成本。已知:

  • x 到邻居 w 的成本 c(x,w) = 2
  • x 到邻居 y 的成本 c(x,y) = 5
  • w 通告其到 u 的距离 d(w,u) = 5
  • y 通告其到 u 的距离 d(y,u) = 6

贝尔曼-福特方程用于计算最短路径成本:
d(x,u) = min{ c(x,w) + d(w,u), c(x,y) + d(y,u) }

A部分:计算当前成本
代入数值:min{2+5, 5+6} = min{7, 11} = 7
因此,xu 的当前最短路径成本为 7,下一跳是 w

B部分:何时会触发更新?
如果 xu 的成本发生变化,x 会通知其邻居。根据方程:

  • 若降低 c(x,w) 使其小于等于1,则新成本 ≤ 1+5 = 6,路径仍经 w,但成本值变化,触发更新。
  • 若增加 c(x,w) 使其大于6,则路径将切换至 y(成本 5+6=11),触发更新。
  • 若调整 c(x,y),只要不使 5 + d(y,u) 小于7,就不会改变当前最优路径(仍为经 w 的7),因此不会触发更新。例如,将 c(x,y) 增加到任意值,或减少到不低于2(因为 2+6=8 > 7),均无影响。

C部分:何时不会触发更新?
如B部分所述,增加 c(x,y) 到任何值,或减少 c(x,y) 但保持 c(x,y) + 6 ≥ 7,都不会改变 xu 的最优路径选择,因此不会触发更新。


可靠数据传输协议比较

最后,我们比较三种可靠数据传输协议:回退N步(GBN)、选择重传(SR)和TCP。这是理解可靠通信机制的关键。

考虑一个场景:发送方窗口大小为4,序列号空间足够大。接收方期望收到序列号 k。所有数据段长度相同。

窗口序列号范围

发送方窗口可能包含哪些序列号?

  • 最坏情况:接收方期望 k,意味着 k-1 已收到且确认已发出,但确认可能丢失或在途中。因此,发送方可能仍在重传 k-1 及之前的段。同时,窗口可能包含新的段。因此,最坏情况下,窗口可能是 [k-4, k-1](即四个未确认的旧段)。
  • 最好情况:接收方期望 k,且发送方刚刚发送了序列号为 k 的新段。因此,窗口可能是 [k, k+3](即四个新段)。

协议行为与效率分析

假设发送方发送了5个段:1,2,3,4,5。其中段 2 丢失。各协议的超时时间均远大于5个RTT。

以下是各协议的行为:

  1. 回退N步(GBN)

    • 接收方无缓存。收到段 3,4,5 时,由于期望的是 2,因此将其丢弃,并重复发送对段 1 的确认。
    • 发送方最终因段 2 超时而重传段 2,3,4,5
    • 总发送段数:5(初始) + 4(重传) = 9个段
  2. 选择重传(SR)

    • 接收方有缓存。收到段 3,4,5 时,将其缓存,并发送对段 1 的确认。
    • 发送方最终因段 2 超时而仅重传段 2
    • 总发送段数:5(初始) + 1(重传) = 6个段
  3. TCP(启用快速重传)

    • 接收方有缓存,行为类似SR。
    • 关键区别:TCP有快速重传机制。当发送方收到3个重复确认(对段 1)时,它会在超时之前就重传段 2,而不必等待超时。
    • 因此,在超时发生前,段 2 已被重传并送达,后续传输正常。
    • 总发送段数:5(初始) + 1(快速重传) = 6个段
    • 交付数据速度:由于快速重传,TCP最快,因为它减少了等待超时的延迟。GBN和SR必须等待超时。

核心概念:TCP通过快速重传机制,在检测到丢包(通过重复确认)时能更快地恢复,从而比必须依赖超时的GBN和SR协议更高效。


总结与答疑

本节课中,我们一起学习了以下核心内容:

  1. 毒性逆转:一种用于缓解计数到无穷问题的技术,但其效果受网络拓扑限制。
  2. BGP协议
    • 路由在AS间通过eBGP传播,在AS内通过iBGP在边界路由器间传播,再通过IGP到达内部路由器。
    • BGP使用一个多属性的路由选择算法,其中AS路径长度是重要的比较指标。
  3. 距离向量路由:使用贝尔曼-福特方程计算最短路径,路径成本的改变是否触发更新取决于是否改变了当前的最优路径选择。
  4. 可靠数据传输协议:比较了GBN、SR和TCP在丢包场景下的行为。TCP凭借快速重传机制,在效率上具有优势。

在最后的答疑环节,讨论还涉及了以下要点:

  • ICMP Ping重复应答的可能原因(如数据包被复制并沿不同路径返回)。
  • 距离向量算法中,每轮更新基于当前从邻居接收到的信息,而非部分更新后的中间结果。
  • TCP连接中,初始序列号随机生成,确认号指向期望接收的下一个字节序号。在已建立的连接中,确认号与之前交换的数据长度有关。

希望本次复习课能帮助你巩固这些重要的网络概念。祝大家在测验中取得好成绩!

19:网络测量

概述

在本节课中,我们将学习网络测量的基本概念、目的以及常用的工具。网络测量帮助我们理解网络的动态行为,进行短期监控和长期规划,是网络管理和研究的基础。

为什么需要网络测量

网络是一个动态变化的系统。为了理解网络状态并做出决策,我们需要进行测量。网络测量主要有两个目的:短期监控和长期规划。

短期监控帮助我们了解网络的实时状态,例如是否存在拥塞或异常事件。这些异常事件可能是正常的流量激增,也可能是恶意的安全攻击,如拒绝服务攻击。

长期规划,也称为流量工程,涉及根据历史数据调整网络。这可能包括修改路由规则、升级链路或建立新的对等连接。这些决策都需要基于准确的测量数据。

网络测量的两种方法

网络测量主要分为被动测量和主动测量。

被动测量通过观察网络中已有的流量来进行,不改变流量本身。这种方法通常部署在路由器上,用于收集生产网络的流量特征。

主动测量则需要向网络注入探测流量,通过分析这些流量的变化来推断网络特性。例如,traceroute 工具就是通过发送探测包来测量路径和延迟。

常用测量工具介绍

以下是几种常见的网络测量工具及其特点。

数据包捕获

数据包捕获工具,如 Wireshark,会复制流经某一点的所有网络数据包并存储下来,形成数据包追踪文件。这种方法可以查看所有细节,但也存在隐私问题、数据量巨大以及硬件性能限制等挑战。

简单网络管理协议

简单网络管理协议 是一种用于网络管理的协议族。它允许管理员查询网络设备(如路由器)的统计信息,例如字节计数和包计数。SNMP 定义了一个管理信息库,用于标准化不同设备的信息访问。这些数据常用于计费和网络状态监控,并可通过多路由器流量图示器 等工具进行可视化。

NetFlow 与流量分析

NetFlow 是一种用于分析网络流量流的工具。它将具有相同特征(如源/目的IP、协议、端口等)的数据包归类为一个“流”,并为每个流记录统计信息。

一个流可以通过以下七元组定义:
(源IP, 目的IP, 协议类型, 服务类型, 源端口, 目的端口, 输入接口)

路由器收集流记录后,可以将其导出到收集器进行分析。这有助于构建流量矩阵,了解网络中不同源和目的地之间的流量模式,对于流量工程和业务决策至关重要。NetFlow 最初是 Cisco 为提高路由器转发性能而设计的缓存机制,后来演变为流量分析工具。

工具的选择与限制

选择测量工具时,需要考虑网络规模和需求。大型服务提供商需要 NetFlow 等工具进行精细的流量工程和计费。而像大学校园网这样的边缘网络,由于结构相对简单、业务决策需求不同,可能不会广泛部署此类复杂工具。

所有工具都受到硬件性能(CPU、内存、带宽)的限制,因此在处理高速链路时可能需要进行数据包采样或流聚合。

总结

本节课我们一起学习了网络测量的重要性,区分了被动测量与主动测量,并介绍了数据包捕获、SNMP 和 NetFlow 等核心工具及其应用场景。理解这些工具的原理和用途,将帮助你在进行网络分析、故障排查和规划时,选择合适的方法并解读测量数据。

20:拥塞控制 - 路由器的视角 👁️

在本节课中,我们将学习路由器如何通过管理队列和丢弃策略来参与网络拥塞控制。我们将探讨几种不同的队列调度算法,并深入理解随机早期检测算法的工作原理。

概述

之前我们讨论了TCP端到端的拥塞控制机制。本节我们将视角转向网络内部,看看路由器本身能做些什么来管理拥塞。路由器通过其队列调度和丢包策略,可以主动影响网络流量,避免或缓解拥塞。

队列调度与丢包策略

当多个数据包需要从同一个输出链路发送时,路由器必须决定发送顺序,这称为包调度。当路由器内存已满,无法容纳新到达的数据包时,它必须决定丢弃哪个包,这称为丢包策略。这些选择会影响不同数据流的性能。

以下是路由器可以采用的几种主要队列调度算法。

先进先出队列

这是最常见、最直观的队列方式,类似于人类排队。数据包按照到达顺序进入队列,也按照相同顺序被发送。

  • 调度方式:队列最前面的数据包下一个被发送。
  • 特点:实现简单,但所有数据包被同等对待,没有优先级区分。

优先级队列

为了解决某些数据包比另一些更重要的问题,路由器可以将队列分为多个优先级队列。

  • 工作方式:数据包根据其优先级标签进入相应队列。路由器总是先发送高优先级队列中的所有数据包,只有当高优先级队列为空时,才处理中优先级队列,以此类推。
  • 优点:可以确保重要流量(如路由协议BGP的数据包)获得低延迟。
  • 挑战:如何确定和分配优先级是一个难题。低优先级流量可能因持续的高优先级流量而“饿死”。由于互联网的去中心化特性,很难建立一个全局、可计费的优先级体系。

轮询队列

为了在多个数据流之间实现公平性,轮询队列为每个活跃的数据流维护一个独立的队列。

  • 工作方式:路由器依次从每个非空队列中取出一个数据包进行发送,然后循环回到第一个队列。
  • 目标:确保每个数据流都能获得发送机会。
  • 问题:如果不同数据流发送的数据包大小不同,那么发送大包的数据流将占用更多带宽,这从比特级别的角度看并不公平。

公平队列

公平队列是对轮询队列的改进,旨在实现比特级别的公平性,而不仅仅是数据包数量的公平。

  • 核心思想:模拟“逐比特轮询”的过程。路由器为每个数据包计算一个“虚拟完成时间”,这个时间是基于如果以逐比特交替发送的方式,该数据包何时能发送完毕。
  • 调度方式:路由器总是选择虚拟完成时间最早的数据包进行发送。
  • 结果:无论数据包大小如何,每个数据流长期来看都能获得大致相等的带宽份额。这种特性被称为最大最小公平性,它最大化了一个数据流所能获得的最小带宽。

加权公平队列

这是公平队列的扩展,允许为不同队列分配权重(即优先级)。

  • 工作方式:在计算虚拟完成时间时,将数据包大小除以该流的权重。权重高的流,其数据包的虚拟完成时间会更早,从而获得更多带宽。
  • 应用:可用于实现更复杂的服务质量或资源预留方案。

随机早期检测算法

上一节我们介绍了路由器管理队列的基本方法,本节我们来看看一种主动的拥塞控制机制:随机早期检测。

传统的TCP拥塞控制是反应式的,即在检测到丢包(表明已发生拥塞)后才降低发送速率。RED算法则允许路由器主动、提前地采取行动。

RED算法原理

RED是一种主动队列管理方案。路由器监控每个输出队列的平均长度,并据此决定是否丢弃(或标记)新到达的数据包,从而在队列真正溢出之前向发送方发出拥塞信号。

  • 随机:随机选择数据包进行丢弃,避免针对突发流量或同步丢弃同一流的所有包。
  • 早期:在队列完全填满之前就开始丢弃,旨在将队列长度控制在较低水平。
  • 目标:避免全局同步(所有TCP流同时进入慢启动)、减少持久排队时延,并保持高吞吐量。

RED算法工作流程

对于每个到达并确定输出端口的数据包,路由器执行以下步骤:

  1. 计算平均队列长度:使用指数加权移动平均公式来平滑瞬时队列长度的波动,避免对短暂流量突发做出过激反应。
    • 公式:avg = (1 - weight) * old_avg + weight * current_q_length
  2. 与阈值比较:设定最小阈值min_th和最大阈值max_th
    • 如果 avg < min_th:队列空闲,接纳数据包。
    • 如果 avg > max_th:队列已满,丢弃数据包。
    • 如果 min_th <= avg <= max_th:进入随机丢弃区域。
  3. 计算丢弃概率:在随机丢弃区域内,丢弃概率Pb随平均队列长度增加而线性增加。
    • 公式:Pb = max_p * (avg - min_th) / (max_th - min_th)
    • 其中max_p是最大丢弃概率参数。
  4. 最终丢弃决策:为了避免连续丢弃同一流的数据包,实际丢弃概率Pa会随着自上次丢弃后的数据包数量count增加而提高。
    • 公式:Pa = Pb / (1 - count * Pb)
    • 生成一个随机数,如果小于Pa,则丢弃(或标记)该数据包;否则,将其加入队列。

RED的优缺点与现状

  • 优点
    • 提前控制拥塞,减少因队列满导致的尾部丢弃。
    • 打破TCP流的全局同步。
    • 对突发流量相对友好。
  • 挑战与现状
    • 需要正确设置多个参数(min_th, max_th, weight, max_p)。
    • 依赖终端主机(通常是TCP)对丢包做出响应。
    • 在大规模网络中,原始RED可能响应不够快,因此出现了如WREDARED等改进版本。
    • 在现代路由器(如思科)中,RED通常作为一个可配置选项提供。

总结

本节课中,我们一起学习了路由器在拥塞控制中扮演的主动角色。

我们首先探讨了多种队列调度算法,从简单的FIFO到更公平的公平队列,理解了路由器如何通过调度决策影响流量。接着,我们深入研究了随机早期检测算法,看到了路由器如何通过监控队列状态并随机丢弃数据包,来提前向发送方发出拥塞信号,从而更有效地管理网络拥塞。

这些机制表明,通过在网络设备中实施智能策略,可以协同端到端的协议,共同构建一个更高效、更稳定的网络环境。

21:链路层与以太网

在本节课中,我们将要学习计算机网络体系结构中的链路层。我们将探讨链路层的基本职责、不同类型的链路,并深入了解以太网这一核心链路层技术的工作原理。

链路层概述

上一节我们完成了对网络层的讨论,本节中我们来看看网络栈的下一层——链路层。链路层负责在相邻节点(例如,主机到路由器、路由器到路由器)之间传输数据。这是数据在跨越整个网络的旅程中,每一跳所经历的步骤。

链路层建立在物理层之上,物理层负责传输单个比特。链路层将网络层传来的数据包封装成,并添加必要的头部和尾部信息,以确保帧能正确地从发送方传递到接收方。

链路类型与挑战

网络中的链路主要有两种类型:

  • 点对点链路:连接单一的发送方和接收方。
  • 广播链路:多个节点共享同一传输介质(如同一根电缆或同一无线频谱)。

广播链路带来了一个核心挑战:如何协调多个节点对共享介质的访问,以避免冲突(即两个帧同时发送导致信号叠加,接收方无法解析)。解决这个问题的协议称为媒体访问控制协议。

链路层的关键职责

链路层需要完成以下几项关键任务:

以下是链路层的主要职责列表:

  1. 成帧:将数据打包成帧,并添加源/目的地址等头部信息。
  2. 链路接入:通过媒体访问控制协议管理节点何时可以发送帧。
  3. 差错检测:使用如循环冗余校验等技术,检测传输过程中是否出现比特错误。CRC的计算公式通常涉及多项式除法,例如:CRC = data % generator_polynomial
  4. 差错纠正(部分协议):在错误率较高的链路上(如无线网络),发送额外冗余数据,使接收方能纠正少量错误。
  5. 可靠交付(部分协议):在易出错的链路上,实现基于确认和重传的可靠帧传输。
  6. 定义最大传输单元:每种链路技术都规定了其帧能承载的最大数据量,即MTU。例如,以太网的MTU通常是1500字节。

媒体访问控制协议

对于广播链路,需要MAC协议来协调访问。主要有三类方法:

以下是主要的MAC协议分类:

  • 信道划分协议:将信道资源(时间或频率)静态划分为若干份,每份专供一个节点使用。例如时分多路复用或频分多路复用。优点是避免冲突,缺点是当节点无数据发送时会造成资源浪费。
  • 轮流协议:节点依次获得发送机会。如果某个节点无数据发送,则机会传递给下一个节点,提高了利用率。具体实现方式包括轮询(由主节点协调)和令牌传递(一个特殊令牌帧在节点间依次传递)。
  • 随机接入协议:节点有数据要发送时,直接使用全部信道带宽进行发送。核心问题是解决随之而来的冲突。主要机制是载波侦听多路访问/冲突检测

CSMA/CD 详解

CSMA/CD 是以太网等有线广播网络中使用的经典随机接入协议。其工作原理如下:

以下是CSMA/CD的工作步骤:

  1. 载波侦听:发送前,先监听信道是否空闲。若忙,则等待直至空闲。
  2. 发送与冲突检测:若信道空闲,则开始发送帧,并在发送过程中持续监听信道。如果检测到自身发送的信号与在信道上监听到的信号不一致,则表明发生冲突
  3. 冲突处理:一旦检测到冲突,立即停止发送,并发送一个阻塞信号以强化冲突,确保所有节点都知道发生了冲突。
  4. 指数退避:冲突后,节点等待一段随机时间再重试。等待时间从 {0, 1, ..., (2^k - 1)} 个时间槽中随机选择,其中 k 是冲突次数(不超过10)。这使各节点的重试时间分散开,避免再次碰撞。

在无线环境中,由于设备无法在发送的同时监听(会损坏灵敏的接收电路),因此CSMA/CD不适用,需采用CSMA/CA等协议。

以太网深度解析

以太网是占主导地位的有线链路层技术。它采用无连接、不可靠的交付方式(依赖上层协议处理丢包),但保证帧按序到达。

以太网帧结构

一个以太网帧包含以下字段:

以下是以太网帧的字段构成:

  • 前导码:7字节的 10101010 模式,用于接收方时钟同步。
  • 帧起始定界符:1字节的 10101011,标志帧开始。
  • 目的MAC地址:6字节,目标设备的物理地址。
  • 源MAC地址:6字节,发送设备的物理地址。
  • 类型:2字节,指示帧内数据所属的上层协议(如IP或ARP)。
  • 数据:46到1500字节,承载网络层数据包。这就是MTU=1500的由来。
  • CRC:4字节,用于差错检测的循环冗余校验码。

最小帧长(64字节,不含前导码)的设计是为了确保发送方能检测到冲突:即使帧发送即将结束,来自网络最远端的冲突信号也能在发送完成前被侦听到。

以太网运行流程

结合CSMA/CD,以太网发送一帧的完整流程如下:

以下是发送一帧的步骤:

  1. 准备帧:从网络层获取数据包,通过ARP协议将目标IP地址解析为目标MAC地址,组装帧。
  2. 监听信道:持续监听96比特时间。若信道忙,则等待直至空闲再加96比特时间。
  3. 发送帧:若信道空闲,开始发送,并同时进行冲突检测。
  4. 处理结果
    • 若成功发送完整个帧且未检测到冲突,则完成。
    • 若检测到冲突,立即停止发送,发出阻塞信号,然后执行指数退避算法,等待随机时间后回到步骤2重试。
    • 如果连续冲突16次,则放弃发送并向网络层报告错误。

总结

本节课中我们一起学习了计算机网络中的链路层。我们了解了链路层在相邻节点间传输数据的基本角色,区分了点对点和广播链路。我们重点探讨了广播链路中的核心挑战——多路访问,并介绍了信道划分、轮流和随机接入三类MAC协议。随后,我们深入学习了以太网技术,包括其CSMA/CD访问机制、详细的帧结构以及从发送到冲突处理的完整工作流程。以太网以其简单、高效和可扩展的特性,成为了现代有线局域网不可或缺的基石。

22:Argus 工具使用教程 🛠️

在本节课中,我们将学习如何使用 Argus 网络流量分析工具来完成第二次作业。我们将介绍工具的基本概念、核心命令、常用选项以及如何组合使用它们来分析网络流数据。

概述

本次作业要求你使用 Argus 客户端工具来分析一个预先捕获的网络流数据集。你将在 Andrew Unix 机器上工作,访问存储在 AFS 上的数据和工具。本教程旨在为你提供一个起点,帮助你熟悉 Argus 的基本操作。

访问数据与工具

在开始之前,你需要登录到 Andrew 机器,并确保可以访问 Argus 工具和数据集。你可能需要运行一个 export 命令来设置环境变量,或者修改你的 .bashrc 文件以永久生效。

一个基本的检查方法是运行 ra --help,如果命令能正常工作,说明你的环境已就绪。

核心 Argus 命令

Argus 套件包含多个命令,以下是本次作业中最常用的几个:

  • ra: 读取和输出流记录的主要命令。
  • racluster: 对流记录进行聚合和聚类分析。
  • rabins: 将流数据分到不同的“桶”中进行统计。
  • rasort: 对流记录进行排序。
  • racount: 对流记录进行计数。

这些命令共享许多相同的选项和标志。要深入了解每个命令,官方文档是你的最佳资源。

官方文档:你的最佳伙伴 📚

我们强烈建议你将官方手册页作为解决问题的首要参考资料。手册中包含了所有命令、选项和过滤表达式的完整说明,并附有实用的示例。

特别是 过滤表达式 部分,你将在几乎每个问题中频繁使用它。在尝试解答具体问题之前,先通读这部分文档,了解过滤表达式的功能和用法,会事半功倍。

常用命令选项演示

让我们通过一些例子来了解几个最常用的选项。

基本输出与标签 (-l)

ra 命令可以读取流文件并输出内容。-l 选项用于控制输出的标签格式。

ra -r /path/to/data/file -l0 | head -5

  • -l0: 只在输出顶部显示列标题。
  • -l1: 为每一行记录都显示列标题。
  • -l2: 每隔一行显示列标题。

-l0 是最常用的格式,特别是在需要截取输出截图时。

显示端口号 (-n)

默认情况下,Argus 会将知名端口(如80、53)显示为服务名称(如 httpdomain)。使用 -n 选项可以强制显示数字形式的端口号。

ra -r /path/to/data/file -n | head -5

获取聚合统计信息 (-a)

在处理大量数据时,手动计数是不现实的。-a 选项可以在输出末尾提供记录的聚合统计信息,告诉你过滤后得到了多少条记录。

ra -r /path/to/data/file -a

使用过滤表达式

过滤表达式是 Argus 工具的核心功能,用于筛选出你感兴趣的特定流。表达式跟在命令和选项之后。

基本过滤

例如,筛选出所有 ICMP 协议的数据流:

ra -r /path/to/data/file icmp

组合过滤

你可以使用 andor 等逻辑运算符组合多个条件。例如,找出目标端口为 80 的 TCP 流:

ra -r /path/to/data/file tcp and dst port 80

聚合模式 (-m)

-m 选项用于指定聚合对象,这对于按特定字段(如源IP、协议、端口)对流量进行汇总分析非常有用。你需要查阅手册中关于“聚合对象”的部分,了解所有可用的选项。

例如,按源IP地址进行聚类,并只显示源IP、源端口、目标IP、目标端口这几列:

racluster -r /path/to/data/file -m saddr -s saddr sport daddr dport
  • -m saddr: 按源地址字段进行聚类。
  • -s saddr sport daddr dport: 只输出指定的列。

输出重定向与管道操作

输出到文件

你可以将命令结果保存到文件中,以便后续分析或下载到本地。

ra -r /path/to/data/file tcp and dst port 80 > tcp_80_flows.txt

也可以输出为 CSV 格式:

ra -r /path/to/data/file -c -s saddr daddr bytes > flows.csv

管道连接命令

你可以将一个 Argus 命令的输出作为另一个命令的输入,这是进行复杂分析的关键。

基本语法是:[第一个ra命令] | [第二个ra命令]。有时在管道前使用 -w - 来保持 Argus 记录格式。

ra -r /path/to/data/file host 192.168.1.100 | rasort -m proto

这个例子先筛选出涉及特定主机的所有流,然后将结果按协议进行排序和聚合。

总结

本节课我们一起学习了 Argus 网络流量分析工具的基础知识。我们介绍了如何访问环境和数据,了解了 raracluster 等核心命令,并演示了 -l-n-a-m-s 等关键选项的用法。我们重点讲解了强大的过滤表达式和通过管道组合命令的技巧。

记住,官方文档是完成本作业最重要的资源。在开始解题前,请花时间熟悉它。对于作业中的第九个问题(通常要求创造性地使用工具),深入理解这些功能将尤为重要。

如果你在过程中遇到问题,请善用 Piazza 论坛与同学交流,或参加助教的办公室时间。祝你顺利完成作业!

23:链路层设备 🔗

在本节课中,我们将学习链路层的两个核心概念:地址解析协议(ARP)和链路层连接设备(如集线器与交换机)。我们将了解ARP如何将网络层地址转换为链路层地址,以及如何使用集线器和交换机在物理层和数据链路层连接设备。


地址解析协议(ARP) 🧩

上一节我们介绍了以太网作为链路层协议的工作原理。本节中,我们来看看当网络层需要将数据包发送到特定IP地址时,如何确定对应的链路层(如MAC)地址。这就是ARP的使命。

ARP是一个请求-应答协议,用于将网络层地址(如IPv4地址)解析为链路层地址(如以太网MAC地址)。其工作原理是:当主机需要知道某个IP地址对应的MAC地址时,它会向本地网络广播一个ARP请求。拥有该IP地址的主机会用其MAC地址进行应答。

ARP的核心机制

以下是ARP工作流程的关键步骤:

  1. 构建ARP请求:发送主机创建一个ARP数据包,其中包含:
    • 发送方IP地址发送方MAC地址
    • 目标IP地址(即要查询的地址)
    • 目标MAC地址字段为空(等待填充)
  2. 广播请求:将该ARP数据包封装在链路层帧(如以太网帧)中,并将帧的目的地址设置为广播地址(如 FF:FF:FF:FF:FF:FF),发送到本地网络。
  3. 接收与应答:网络上的所有主机都会收到该广播帧。只有IP地址与请求中目标IP地址匹配的主机会处理该请求,并构建一个ARP应答包,其中包含自己的MAC地址。
  4. 单播应答:应答主机将ARP应答包单播发送回请求主机。
  5. 更新ARP缓存:请求主机收到应答后,将 IP地址 -> MAC地址 的映射关系存储在本地的 ARP缓存表 中。后续发送到同一IP地址的帧可以直接使用缓存中的MAC地址,无需再次广播查询。

ARP缓存条目会在一段时间(如30-60分钟)后过期,以应对网络拓扑的变化。

ARP的应用场景

ARP不仅用于常规的地址解析,还有以下用途:

  • 发送到其他网络:当主机需要发送数据包到一个不在本地子网的IP地址时,网络层会指示链路层将帧发送到默认网关(路由器)。此时,主机需要使用ARP来查询网关路由器接口的MAC地址。
  • 无偿ARP:主机在加入网络或更换IP地址时,会主动广播一个ARP声明,告知网络其IP与MAC地址的映射关系。这有助于更新其他主机的ARP缓存,防止地址冲突,也用于高可用服务器切换等场景。

ARP的安全考虑

ARP协议本身没有认证机制,因此容易受到ARP欺骗攻击。恶意主机可以发送伪造的ARP应答,声称自己是某个IP地址的拥有者,从而截获发往该IP的流量。由于ARP工作在链路层,此类攻击通常局限于同一本地网络内。


链路层连接设备 🔌

了解了如何解析地址后,我们来看看如何实际地将设备连接起来构成网络。连接可以在不同的网络层次进行,其功能和复杂度各不相同。

物理层设备:中继器与集线器

在物理层连接设备,意味着直接处理电磁信号。

  • 中继器:用于扩展信号的传输距离。它接收衰减的信号,将其放大后重新发送出去。例如,海底光缆中的中继器可以确保信号跨越海洋。
  • 集线器:一个多端口的盒子,任何端口收到的电信号都会被复制并发送到所有其他端口。它本质上创造了一个共享的“总线”,所有连接设备都处于同一个冲突域广播域
    • 优点:连接简单,即插即用。
    • 缺点
      1. 所有设备共享带宽,且速度必须一致(无法混合不同速率的网卡)。
      2. 任何两台设备同时发送数据都会产生冲突,且冲突会影响所有设备。
      3. 存在电缆长度和集线器级联数量的限制,以确保冲突能被检测到。

数据链路层设备:交换机 🖧

交换机工作在数据链路层,比集线器更智能。它能够理解链路层帧的格式(如以太网帧头),并根据帧中的目的MAC地址进行转发。

交换机的工作原理

交换机的核心是一个转发表,记录了 MAC地址 -> 端口 的映射关系。这个表通过 自学习 机制建立:

  1. 学习:当交换机从某个端口收到一个帧时,它会检查帧的源MAC地址,并将 该地址 -> 该端口 的映射记录到转发表中,同时刷新时间戳。
  2. 转发:交换机检查帧的目的MAC地址,并在转发表中查找:
    • 已知单播:如果找到对应端口,且该端口不是接收端口,则只将帧从该端口转发出去。
    • 未知单播:如果未找到,则向除接收端口外的所有端口泛洪该帧(广播域内)。
    • 广播/组播:通常也会进行泛洪。
  3. 过滤:如果目的MAC地址对应的端口就是帧的接收端口,说明发送者和接收者在同一网段,帧已被目标接收,交换机则丢弃该帧,避免冗余。

交换机的优势

与集线器相比,交换机带来了巨大改进:

  • 隔离冲突域:交换机的每个端口都是一个独立的冲突域。端口间的通信不会相互干扰,极大地提升了网络效率和并行通信能力。
  • 支持异构链路:不同端口可以连接不同速率(如10Mbps、1Gbps)的设备,交换机负责速率适配。
  • 更高的安全性:帧不会被无脑广播到所有设备,减少了被窃听的风险。

生成树协议(STP)

在复杂的网络中用交换机互连时,可能会形成物理环路。环路会导致:

  1. 广播风暴:广播帧在环路中无限循环,耗尽网络资源。
  2. MAC地址表不稳定:同一MAC地址从不同端口被学习,导致转发表频繁抖动。

为了解决环路问题同时保留冗余路径的可靠性,交换机运行 生成树协议。STP的目标是在存在环路的网络拓扑中,通过阻塞特定端口,逻辑上修剪出一棵无环的“树”。

STP工作简述

  1. 选举根桥:所有交换机中Bridge ID(由优先级和MAC地址组成)最小的成为根交换机。
  2. 确定根端口:每个非根交换机选择到根桥“成本”最低的端口作为根端口。
  3. 确定指定端口:在每个网段上,选择到根桥“成本”最低的交换机端口作为该网段的指定端口,负责转发流量。
  4. 阻塞备用端口:既不是根端口也不是指定端口的端口将被置为阻塞状态,不转发用户数据帧,从而打破所有环路。

当活动链路故障时,STP会重新计算,激活备用路径,实现网络自愈。


总结 📚

本节课中我们一起学习了链路层的两个关键部分:

  1. 地址解析协议(ARP):它充当了网络层和链路层之间的“翻译官”,通过查询和缓存机制,将IP地址动态映射为MAC地址,使得数据帧能够在本地网络中准确投递。
  2. 链路层连接设备:我们比较了物理层的集线器和数据链路层的交换机。集线器简单但效率低下,创建了共享的冲突域;而交换机则智能得多,它通过自学习建立转发表、隔离冲突域、支持高速异构连接,并通过生成树协议管理网络拓扑,防止环路,是现代局域网构建的核心设备。

掌握ARP和交换机的工作原理,是理解局域网如何高效、可靠运行的基础。下一节,我们将探讨网络虚拟化等更高级的链路层技术。

24:虚拟链路层

在本节课中,我们将探讨链路层中“虚拟”的概念。我们将学习如何超越简单的物理电缆或天线连接,通过虚拟局域网和链路虚拟化等技术,实现更灵活、更强大的网络管理。

课程概述与安排

首先是一些课程管理事项。这是第24讲,还有两讲课程。总共只剩三次课。还剩一项作业,即实验三,大约一周后截止。该实验使用Wireshark分析链路层数据,任务量不大,但请不要拖延。

期末考试安排在12月15日上午。题型可能包括判断题、简答题、选择题和一些需要详细解释或分析场景的长题目。如果对期末考试有任何疑问,请及时提出。会有期末复习课,但不会有模拟试卷。

关于练习题,教材每章末尾有一些问题。最好的方法是组建学习小组,根据课程学习目标互相出题。

虚拟局域网

上一节我们介绍了交换机、集线器等设备如何连接不同的网络域。本节中,我们来看看如何将多个物理上独立的局域网逻辑上整合在一起,同时保持管理上的分离。

什么是虚拟局域网?

一个局域网通常指由单一链路连接形成的网络。虚拟局域网的目标是让这个网络能够超越单条电线或类似物理连接的范围。

考虑一个场景:我们有多个部门,每个部门有自己的集线器,这些集线器通过一个交换机连接。这个交换机再连接到路由器,进而接入互联网。网络管理员可能会问:我是否必须使用这四个独立的盒子?能否只用一个大的交换机?

将所有设备直接连接到一台大型交换机在物理上可能可行,因为链路层本身就有地理范围限制。然而,原有的多设备架构在流量管理、访问控制和网络管理方面有其优势。

虚拟局域网就是一种技术,它允许我们将这些物理上连接到同一台交换机的链路层连接,逻辑上划分为多个独立的“虚拟”局域网。这样,我们既保持了物理连接的简洁性,又维护了不同部门网络之间的逻辑隔离。

基于端口的VLAN

以下是创建VLAN的一种常见方法:基于端口的VLAN。

  • 工作原理:网络管理员可以登录交换机,通过命令行界面指定哪些端口属于哪个VLAN。例如,可以指定端口1-8属于“ECE部门”VLAN,端口9-16属于“INI部门”VLAN。
  • 通信行为:在同一VLAN内的计算机之间通信,就像它们直接连接在同一台交换机上一样。例如,VLAN A内的计算机发送帧给同VLAN内的另一台计算机,交换机会正常转发。
  • 隔离效果:不同VLAN之间的计算机,即使物理连接到同一台交换机,也无法直接通信。从网络层面看,它们就像在不同的网络上。这可以防止流量泄露,实现管理隔离。

那么,为什么需要VLAN,而不是直接使用两台物理交换机呢?主要优势在于管理的灵活性。例如,当需要将一台计算机从一个部门调整到另一个部门时,管理员只需在交换机配置中将该计算机连接的端口重新分配到另一个VLAN即可,无需物理上移动线缆。

VLAN间的通信与中继

既然VLAN之间是隔离的,如果一台计算机需要与另一个VLAN中的计算机通信,该怎么办?这需要网络层(第三层)设备的介入,即路由器。因此,要实现VLAN间通信,需要在网络中部署路由器。许多现代交换机集成了路由功能,被称为“三层交换机”。

接下来,我们看看如何连接多台交换机来扩展VLAN。我们可以将两台支持VLAN的交换机上属于同一VLAN的端口用线缆连接起来。但如果交换机有很多VLAN,为每个VLAN都拉一条线会非常低效。

为了解决这个问题,我们引入了中继端口。中继线允许在单条物理链路上承载多个VLAN的流量。管理员只需将两台交换机上的各一个端口配置为中继端口,并用一条线缆连接它们即可。

但是,当帧通过中继线到达接收端交换机时,接收交换机如何知道这个帧属于哪个VLAN呢?它无法仅从标准以太网帧中判断。

802.1Q标签以太网

为了让接收端能识别VLAN,我们需要修改协议。这就是802.1Q标准,也称为标签以太网。

  • 工作原理:它在标准以太网帧的源地址和类型字段之间,插入一个4字节的VLAN标签
  • 标签结构:前2个字节是固定的0x8100,标识这是一个带标签的帧。后2个字节包含实际的VLAN ID等信息。
  • 处理流程:发送端交换机(如连接中继线的交换机)在发送帧前插入VLAN标签。接收端交换机看到0x8100就知道这是带标签的帧,读取VLAN ID,确定帧属于哪个VLAN,然后通常会将标签移除,再将原始帧转发给该VLAN内的相应端口。

这样,通过中继和标签技术,我们就可以高效地构建和管理跨越多个交换机的复杂VLAN网络。

链路虚拟化

我们已经看到如何虚拟化局域网。现在,让我们从更广义的角度理解“链路虚拟化”——即一个链路层连接,其底层可能并非只是一条简单的电线。

链路概念的扩展

回顾数据链路层最初的模型,我们以为那些紫色的连接就是简单的点对点或广播链路。但随着引入交换机,整个由多个局域网和交换机构成的复杂网络,在上层看来就像一个单一的链路。这就是链路虚拟化的核心思想:将一个网络(可能是非常复杂的网络)呈现为一条简单的链路

一个历史例子是拨号上网。用户的计算机通过调制解调器和电话网络,连接到互联网服务提供商。对于用户和ISP来说,这就像有一条直接的链路。但实际上,数据穿越了整个庞大的电话交换网络。我们将整个电话网络虚拟化成了一条数据链路。

在另一种网络技术上运行IP(以ATM为例)

这种虚拟化思想可以解决实际问题。假设一个国家投资建设了庞大的ATM网络,后来互联网(基于IP)成为主流。他们不想废弃现有设施,就可以利用链路虚拟化,让IP网络运行在ATM网络之上。

异步传输模式(ATM)是另一种网络技术体系,它有自己的网络层(ATM层)、适配层(AAL)和物理层。ATM使用固定长度的小数据单元(53字节的信元,其中48字节为载荷),旨在为音视频等实时业务提供有保障的服务。

如何实现IP over ATM?

  1. 在ATM网络的边界部署支持IP和ATM的“边界路由器”。
  2. 当IP数据包到达边界路由器时,路由器通过类似ARP的协议,将目标IP地址映射为ATM的虚电路标识符。
  3. ATM适配层(AAL)将整个IP数据包分割成多个48字节的片段,封装进ATM信元。
  4. 这些信元通过ATM网络内部的虚电路传输到目标边界路由器。
  5. 目标边界路由器的AAL层将信元重组为原始的IP数据包,然后将其送入IP网络继续转发。

从IP层的视角看,两个边界路由器之间就像有一条直接的链路传输了数据包。而ATM网络则在底层完成了所有复杂的传输工作。这就是链路虚拟化的典型应用。实际上,RFC文档中定义了“IP over Everything”,包括IP over IP(用于隧道和加密)、甚至一些幽默的提案如IP over Avian Carriers(信鸽传输IP)。

多协议标签交换

另一个现代网络中广泛使用的虚拟化/标签技术是多协议标签交换。要理解MPLS,我们需要回顾数据封装的过程。

数据封装回顾

数据在网络中传输时被层层封装:

  • 应用层消息(如HTTP请求)作为载荷,被封装在...
  • 传输层段(如TCP段)中,其头部包含端口号等信息;TCP段作为载荷,被封装在...
  • 网络层数据包(如IP数据包)中,其头部包含IP地址等信息;IP数据包作为载荷,被封装在...
  • 链路层帧(如以太网帧)中,其头部包含MAC地址等信息,尾部有CRC校验。

MPLS的思想是,在以太网帧头和IP数据包头之间,插入一个MPLS标签头。这样,我们就相当于在数据链路层和网络层之间增加了一个“垫片”层。

MPLS头部结构

MPLS标签头包含以下字段:

  • 标签:20位,用于转发的关键标识。
  • 流量类别:3位,用于服务质量优先级。
  • 栈底标志:1位,指示这是否是最后一个MPLS标签(可以嵌套多个标签)。
  • 生存时间:8位,类似IP的TTL,每经过一个MPLS路由器减1,最终会复制回IP头的TTL字段。

MPLS网络架构与转发

MPLS网络中有两种路由器:

  • 标签边缘路由器:位于MPLS网络边界,负责在入方向为IP包添加MPLS标签,在出方向移除标签并恢复IP包。
  • 标签交换路由器:位于MPLS网络内部,仅根据MPLS标签进行转发,不查看IP头。

MPLS的转发类似于虚电路网络:

  1. 转发表示例:入标签 -> 出标签,出接口
  2. 数据包进入LSR时,路由器查看其入标签,查询转发表,将标签替换为新的出标签,并从指定接口转发出去。
  3. 这个新标签是下一跳路由器预期接收的标签。因此,标签只在相邻路由器间局部有效,沿途会被不断交换。

MPLS的优势

  • 转发效率:在网络内部,转发决策基于固定长度的短标签,查表速度比IP的最长前缀匹配更快。
  • 流量工程:MPLS打破了IP“单一路由”的限制。网络管理员可以显式指定数据流经过的路径,实现负载均衡、备份路径快速切换等。
  • 灵活性:MPLS标签本身不规定用途,这带来了巨大灵活性。除了流量工程,还可用于构建虚拟专用网络,在公网上创建加密的私有通道,或者为特定类型的流量(如实验数据)打上标签以便跟踪和管理。

总结

本节课中我们一起学习了链路层的“虚拟”概念。

  • 我们首先探讨了虚拟局域网,它允许在单一物理网络基础设施上创建多个逻辑隔离的网络,并通过802.1Q标签和中继技术实现跨交换机的扩展。
  • 接着,我们了解了链路虚拟化的广义概念,即一个复杂的底层网络(如ATM网络)可以被上层协议(如IP)视为一条简单的链路,并通过IP over ATM的例子说明了其应用。
  • 最后,我们深入研究了多协议标签交换,这是一种通过在数据包中插入标签来实现高效、灵活转发的技术,它支持流量工程、VPN等高级网络功能,是现代运营商网络中的关键技术。

通过这些技术,我们认识到数据链路层远不止是物理电缆的连接,而是一个可以通过虚拟化提供强大管理能力和灵活性的层次。

25:无线网络

概述

在本节课中,我们将要学习无线网络,特别是Wi-Fi的工作原理。我们将探讨无线网络在数据链路层面临的独特挑战,以及用于克服这些挑战的关键协议,如CSMA/CA。课程内容将涵盖无线通信的基本原理、隐藏终端问题、冲突避免机制以及Wi-Fi帧结构。


无线网络简介与挑战

无线网络使我们能够摆脱线缆的束缚,实现移动设备间的通信。然而,无线网络比有线网络更复杂,因为它需要模拟物理上不存在的线缆连接。

无线网络通常以基础设施模式运行,其中设备通过接入点进行通信。接入点及其覆盖范围内的设备共同构成一个基本服务集。

无线网络面临两大主要挑战:

  1. 移动性问题:设备在不同子网间移动时,IP地址会改变,这会中断现有的TCP连接。
  2. 无线链路特性带来的问题:这是本节课的重点,包括信号衰减、高误码率、多径效应以及隐藏终端问题。

无线通信的物理层挑战

无线通信使用无线电波,其特性带来了独特的挑战。

信号衰减
接收天线接收到的功率遵循弗里斯传输公式
Pr = Pt * Gt * Gr * (λ² / (4πR)²)
其中,Pr是接收功率,Pt是发射功率,GtGr是天线增益,λ是波长,R是距离。公式中的4πR²表明,信号功率随距离平方衰减,这限制了通信范围。

高误码率
无线环境中的噪声(如宇宙背景噪声、其他设备干扰)远高于有线环境,导致比特错误率显著升高。例如,误码率为10⁻⁴意味着每传输10,000比特就可能有一个错误,这对于包含数千比特的帧来说是严重问题。

多径效应
无线电波会通过直射、反射等多种路径到达接收端。这些不同路径的信号叠加可能造成干扰,虽然信号处理技术可以部分消除这种影响,但在城市等多反射环境中仍是一个挑战。

隐藏终端问题
这是无线网络中的一个关键问题。如下图所示,两个终端设备(A和B)都在接入点的覆盖范围内,可以分别与接入点通信,但它们彼此在通信范围之外,无法直接侦听到对方。

因此,当A和B同时向接入点发送数据时,它们的信号会在接入点处发生碰撞,而A和B自身却无法检测到这个碰撞,因为它们听不到对方。

暴露终端问题
这个问题在无基础设施的Ad-hoc或网状网络中更为常见。如下图所示,A和B可以互相听到,但它们的接收方A‘和B’却听不到对方的发送方。

这导致A和B会因为听到对方发送而推迟自己的传输,即使它们同时发送也不会在接收端产生碰撞,从而造成了信道资源的浪费。


CSMA/CA:载波侦听多路访问/冲突避免

为了解决无线网络的媒体访问和冲突问题,Wi-Fi采用了CSMA/CA协议。它与以太网的CSMA/CD类似,但用“冲突避免”取代了“冲突检测”,因为无线设备无法在发送的同时侦听信道。

以下是CSMA/CA的基本步骤:

  1. 载波侦听:发送前,设备先侦听信道一段时间(DIFS,分布式帧间间隔,约50微秒)。
  2. 信道空闲:如果DIFS期间信道一直空闲,设备立即发送数据帧。
  3. 信道忙或发生冲突:如果侦听到信道忙,或者发送数据帧后未收到确认帧(ACK),设备则启动指数退避过程。
    • 从竞争窗口中选择一个随机退避时间。
    • 只有在信道持续空闲时,才递减退避计数器。
    • 如果信道变忙,则暂停递减,直到信道再次空闲一个DIFS时间后继续。
    • 当退避计数器减到零时,设备尝试发送。
  4. 确认机制:接收方(通常是接入点)成功收到数据帧后,会等待一个较短的时间(SIFS,短帧间间隔),然后发回一个ACK确认帧。发送方收到ACK才认为传输成功。

这个退避过程中“只在信道空闲时计数”的规则,有助于避免多个等待设备在同一个繁忙帧结束后立即同时发送,从而减少连续碰撞的概率。


RTS/CTS:请求发送/清除发送

为了进一步解决隐藏终端问题,Wi-Fi引入了可选的RTS/CTS握手机制,用于在发送大数据帧前预约信道。

以下是RTS/CTS的工作流程:

  1. 发送RTS:发送方在竞争到信道后,不直接发送数据帧,而是先发送一个短小的请求发送帧。RTS帧中包含希望预约的信道占用时间。
  2. 回复CTS:接入点收到RTS后,回复一个清除发送帧。CTS帧同样包含信道预约时间。
  3. 信道预约生效:由于接入点能被BSS内所有设备听到,CTS帧相当于一个广播通告,告知所有设备:“在接下来的X时间内,信道已被预约,请保持静默。”
  4. 发送数据:发送方收到CTS后,知道信道已预留,便可以在SIFS后发送数据帧。
  5. 确认:接收方成功接收数据后,回复ACK。

这个过程虽然增加了RTS和CTS两个小帧的开销,但能有效避免在传输长数据帧期间因隐藏终端导致的碰撞,特别在传输大文件时是值得的。


Wi-Fi标准与帧结构

Wi-Fi标准(IEEE 802.11系列)自1997年诞生以来不断演进,速度、频率和特性持续提升,从802.11a/b/g/n到现在的Wi-Fi 6/7。

Wi-Fi帧结构
Wi-Fi帧的头部比以太网帧更复杂,最显著的特点是它包含四个地址字段

  • 地址1:接收方地址(直接接收此帧的设备,通常是接入点)。
  • 地址2:发送方地址(发送此帧的设备)。
  • 地址3:用于在基础设施模式中,指示数据最终要到达的路由器接口地址(即默认网关)。
  • 地址4:在Ad-hoc网状网络中用于多跳转发。

地址3的作用示例
当你的笔记本电脑向互联网发送数据时,它构造的Wi-Fi帧中:

  • 地址1是接入点的MAC地址。
  • 地址2是你电脑的MAC地址。
  • 地址3是默认网关的MAC地址。
    接入点收到帧后,取出数据载荷,将其封装到一个新的以太网帧中,该以太网帧的目的地址就是地址3(网关),从而将数据传递给网络层的路由器。

帧控制字段
帧头部的控制字段包含许多重要信息:

  • 持续时间:用于RTS/CTS预约信道的时间值。
  • 序列控制:提供序列号,结合ACK机制,在数据链路层实现了可靠的帧传输
  • 更多分片:允许将大帧分片传输,在高误码率环境中,重传小分片比重传整个大帧更高效。
  • 功率管理:允许设备通知接入点它将进入睡眠模式以省电,接入点会为其暂存数据。
  • 速率控制:接入点可以指示设备调整发送速率,以更好地适应信道条件。

总结

本节课中我们一起学习了无线网络的核心知识。我们了解到无线网络因其物理媒介的特性,面临着信号衰减、高误码率和隐藏终端等独特挑战。为了应对这些挑战,Wi-Fi采用了CSMA/CA协议进行信道访问和冲突避免,并可选地使用RTS/CTS握手机制来预约信道、解决隐藏终端问题。我们还探讨了Wi-Fi帧的结构,特别是其四个地址字段的用途,以及帧控制字段如何支持可靠传输、分片、功率管理等高级功能。无线网络是一个广阔且不断发展的领域,除了Wi-Fi,还包括蜂窝网络、无线传感网和个域网等多种技术。

26:软件定义网络 (SDN) 🚀

在本节课中,我们将要学习软件定义网络(SDN)的核心概念。SDN是一种创新的网络架构,旨在解决传统网络僵化、难以实验和创新的问题。我们将探讨其工作原理、关键组件以及实际应用。


课程与考试安排 📅

首先,我们来看一下本学期的剩余安排。Lab 3需要在周日晚上前完成。期末考试将在周二举行,这是一场闭卷考试,在Canvas上进行。考试中不需要计算器,如果涉及排队论问题,会提供与Quiz 1相同的标准公式表。


传统网络的挑战与SDN的诞生

上一节我们介绍了课程安排,本节中我们来看看SDN出现的背景。你阅读了2008年关于SDN的基础性论文。这篇论文针对特定情况,但回应了许多人感受到的网络现状:网络已经变得僵化,成为一个庞大的单体结构。你很难对它进行实质性改变,只能进行微调。进行基础实验和有意义的研究变得非常困难,很多时候研究只能在模拟环境中进行。由于规模问题,模拟无法准确反映真实网络的特性,有时会产生不同的效果。例如,在RED网关的讲座中我们提到,RED算法最初基于研究实验室的模拟,但当人们开始实际部署时,发现网络规模导致计时循环存在偏差等问题。当你无法在真实互联网上模拟互联网时,就会面临这种情况,因为网络中有太多难以改变的组件。

在其他领域,协议和标准的开放允许许多参与者进入系统并进行实验和改进。回顾20世纪80年代末90年代初,你会从当时的操作系统和计算机硬件/软件系统的“开放战争”中认出这一点。问题在于,如果你有一种方式可以与系统交互,这种方式可能不是其内部专有的运行机制,而是一个虚拟化的接口。这允许运行该系统的公司之外的其他实体进行实验和改变。通常,运行系统的公司不喜欢这样,因为这迫使他们改变,并可能迫使他们推出他们不想要或尚未准备好的产品,在这个过程中他们常常会亏损。但这为其他所有人提供了更好的环境,因为每个人都能获得更优质、更便宜的产品。

你可能会说,我们实际上有很多开放标准,网络不就是由一大堆我们可以阅读、可以自己实现、可以构建的RFC组成的吗?这个论点很有道理。如果你想了解HTTP的工作原理,想实现自己的版本,想进行修改,你确实可以做到。问题在于,有一些对网络运行至关重要的组件,尤其是在大规模层面,它们并不开放,那就是路由器和交换机内部本身。

我们知道在这些交换机和路由器上运行什么协议,但我们无法影响这些设备的实际运行,因为它们是专有设备。任何允许你调整其运行的“旋钮”都是由供应商提供的,并且是以专有的方式实现的。你需要支付高昂的许可费用,这尤其不利于论文中所说的、在世界各地大学实验室进行的网络研究。


路由器的内部视角

还记得我们讨论路由时的这张图吗?我们当时在谈论RIP(一种内部网关协议),我指出RIP通过向其他路由器元素发送UDP消息来运行。我们当时说,等等,UDP是传输层协议,路由不是发生在网络层吗?这就是我所说的内部接口的一个好例子。是的,我们可以理解RIP协议,理解这些消息中包含哪些比特位,因此当UDP消息发送到网络上时,我们理解其工作原理,也理解应用程序如何与其他路由器上的应用程序通信。但这一部分(指路由信息如何进入转发表)完全是专有的。

我可以从路由器本身的角度稍微不同地重绘协议栈。我可以这样说:我们有一个像routed这样的应用程序,它运行在一个操作系统上。记住,路由器本质上是大型计算机,它们是专用计算机,以非常特殊的方式工作,但它们运行自己的操作系统。思科、瞻博网络或其他公司负责创建这个操作系统,并以一种所有应用程序都能在该硬件上运行的方式构建它。顺便说一下,我这里说的“应用程序”指的是路由器需要执行的功能,路由是其中之一。你可能还有其他需要在上面运行的功能,这些都会成为应用程序。例如,我们讨论网络监控时,会有一个应用程序响应SNMP请求,以便从实际路由器中提取信息并发送回某处,这就是一个运行在这里的应用程序。根据你想如何控制路由器、希望路由器能做什么,你会有许多这样的应用程序。基本上,任何需要实现的RFC协议都会作为一个应用程序来实现。

这些应用程序运行在操作系统上,如前所述,操作系统当然运行在硬件上。路由器中有CPU,但对我们这里讨论更重要的是与实际转发表、实际执行最长前缀匹配查找的硬件之间的接口。所有这些都不是开放的。例如,我无法决定改变操作系统的工作方式,比如让我在这台设备上加载Linux,你做不到。它与运行在那里的特定硬件紧密绑定,你无法访问任何内部信息。思科或其他大公司也不会让你访问。这是他们的价值主张所在:让这些应用程序能在他们的硬件上运行。


控制平面与数据平面的分离

好了,让我们退一步,思考一下我们在路由器网络层看到的那些功能。记得我们将其分为控制平面操作和数据平面操作。我们基本上说过,有路由相关的事情需要发生,有路由算法,比如运行OSPF、BGP等,计算实际路由,这些是控制平面的东西。这是为了确定哪些路由实际传播到转发表中的复杂机制。而转发表是数据平面的一部分,当然,就是当数据包到达时,我们需要确定它该往哪个方向去的处理过程,这就是转发部分。

Stephanos指出路由器有开源操作系统,OpenWRT就是其中之一。我使用过它,它很棒,可以把它装在你家里的路由器上,做其他很酷的事情。但要认识到,这只能运行在你家里100美元的Linksys盒子上,你无法让它运行在价值25万美元、位于互联网核心进行路由的思科路由器上。我考虑的是大规模网络。如果你想用一堆小型Linksys盒子模拟网络进行研究,你同样会遇到小规模模拟的问题。

那么,SDN在做什么?正如你在论文中读到的,SDN试图在网络中的路由器和交换机内部的控制平面和数据平面之间建立一个标准化接口。这样我们就可以用软件来定义数据平面的工作方式。如果这是一个标准化接口,你就可以在不改变硬件的情况下改变软件部分。这将允许你编写不同的软件,添加新功能,实现论文中描述的那种机构性研究。

是的,正如Cardik指出的,我不想让人觉得思科只有封闭的商业垄断,除了收取高额费用什么都不做。他们是一家提供支持并做很多其他事情的公司。人们花25万美元购买思科路由器,通常不仅仅是为了硬件本身。Cardik指出,思科提供了大量官方支持,他们非常擅长追踪网络中任何人可能想使用的任何协议并实现它。


SDN的工作原理

那么,SDN如何工作?我们将有意分离数据平面和控制平面。数据平面将保持专有,并保持以硬件为中心。它不一定是硬件,但我们将其视为执行转发的硬件。有一种叫做TCAM(三态内容可寻址存储器)的东西,它实际上是构成昂贵高速路由器的常见硬件设备。这些部件执行查找和匹配。内容可寻址存储器是一种你可以提供部分数据,它会非常快速地在内存中搜索并找到匹配该数据的行的存储器,这听起来正是我们进行前缀查找所需要的。之所以是三态内容可寻址存储器,是因为你需要查找匹配0、1以及末尾一些不关心位(用于前缀部分)的条目。例如,你只关心一个前缀的前21位是否匹配。许多高速路由器中都有这种非常专业化的存储器。这是因为这些设备位于网络中心,需要全速运行,它们有很多线路接入,每条线路速度都非常快,带宽很高,这意味着你需要能够非常快速地进行转发和管理交换结构,处理任何输入端口到达的数据包或帧,执行这些查找,并将它们快速传递到输出端口。

SDN抽象了这一切。SDN说我们不太关心它具体如何工作,我们想要的是一个像流表一样的东西,执行这种转发功能,但可能基于更多字段。到目前为止,我们在路由器和交换机上进行的转发都是查找IP地址。我们想稍微扩展一下,使其变成查找关于流的一些数据,而不仅仅是单个数据包。还记得我们很久以前讨论NetFlow时说过,流基本上是一组头部字段,如果几个数据包或帧的这些字段匹配,我们就说这些数据包或帧都属于同一个流。我们希望将这个想法抽象到数据平面中。

然后,控制平面将能够指导数据平面,并填充流中的值。这些值基本上定义了:这些特定的IP地址值定义了一个流,我们将选择一个动作,当特定的数据包或帧到达并匹配这些值(因此我们相信它是该流的一部分)时,我们希望指定对该数据包执行什么操作。动作可以是几件事:你可以指定数据包需要从特定的线路转发出去,这是路由器或交换机通常做的基本常规操作。它接收到达的数据包或帧,查看地址,然后决定应该从哪个特定输出端口转发出去。所以这个动作很合理,很正常。

控制平面可能想要做的另一个动作是:将该数据包发送给控制器。不要从线路17转发出去,而是将其封装在消息中发送给控制器,基本上是说:嘿,看,这是一个匹配该行的数据包。这通常是你对流中的第一个数据包做的事情。当你第一次看到具有特定特征的数据包到达时,你会把它发送给控制器,在那里一些软件可以查看该数据包并做出一些决定,或者对其进行处理。正如你在论文中看到的,这是进行实验性处理的方式。如果你看到一个数据包具有某些特征,并被标记为“这是Bill Nace的研究流量”,那么你就把它发送给控制器,控制器运行一些软件来决定如何处理它,运行Bill Nace的新算法来找出该怎么做。

你可以做的其他动作包括:重写头部。你可以设置规则,基本上说我们希望该数据包从不同的接口发送出去,但我们希望它以不同的值发送出去,比如我们希望它以不同的IP地址和不同的端口号发送出去,这听起来很像网络地址转换,这正是你在这里设置它的原因。你也可以说,让我们直接丢弃那个数据包。也许这是一种针对我们先前确定为恶意流的防御机制。例如,那是DDoS攻击的一部分,那个数据包不应该再被转发,请立即丢弃它。我们以前没见过这个,我们的路由器从未主动丢弃数据包,它们总是因为空间不足而丢弃,这是最后的手段。这实际上是更主动的,这是在说,哦,我们想立即终止这个。我想RED是稍微主动丢弃数据包的一个例子,但在这里你实际上可以说任何匹配这个流的数据包,直接丢弃。

你可以指定的最后一个动作是:你不想对这个数据包做任何奇怪而奇妙的事情,你只想做在SDN时代之前通常会发生的事情,那就是传统的转发流水线。这只是说,对该数据包做旧的处理方式。这是为了让人们更适应SDN的概念,让你可以慢慢地将SDN引入组织,这样你仍然可以拥有SDN路由器和交换机,但不必立即让它们执行SDN功能。你可以说,好吧,我们只是把它放在这里,我们将在其中一些上进行实验,我们可能只将它们用于实验性处理,其他所有流量仍将按照旧的、传统的方式处理。

所以,想法是你将拥有这个流表,它将有字段来匹配事物,然后控制平面将为该特定流指定一个动作。这些是一些可能发生的示例动作。


SDN的架构视图

我的设想,我思考这个问题的方式是:我现在有一个路由器或交换机,这里我把它画成一个路由器。它是一个盒子。在它内部,我有这两个部分,这两个组件被分开了。一个是数据平面,数据平面实际上控制着连接,数据包从特定的线路进入,从特定的其他线路出去。然后控制器发送命令,它通过发送命令来控制数据平面,这些命令基本上是说:哦,如果IP头匹配这个,TCP端口匹配那个,那么就从特定的接口发送出去。这听起来完全像转发。这是SDN之前路由器做的事情,除了这个TCP端口号的事情。因为到目前为止,路由器只查看目的IP地址并进行匹配,以确定它属于哪个前缀。现在,因为我们处理的是流而不仅仅是数据包,我们查看更多信息,并尝试在这些数据包之间匹配更多内容。因此,我们将查看封装在IP数据包中的更高层数据,以做出这些决定,找出它们是否属于某个特定的流。

我会发送另一个命令:如果这是去往谷歌的公共IP地址,并且端口是DNS,那么我们知道它应该从wire7出去,请从那里转发它。也许我们想说,任何其他你看到的、不在你转发表中的数据包,请发送给控制器。然后控制器可以运行一些软件来决定应该对它做什么,并在数据平面中实现正确的事情来使其发生。

这是另一种思考方式,可能更详细一些,关于数据平面。控制器仍然是填充数据平面流表的组件,这是一个例子。实际情况通常比这更复杂,通常有多级流表结构,但我们可以将其视为一个简单的单表,允许通配符。想法是:我有一个表,有很多列,比如数据包是从哪个接口进入的?从路由器的哪条线路进入的?是否有VLAN标识符?IP的源地址和目的地址是什么?上层协议是什么?是UDP还是TCP?如果是UDP或TCP,我能否查看端口并决定如何处理它们?这些都是我将查看多个进入路由器的数据包的值,以决定它们是否属于同一个流。

如果它们有这些匹配项,比如它们都从这条线路进入,有这个源地址、这个目的地址等等(顺便说一下,这里的星号是通配符,意思是我不关心,不看VLAN ID),如果所有这些都匹配,那么就从接口3、线路3发送出去。通常还有一些统计列,比如记录有多少数据包进入并匹配了这一特定行,或者匹配该行的数据包总共有多少字节。所以也有一些统计列。你可以想象这个表通常会有很多行,不只是这里指定的三行,我指定了其中的几行。然后在底部,我有默认规则:如果它没有匹配任何已有条目,那么其他任何数据包都发送给控制器,控制器会负责解决这个问题。


控制器与数据平面的分离

到目前为止,我展示的幻灯片中,控制器和数据平面似乎在一个设备里。但一旦我们有了两者之间的协议,我们就可以将控制器放在别处。我现在可以把那个控制器放在一个不同的盒子里。我需要做的只是有一种方式将携带该协议的消息传递给数据平面设备。是的,我希望它是一个安全通道,因为我们不希望任何人能够随意向我们的设备发送SDN协议消息。但现在我们能够将控制器从实际的交换机中分离出来并放在其他地方。

一旦我能做到这一点,我就可以做到这个,这才是我们真正想要的:一个可以控制我网络中许多交换机的单一控制器。这让我现在可以进行涉及网络中所有设备的计算。想法是:如果我有这个单一的地方运行软件来做出这些流决策,那么当一个新的数据包出现时,如果数据包进入下面这个路由器,这个路由器将遵循“发送给控制器”的动作,并向域控制器发送一条消息说:嘿,我刚看到这个新数据包,我该怎么处理它?然后控制器可以说:哦,我们这里有一些来自这个IP去往那个IP的新流量,查看该特定数据包的所有特征,然后能够实际在我的整个网络中为该流实施动作。因此,不再是由单个交换机决定数据包应该走哪个方向,域控制器可以说:我希望它以特定的方式流经我的网络,现在我可以通过在所有这些流表中安装流条目来响应,以便该数据包将沿着我希望的路径传输。


集中化控制的优势与挑战

我们通过这样做,将传统上是分布式控制的东西变成了集中式控制。所有的路由算法都是分布式算法,它们决定数据包应如何流经网络,但它们是以分布式方式进行的。这很棒,很神奇,分布式的东西能运行起来,因为解决分布式问题比解决集中式问题要困难得多。然而,问题是分布式控制真的很难处理、调整和管理。因此,如果我们有一个集中式的地方来做决策并控制所有部分,现在我们在做这些决策时就能获得一种整体的网络视图。当然,这些决策可以由运行在该域控制器中的软件做出。这正是流量工程师几十年来想要的:一个运行网络操作的人会查看流经的流量,然后说:哦,我这里有一条特定链路使用不多,那里有一条链路使用过度,我想把一些流量从这里移到那里。这就是集中式视图,我们想要发生的集中式愿景。问题在于,网络工程师现在必须找到一种方法来调整单个路由器的度量值,以便路由器在运行路由算法时,能自行决定一些流量应该走那边。这是一种非常间接的方式来控制路由器做你想让它做的事。现在有了SDN,你有了一个集中式控制机制:你可以直接说,哦,看,这里有太多流量,让我在这里安装一些流表条目,直接把流量移过去。我们不需要猜测。如果我改变那个度量值,比如把本地优先级从300改成310,是否会把足够的流量移到那边?你不必控制你真正想控制的东西的一阶、二阶或三阶操作。

这就是为什么网络控制人员喜欢SDN,他们认为SDN很棒,我们绝对应该这样做。是的,你说得对,任何东西一旦集中化,就会有两个问题:你现在有了一个单点故障,以及一个集中的性能瓶颈。这两点都必须处理。Cartik看到了性能影响,我们稍后会讲到。Sva想知道一个控制器能与多少台交换机通信,这将是一个性能问题,取决于这个特定控制器中的CPU有多强大,以及它实际上能有效管理多少实体。控制器与交换机的连接,我们稍后会讲到,这里的虚线是逻辑上的,运行在实际存在的物理线路上。是的,分析有另一个方面,我说过性能将取决于这里的CPU有多强大,也取决于网络的拓扑结构,你实际试图控制多少流,你试图以何种粒度控制它们,以及其他一些类似的事情。Sriraeder,答案是“小心地”。控制器和网络将非常小心地从故障中恢复。这些都是关于这个目前还只是幻灯片上的想法的很好的工程问题。


控制消息的传输与网络规模

关于逻辑与物理连接的问题,我想指出,消息实际上并不通过空中虚线传输,消息也必须通过网络传输。这是我们这里面临的一个有趣挑战,我们之前在BGP中也看到过。我们说,这些BGP消息,我们如何决定它们去哪里?哦,它们去的地方是由路由算法本身决定的。我们在这里做同样的事情:我有从交换机和路由器发送的路由控制消息,这些消息中必须包含路由信息才能到达控制器。显然,让一个网络启动并运行不仅仅是插上一堆交换机和路由器然后通电。网络工程师和管理员必须管理这一点,并确保在启动过程中,正确的默认路由被配置到设备中,以使这一切正常工作。

就性能而言,对于这里提出的一些问题,比如我们能控制多少,网络能有多大,答案是:如果你的网络太大,你可以将网络分割成多个部分,我们称之为域,软件定义网络域。一个控制器管理一个域。如果你的网络足够大,需要多个域,实际上有一种方法可以让多个域控制器协同工作,它们之间可以相互传递信息。这张幻灯片没有显示,但这也可以用于备份机制。当然,任何时候你有一个集中式设备在运行,你都会担心如果它宕机了会发生什么。如果它成为关键的单点故障,那将很糟糕。因此,你也会运行一个备份控制器,并且需要能够在控制器之间传递信息。

因此,有一个信息交换机制,称为SDNI。它基本上是域之间的接口。因为它也将是一个标准接口,想法是你可以运行来自不同公司的域控制器,它们实际上运行方式略有不同,但它们可以交换信息。例如,它们可以告诉对方它们的网络拓扑是什么:哦,是的,我通过这三条线路连接到你,你应该知道这一点。你可以发送事件,所以如果你知道某事已经发生或将要发生,你可以与周围的域进行通信。你可能还想要其他东西,比如基础设施状态、带宽需求(如果你正在运行一个有保证带宽机制的东西)等等。


SDN的优缺点

那么,我们是喜欢SDN还是讨厌它?它有好有坏。它当然满足了我们对

posted @ 2026-03-28 12:22  布客飞龙V  阅读(1)  评论(0)    收藏  举报