Internet 简介¶
什么是 Internet?¶
Internet 已经无处不在,它是一种在全球设备之间传输数据的工具。在本课程中,我们会关注支撑这一能力的基础设施,包括硬件和软件。
Internet 和 World Wide Web 并不是一回事。你可以把 Web 理解为构建在 Internet 之上的应用,例如 Facebook、Twitter,它们可以通过 Web browser(浏览器)访问,例如 Firefox、Chrome。除了 Web 以外,其他应用也可以使用 Internet 基础设施。非 Web 应用的例子包括 Zoom、在线游戏,甚至 Internet of Things(IoT,物联网)设备,例如冰箱或汽车里的传感器。
为什么 Internet 很有意思?¶
Internet 并不是一种全新的网络技术本身,例如电线早已存在。它真正解决的是一个全新的问题:如何把许多已有的、彼此不同的 network 连接在一起。解决这个问题需要一种新的设计范式,而这种范式后来也影响了计算机科学的其他领域。
Networking 是计算机科学中相对较新的方向。Internet 带来了许多新挑战,它们不同于很多传统的计算机科学领域。例如,不同于理论方向,我们没有一个形式化的 Internet 模型。不同于硬件方向,我们也没有一个可以直接衡量性能的 benchmark。
不同于你之前可能上过的课程,仅仅写出「能运行」的代码已经不够了。你写的代码必须能够 scale(扩展)到数十亿用户。你写的代码还必须符合不同运营者之间的商业关系,否则他们可能根本不会同意运行你的代码。
适用于轻量级应用的代码(例如你的家用电脑)不一定适用于高负载服务器。今天能工作的代码,明天也可能不再工作,因为会有不同的计算机加入或离开 network。
Internet 的设计影响了我们构建现代系统的方式,例如如何围绕目标、约束和 trade-off 进行推理。Network architecture(网络架构)更强调思考设计,而不是证明定理或编写代码;更强调考虑 trade-off,而不是满足某个特定 benchmark;更强调设计实用系统,而不是寻找最优设计。Internet 并不完美,但它成功地平衡了范围很广的一组目标。
Internet 是联邦式的¶
Internet 是一个联邦式系统,它要求不同运营者之间具备互操作性。换句话说,每个 ISP(Internet service provider,互联网服务提供商)都独立行动,但为了连接整个世界,每个运营者又必须彼此合作。也就是说,世界上所有 ISP 都需要就某些共同 protocol 达成一致,才能实现全球连通性。
联邦式结构会引入若干挑战。彼此竞争的实体(例如竞争公司)被迫合作,尽管竞争者可能并不想互相分享机密信息。在设计 protocol 时,除了技术因素,我们还必须考虑现实中的商业激励。
联邦式结构也会让创新变得更复杂。在其他领域,公司可以通过开发别人没有的新功能来创新。但在 Internet 上,如果你有一个别人都没有的功能,你反而无法使用它。所有人都必须说同一种共同语言(protocol),因此 Internet 的任何升级都必须把互操作性纳入考虑。
Internet 是可扩展的¶
联邦式结构使 Internet 能够达到巨大的规模。我们不需要让单个运营者管理数十亿用户和数万亿服务,而只需要关注如何互连不同的运营者。联邦式结构也允许我们用极其多样的技术构建 Internet,例如无线、光纤,同时容纳能力差异很大的连接,例如容量很小的家庭链路,或容量巨大的海底电缆。这些技术也在持续演进,这意味着我们无法瞄准一个固定目标,例如容量和需求都在以数量级增长。
Internet 的巨大规模也意味着,我们设计的任何系统都必须支持 Internet 上极其多样的用户和应用。例如,有些应用需要更多 capacity,有些用户可能带有恶意。
Internet 的全球规模意味着,我们的系统和 protocol 需要以异步方式运行。数据无法超过光速传播,而且通常要慢得多。假设你向地球另一端的服务器发送一条消息。当这条消息到达时,你的 CPU 可能已经额外执行了数百万条指令,而你发出的消息也可能已经过时。
Internet 的规模意味着,即使只发送一条消息,也可能需要和许多组件交互,例如 software、switch、link。任何组件都可能失败,而我们甚至可能不知道它已经失败。如果确实发生了故障,我们也可能过很久才收到坏消息。Internet 是第一个必须面向大规模故障进行设计的系统。此后,其中许多思想也被其他领域采纳。
Protocol(协议)¶
在本课程中,我们的大部分重点会放在 protocol 上:protocol 规定了实体之间如何通信。它们交换的消息格式是什么?它们又该如何响应这些消息?
例如,假设你正在编写一个需要通过 Internet 发送和接收数据的 application。发送方机器上的代码和接收方机器上的代码都必须同意数据的格式,以及面对不同消息时应该做出什么响应。
下面是一个 protocol 的例子。Alice 和 Bob 先互相问候,然后 Alice 请求一个文件,Bob 返回这个文件。为了定义这个 protocol,我们需要定义 syntax(语法),例如如何用 1 和 0 写出「把这个文件给我」;也需要定义 semantics(语义),例如 Alice 必须先收到 Bob 的问候,才能请求文件。
不同的 protocol 是为不同需求设计的。例如,如果 Alice 需要尽快拿到文件,我们可以设计一个省略开头问候消息的 protocol。设计一个好的 protocol 可能比看起来更难。我们还需要考虑边界情况、bug 和恶意行为。例如,如果 Alice 请求一个文件,而 Bob 回复的是 hello,Alice 应该如何响应?
在整门课中,我们会看到许多已经在 Internet 中标准化的 protocol。提到某个 protocol 时,你有时会看到缩写 RFC(Request For Comments)。许多标准会以 RFC 文档发布,并最终被广泛接受,不过并不是所有 RFC 最后都会被采用。RFC 文档带有编号,有时人们会用 RFC 编号来指代 protocol。例如,「RFC 1918 addresses」指的是由该特定文档定义的地址。
不同的标准组织负责标准化不同的 protocol。IEEE 关注较低层的电气工程部分。IETF 关注 Internet,并负责 RFC。