# 1.1 什么是因特网

在本书中，我们使用一种特定的计算机网络，即公共因特网，作为讨论计算机网络及其协议的主要载体。但什么是因特网？回答这个问题有两种方式：其一，我们能够描述因特网的具体构成，即构成因特网的基本硬件和软件组件；其二，我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。我们先从描述因特网的具体构成开始，并用图 1-1 举例说明我们的十寸论。

## 1.1.1 具体构成描述

因特网是一个世界范围的计算机网络，即它是一个互联了遍及全世界的数以亿计的计算

设备的网络在不久前，这些计算设备多数是传统的桌面 PC、LinuxI 作站以及所谓的服务器（它们用于存储和传输 Web 页面和电子邮件报文等信息）。然而，越来越多的非传统的因特网端系统（如便携机、智能手机、平板电脑、电视、游戏机、Web 相机、汽车、环境传感设备、数字相框、家用电器）和安全系统，正在与因特网相连。的确，在许多非传统设备连接到因特网的情况下，**计算机网络**这个术语开始听起来有些过时了。用因特网术语来说. 所有这些设备都称为**主机**（host）或**端系统**（endsystem）到 2011 年 7 月为止，有大约 8.5 亿台端系统与因特网连接，这并未将智能手机、便携机和仅断断续续与因特网连接的其他设备计算在内【ISC 2011】。总体来说，因特网用户数估计超过 20 亿【ITU 2011】。

端系统通过**通信链路**（communication link）和**分组交换机**（packet switch）连接到一起。在 1.2 节中，我们将介绍许多类型的通信链路，它们由不同类型的物理媒体组成。这些物理媒体包括同轴电缆、铜线、光纤和无线电频谱。不同的链路能够以不同的速率传输数据，链路的传输速率以比特/秒度量（bit/s，或 bps）。当一台端系统要向另一台端系统发送数据时，发送端系统将数据分段，并为每段加上首部字节。由此形成的信息包用计算机网络的术语来说称为**分组**（packet）。这些分组通过网络发送到目的端系统，在那里被装配成初始数据。

分组交换机从它的一条入通信链路接收到达的分组，并从它的一条出通信链路转发该分组。市面上流行着各种类型、各具特色的分组交换机，但在当今的因特网中，两种最著名的类型是**路由器**（router）和**链路层交换机**（link-layer switch）。这两种类型的交换机朝着最终目的地转发分组。链路层交换机通常用于接入网中，而路由器通常用于网络核心中。从发送端系统到接收矗统，一个分组所经历的一系列通信链路和分组交换机称为通过该网络的**路径**（route 或 palh）。因特网所承载的精确通信量是难以估算的，不过思科公司【Cisco VNI 2011】估计，全球因特网流量在 2012 年每月大约为 40 EB（$$10^{18}$$字节）。

用于传送分组的分组交换网络在许多方面类似于承载运输车辆的运输网络，该网络包括了高速公路、公路和立交桥。例如，考虑下列情况，一个工厂需要将大量货物搬运到数千公里以外的某个目的地仓库。在工厂中，货物要分开并装上卡车车队。然后，每辆卡车独立地通过高速公路、公路和立交桥组成的网络向该仓库运送货物。在目的地仓库，卸下这些货物，并且与一起装载的同一批货物的其余部分堆放在一起。因此，在许多方面，分组类似于卡车，通信链路类似于高速公路和公路，分组交换机类似于立交桥，而端系统类似于建筑物。就像卡车选取运输网络的一条路径前行一样，分组则选取计算机网络的一条路径前行。

端系统通过**因特网服务提供商**（Internet Service Provider，ISP）接入因特网，包括如本地电缆或电话层司那样的住宅区 ISP、公司 ISP、大学 ISP，以及那些在机场、旅馆、咖啡店和其他公共场所提供 WiFi 接入的 ISP。每个 ISP 是一个由多个分组交换机和多段通信链路组成的网络。各 ISP 为端系统提供了各种不同类型的网络接入，包括如线缆调制解调器或 DSL 那样的住宅宽带接入、高速局域网接入、无线接入和 56kbps 拨号调制解调器接人。ISP 也为内容提供者提供因特网接入服务，将 Web 站点直接接人因特网。因特网就是将端系统彼此互联，因此为端系统提供接入的 ISP 也必须互联。低层的 ISP 通过国家的、国际的高层 ISP（如 Level 3 Communications、AT\&T、Sprint 和 NTT）互联起来。高层 ISP 是由通过高速光纤链路互联的高速路由器组成的。无论是高层还是低层 ISP 网络，它们每个都是独立管理的，运行着 IP 协议（详情见后），遵从一定的命名和地址习惯。我们将在 1.3 节中更为详细地考察 ISP 及其互联的情况。

端系统、分组交换机和其他因特网部件都要运行一系列**协议**（protocol），这些协议控制因特网中信息的接收和发送。**TCP**（Transmission Control Protocol，传输控制协议）和 **IP**（Internet Protocol，网际协议）是因特网中两个最为重要的协议。IP 协议定义了在路由器和端系统之间发送和接收的分组格式。因特网的主要协议统称为 TCP/IP。我们在这一章中就开始接触这些协议。但这仅仅是个开始，本书的许多地方与计算机网络协议有关。

鉴于因特网协议的重要性，每个人就各个协议及其作用取得一致认识是很重要的，这样人们就能够创造协同工作的系统和产品。这正是标准发挥作用的地方。因特网标准（Internet standard）由**因特网工程任务组**（Internet Engineering Task Force，IETF）【IETF 2012】研发。IETF 的标准文档称为**请求评论**（RequestForComment，RFC）。RFC 最初是作为普通的请求评论（因此而得名），以解决因特网先驱者们面临的网络和协议问题【Allman 2011】。RFC 文档往往是技术性很强并相当详细的。它们定义了 TCP、IP、HTTP（用于 Web）和 SMTP（用于电子邮件）等协议。目前已经有将近 6000 个 RFC。其他组织也在制定用于网络组件的标准，最引人注目的是针对网络链路的标准。例如，IEEE 802 LAN/MAN 标准化委员会【IEEE 802 202】制定了以太网和无线 WiFi 的标准。

## 1.1.2 服务描述

前面的讨论已经辨识了构成因特网的许多部件。但是我们也能从一个完全不同的角度，即从**为应用程序提供服务的基础设施**的角度来描述因特网。这些应用程序包括电子邮件、Web 冲浪、即时讯息、社交网络、IP 语音（VoIP）、流式视频、分布式游戏、对等（peer-to-peer，P2P）文件共享、因特网电视、远程注册等等。这些应用程序称为**分布式应用程序**（distributed application），因为它们涉及多台相互交换数据的端系统。重要的是，因特网应用程序运行在端系统上，即它们并不运行在网络核心中的分组交换机中。尽管分组交换机促进端系统之间的数据交换，但它们并不关心作为数据的源或宿的应用程序。

我们稍深入地探讨一下为应用程序提供服务的基础设施的含义。为此，假定你对分布式因特网应用程序有一个激动人心的新思想，它可能大大地造福于人类，或者它可能直接使你富有和岀名。你将如何将这种思想转换成为一种实际的因特网应用程序呢？因为应用程序运行在端系统上，所以你将需要编写运行在端系统上的一些软件。例如，你可能用 Java、C 或 Python 编写软件。此时，因为你在研发一种分布式因特网应用程序，运行在不同端系统上的软件将需要互相发送数据。在这里我们碰到一个核心问题，这导致了另一种描述因特网的方法，即将因特网描述为应用程序的平台。运行在一个端系统上的应用程序怎样才能指令因特网向运行在另一个端系统上的软件发送数据呢？

与因特网相连的端系统提供了一个**应用程序编程接口**（Application Programming Interface，API），该 API规定了运行在一个端系统上的软件请求因特网基础设施向运行在另一个端系统上的特定目的地软件交付数据的方式。因特网 API 是一套发送软件必须遵循的规则集合，因此因特网能够将数据交付给目的地。我们将在第 2 章详细讨论因特网 API。此时，我们做一个简单的类比，在本书中我们将经常使用这个类比。假定 Alice 使用邮政服务向 Bob 发一封信。当然，Alice 不能只是写了这封信（相关数据）然后把该信丢岀窗外。相反，邮政服务要求 Alice 将信放入一个信封中；在信封的中央写上 Bob 的全名、地址和邮政编码；封上信封；在信封的右上角贴上邮票；最后将该信封丢进一个邮局的邮政服务邮箱中。因此，该邮政服务有自己的 “邮政服务 API” 或一套规则，这是 Alice 必须遵循的，这样邮政服务才能将自己的信件交付给 Bob。同理，因特网也有一个发送数据的程序必须遵循的 API，使因特网向接收数据的程序交付数据。

当然，邮政服务向顾客提供了多种服务，如特快专递、挂号、普通服务等。同样的，因特网向应用程序提供了多种服务。当你研发一种因特网应用程序时，也必须为你的应用程序选择其中的一种因特网服务。我们将在第 2 章中描述因特网服务。

我们已经给出了因特网的两种描述方法：一种是根据它的硬件和软件组件来描述，另一种是根据基础设施向分布式应用程序提供的服务来描述。但是，你也许还是对什么是因特网感到困惑。什么是分组交换？什么是 TCP/IP？什么是路由器？因特网中正在使用什么样的通信链路？什么是分布式应用程序？一个烤箱或天气传感器怎样与因特网相连？如果现在对这些心存疑惑，请不要担心。这本书的目的除了向你介绍因特网的具体构成外，还要介绍制约因特网的工作方式和工作原理。我们将在后续章节中解释这些重要的术语和问题。

## 1.1.3 什么是协议

既然我们已经对因特网是什么有了一点印象，那么下面考虑计算机网络中另一个重要的时髦术语：协议。什么是协议？协议是用来干什么的？

### 1. 人类活动的类比

也许理解计算机网络协议概念的一个最容易办法是，先与某些人类活动进行类比，因为我们人类无时无刻不在执行协议。考虑当你想要向某人询问时间时将要怎样做。图 1-2 中显示了一种典型的交互过程。人类协议（至少说是好的行为方式）要求一方首先进行问候（图 1-2 中的第一个“你好”），以开始与另一个人的通信。对“你好”的典型响应是返回一个“你好”报文。此人用一个热情的 “你好” 进行响应，隐含着一种指示，表明能够继续向那人询问时间了。对最初的“你好”的不同响应（例如“不要烦我！”，或“我不会说英语”，或某些不合时宜的回答）也许表明了一个勉强的或不能进行的通信。在此情况下，按照人类协议，发话者也许将不能够询问时间了。有时，问的问题根本得不到任何回答，在此情况下，发话者通常会放弃向这个人询问时间。注意在我们人类协议中，**有我们发送的特定报文，也有我们根据接收到的应答报文或其他事件采取的动作**（例如在某个给定的时间内没有回答）。显然，发送和接收的报文，以及这些报文发送和接收或其他事件出现时所采取的动作，这些在一个人类协议中起到了核心作用。如果人们使用不同的协议（例如，如果一个人讲礼貌，而另一人不讲礼貌，或一个人明白时间这个概念，而另一人却不知道），该协议就不能互动，因而不能完成有用的工作。在网络中这个道理同样成立。即为了完成一项工作，要求两个（或多个）通信实体运行相同的协议。

我们再考虑第二个人类类比的例子。假定你正在大学课堂里上课（例如上的是计算机网络课程）。教师正在唠唠叨叨地讲述协议，而你困惑不解。这名教师停下来问：“同学们有什么问题吗？”（教师发送出一个报文，该报文被所有没有睡觉的学生接收到了。）你举起了手（向教师发送了一个隐含的报文），这位教师面带微笑地示意你说：“请讲……”（教师发岀的这个报文鼓励你提出问题，教师喜欢被问问题。）接着你就问了问题（即向该教师传输了你的报文）。教师听取了你的问题（即接收了你的问题报文）并加以回答（向你传输了回答报文）。我们再一次看到了报文的发送和接收，以及这些报文发送和接收时所釆取的一系列约定俗成的动作，这些是这个 “提问与回答” 协议的核心。

### 2. 网络协议

网络协议类似于人类协议，除了交换报文和采取动作的实体是某些设备的硬件或软件组件（这些设备可以是计算机、智能手机、平板电脑、路由器或其他具有网络能力的设备）。在因特网中，凡是涉及两个或多个远程通信实体的所有活动都受协议的制约。例如，在两台物理上连接的计算机中，硬件实现的协议控制了在两块网络接口卡间的 “线上” 的比特流；在端系统中，拥塞控制协议控制了在发送方和接收方之间传输的分组发送的速率。协议在因特网中到处运行，因此本书的大量篇幅与计算机网络协议有关。

以大家可能熟悉的一个计算机网络协议为例，考虑当你向一个 Web 服务器发岀请求（即你在 Web 浏览器中键入一个 Web 网页的 URL）时所发生的情况。图 1-2 右半部分显示了这种情形。首先，你的计算机将向该 Web 服务器发送一条连接请求报文，并等待回答。该 Web 服务器将最终能接收到连接请求报文，并返回一条连接响应报文。得知请求该 Web 文档正常以后，计算机则在一条 GET 报文中发送要从这台 Web 服务器上取回的网页名字。最后，Web 服务器向计算机返回该 Web 网页（文件）。

从上述的人类活动和网络例子中可见，报文的交换以及发送和接收这些报文时所采取的动作是定义一个协议的关键元素：

**一个协议定义了在两个或多个通信实体之间交换的报文格式和次序，以及报文发送和 / 或接收一条报文或其他事件所采取的动作。**

因特网（更一般地说是计算机网络）广泛地使用了协议。不同的协议用于完成不同的通信任务。当你阅读完这本书后将会知道，某些协议简单而直截了当，而另一些协议则复杂且晦涩难懂。掌握计算机网络领域知识的过程就是理解网络协议的构成、原理和工作方式的过程。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hansimov.gitbook.io/cnatda/di-1-zhang-ji-suan-ji-wang-luo-he-yin-te-wang/1.1-shen-me-shi-yin-te-wang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
