互联网简介
什么是互联网?
互联网作为一种在全球范围内的设备之间传输数据的工具,无处不在。在本课程中,我们将重点关注支持这一功能的基础设施(包括硬件和软件)。
互联网和万维网并非同一事物。你可以把万维网看作是建立在互联网之上的应用(例如脸书、推特),你可以通过网页浏览器(例如火狐、谷歌浏览器)访问它们。除了万维网之外,其他应用也可以利用互联网基础设施。非网页应用的例子包括 Zoom、在线游戏,甚至像冰箱或汽车里的传感器这样的物联网(IoT)设备。
互联网为何有趣?
互联网并非一种新型网络技术(例如,电线早已存在),而是关于一个全新的问题:将不同的现有网络连接起来。解决这个问题需要一种新的设计范式,这种范式也影响了其他计算机科学领域。
网络是计算机科学领域中一个相对较新的分支。互联网带来了许多与传统计算机科学领域不同的新挑战。例如,与理论领域不同,我们没有互联网的正式模型;与硬件领域不同,我们没有可衡量的性能基准。
与你可能上过的其他课程不同,仅仅写出能运行的代码已经不够了。你编写的代码必须能扩展到数十亿用户。你编写的代码还必须与不同运营商的业务关系相契合(否则,他们可能不同意运行你的代码)。
在轻量级应用(例如你的家用电脑)上能运行的代码,在重型服务器上可能无法运行。今天能运行的代码,明天当不同的计算机加入或离开网络时,可能就无法运行了。
互联网的设计影响了我们构建现代系统的方式(例如,在设计中对目标、约束和权衡进行思考)。网络架构更多的是关于设计思考,而不是证明定理或编写代码;更多的是考虑权衡,而不是达到特定的基准;更多的是设计实用的系统,而不是寻找最优设计。互联网并非最优,但它成功地平衡了一系列广泛的目标。
互联网是联邦制的
互联网是一个联邦制系统,需要运营商之间的互操作性。换句话说,每个运营商(互联网服务提供商)独立运作,但所有运营商必须合作才能实现全球连接。也就是说,世界上所有的互联网服务提供商需要就一些通用协议达成一致,以实现全球连通性。
联邦制带来了一些挑战。竞争实体(例如 rival 公司)被迫合作,尽管竞争对手可能不想彼此分享机密信息。在设计协议时,我们除了考虑技术因素外,还必须考虑现实生活中的商业激励。
联邦制也使创新变得复杂。在其他领域,公司可以通过开发一项别人没有的新功能来进行创新。但在互联网上,如果你有一个别人都没有的功能,你就无法使用它。每个人都必须使用共同的 “语言”(协议),因此互联网的任何升级都必须考虑互操作性。
互联网具有可扩展性
联邦制实现了互联网的巨大规模。我们不需要由单个运营商来管理数十亿用户和数万亿服务,只需要专注于将所有不同的运营商互连起来。联邦制还允许我们用各种各样的技术(例如无线、光学技术)构建互联网,这些技术具有广泛的能力(例如容量很小的家庭链路,或容量巨大的海底电缆)。这些技术也在不断发展,这意味着我们无法以一个固定的目标为导向(例如,容量和需求正以数量级不断增长)。
互联网的巨大规模还意味着我们设计的任何系统都必须支持互联网上广泛的用户和应用(例如,有些需要更大的容量,有些可能是恶意的)。
互联网的全球规模意味着我们的系统和协议需要异步运行。数据的传输速度不可能超过光速(而且通常比光速慢得多)。假设你向世界另一端的服务器发送一条消息,当你的消息到达时,你的 CPU 可能已经执行了数百万条额外指令,而你发送的消息可能已经过时了。
互联网的规模意味着,即使发送一条消息,也可能需要与许多组件(例如软件、交换机、链路)进行交互。任何组件都可能出现故障,而我们甚至可能不知道它们是否出了故障。如果真的出现故障,可能需要很长时间才能得知这个坏消息。互联网是第一个必须为大规模故障而设计的系统,其中许多理念后来被其他领域采用。
协议
在本课程中,我们的大部分重点将放在协议上,协议规定了实体之间如何进行通信。它们交换的消息格式是什么,以及它们如何响应这些消息?
例如,假设你正在编写一个需要通过互联网发送和接收数据的应用程序。发送方机器上的代码和接收方机器上的代码都需要就数据的格式以及如何响应不同的消息达成一致。
下面是一个协议示例:爱丽丝和鲍勃都先打招呼,然后爱丽丝请求一个文件,鲍勃回复该文件。要定义这个协议,我们需要定义语法(例如,如何用 0 和 1 表示 “给我这个文件”)和语义(例如,爱丽丝必须在请求文件之前收到鲍勃的问候)。
不同的协议是为不同的需求而设计的。例如,如果爱丽丝需要尽快获得文件,我们可能会设计一个没有初始问候消息的协议。设计一个好的协议可能比看起来更难!我们还可能需要考虑边缘情况、漏洞和恶意行为。例如,如果爱丽丝请求一个文件,而鲍勃回复了问候,爱丽丝应该如何响应?
在整个课程中,我们将看到许多在互联网上被标准化的协议。当我们提到某个协议时,你有时会看到缩写词 RFC(请求评论)。许多标准以 RFC 文档的形式发布,最终被广泛接受,尽管并非所有 RFC 都被采用。RFC 文档是编号的,有时协议会用其 RFC 编号来指代。例如,“RFC 1918 地址” 指的是该特定文档中定义的地址。
有不同的标准机构负责协议的标准化。IEEE 侧重于低层电气工程方面;IETF 侧重于互联网,并负责 RFC。