今天的因特网无疑是有史以来由人类创造、精心设计的最大系统,该系统有数以亿计的相连的计算机、路由器和交换机等等。面对如此巨大并且具有如此众多不同组件和用户的因特网,是否能够理解它的工作原理?是否存在某些指导原则和结构,能够作为理解规模和复杂程度惊人的系统的基础?如果是这样的话,那么学习计算机网络会变得既引人入胜又令人兴趣盎然吗?幸运的是,对所有这些问题的答复都是肯定的。
1.1什么是因特网
在这里,我用一种特定的计算机网络,即公共因特网,也是我们每天都在使用的网络,作为讨论计算机网络及其协议的主要载体。但什么是因特网?我们可以从两个不同的角度回答这个问题:其一
,我们能够描述因特网的具体构成,即构成因特网的基本硬件和软件基本组件;其二
,我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。
1.1.1具体构成描述
因特网是一个世界范围的计算机网络,它是一个互联了遍及全世界的数以亿计的计算设备的网络。这些计算设备的在范围和种类上的概念已经发生巨大的变化了,它们不仅仅指的是传统的桌面PC、Linux工作站和所谓的 服务器了,如今的智能手机、平板电脑、电视、游戏机、汽车、家用电器等等都已加入计算设备的行列了,它们能一起与因特网相连。用因特网的术语来讲,这些设备都称为主机
或端系统
。仿佛计算机网络开始听起来有点过时了,称其为万物互联网(物联网IoT)好像才能符合现在的状况。
端系统通过通信链路
和分组交换机
连接到一起。
通信链路
有许多种类型,它们由不同的物理媒介组成,包括同轴电缆、光纤和无线电频谱等等。不同的链路有不同的数据传输速率(bps/s,每秒bit数)。当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每个分段加上首部字节,由此形成的数据包用计算机网络的术语来说称为分组
。这些分组通过网络发送到目的端系统,在那里被装配成初始数据。
分组交换机
从它的一条入通信链路接收到达的分组,并从它的一条出通信链路转发该分组。在当今的因特网中,两种最常见的是路由器
和链路层交换机
,这两种类型的交换机都是朝着最终目的地转发分组。链路层交换机通常用于接入网中,而路由器通常用于网络核心中
。从发送端系统到接收端系统,一个分组所经历的一系列通信链路和分组交换机称为通过该网络的路径
。
下面我举个例子,帮助理解上面的概念和一些名词。我们将因特网比作全国的交通运输网络,该网络包括高速公路、普通公路和城市立交桥等等。考虑下面一个情况:一个工厂(发送端系统)需要将一批货物运送到数千公里的某个目的地仓库,我们假设这批货物重达数百万吨(这批货物好比我们在发送端系统需要发送的数据),我们暂不谈有没有一辆货车能一次性运走,即使有,我们要知道现实的高速公路、立交桥能承受的了吗,所以,货物要分批的由一辆一辆的小货车运送(这里的一辆小货车就好比分组,货物太多,得分成一份一份的运),这些货车可能得有数千辆,它们有一个共同的目的地,司机们都知道,当他们出发时,路上可能会因为不同的原因,堵车啊、需要路过家里见一见家人啊等等,司机们的路线可能不一样,在路口分散前行,但最终都会在目的地集合卸货,完成此次运输。因此,在上面的这个例子中,分组类似于一辆辆的小货车,通信链路类似于高速公路、公路、立交桥等等,分组交换机类似于路口,端系统类似工厂和仓库,路径类似于司机们选择的路线,注意到这样的一个情况很重要: 到达同一个目的地的多个分组经过的路径是可以不一样的,因为网络也会阻塞
。
端系统通过因特网服务提供商(ISP,Internet Service Provider)
接入因特网,比如中国移动、中国联通、中国电信都是ISP。
端系统、分组交换机以及其他因特网组件都要运行一系列协议
,这些协议控制因特网中信息的接收和发送,因为TCP(控制传输协议)和IP(网际协议)
是因特网中两个最为重要的协议,所以就用TCP/IP统称因特网的主要协议。
由于因特网协议的重要性,全世界的国家、组织、机构和个人就每个协议及其作用取得一致认识是很重要的,这样人们就能创造协调工作的系统和产品了,这正是标准发挥作用的地方。因特网由因特网工程任务组(Internet Engineering Task Force, IETF)
研发,IETF的标准文档称为请求评论(Request For Comment, RFC)
,RFC一开始作为普通的请求评论而得名,用于解决因特网先驱们面临的网络和协议问题。
1.1.2 提供服务描述
前面的讨论已经提到了构成因特网的很多组件,比如端系统、通信链路、路由器、链路层交换机等等。
但是这一节,我们从另一个完全不同的角度,即为应用程序提供服务的基础设施的角度来描述因特网
。这些应用程序包括:email、web网站、即时通讯(QQ/微信)、视频app、音乐app等等。这些应用程序称为分布式应用程序
,因为虽然对外提供一个对应的服务,比如购物网站,但是你要知道这个网站不可能只运行在一台服务器上,因为涉及多台服务器共同协调合作,对外提供服务,但是用户却感觉不到,所以称之为分布式应用
,也就是说这个应用分散部署在不同的服务器上,不受地理上的限制,这些服务器互相通信共同对外提供服务。
我们稍微深入讨论下为应用程序提供服务的因特网基础设施的含义。比如,你想为了改变人类生活方式或想自己变得富有,而要开发一个分布式应用程序,这个程序运行在很多服务器上,它们之间要互相发送数据。在这里我们碰到一个核心问题,这导致了另一个描述因特网的方法,即将因特网描述为应用程序的平台。运行在一个服务器上的程序怎么命令因特网基础设施向运行在另一台服务器上的程序发送数据呢?
计算机操作系统提供了一个应用程序编辑接口(Application Programming Interface, API)
,该API规定了运行在一个端系统上的软件请求因特网基础设施向运行在另一个端系统上的软件交付数据的方式。这个API是一套所有能够联网的应用软件都必须遵循的规则集合,因此因特网能够将数据交付到目的地。
我举个例子说明下,假如你想通过中国邮政写一封信给家里人,,当然你不能只写了信的内容(要发送的数据),然后把信丢在门外。相反,邮政局要求你将信放在信封里,并写上收信人的地址、邮政编码和名字,封上信封,贴上邮票;最后将信封放进邮政局指定的邮箱里。因此,邮政局有着自己一套‘邮政服务API’
,你必须遵守,这样邮政局才能将你的信交到家里人手中。同理,因特网也有一套发送数据的程序必须遵守的API跪着,使因特网能够为应用程序发送和接收数据。
当然邮政局提供了多种服务,有EMS,普通邮寄,这由写信的人决定,同样的,因特网也向应用程序提供了多种服务,比如TCP和UDP两种不同的运输服务。
1.1.3 什么是协议
既然我们已经对因特网是什么有了点了解,那么下面考虑计算机网络中另外一个核心术语(非常非常非常重要的概念,必须掌握它的定义,因为它是整个网络的核心):协议
。什么是协议?协议是用来干什么?
1.1.3.1 人类活动的类比
理解计算机网络协议概念的一个最容易的办法是,先与某些人类活动类比,毕竟协议在我们的日常生活中随处可见。
考虑下面这个实际场景:当你想要向某人询问时间时将会怎么做,首先,你肯定得进行一个问候,比如说‘’你好‘’,以开始与另一个人的通信,对“你好”的典型响应是返回一个“你好”报文。如果此人用一个“你好”进行响应,隐含着一种意思,表明你可以继续询问时间了,而如果此人对“你好”不响应,或者响应一句“别烦我!”等类似的话,在此情况下,按照人类协议,表明你不能继续询问了。在我们人类协议中,有我们发送的特定报文,也有我们根据接收到应答报文或其他事件而采取的动作
。显然,发送和接收的报文,以及这些报文发送和接收或其他事件出现时所采取的动作,这些在一个人类协议中起到了核心作用。如果在一种特定的情况下,人们使用不同的协议(一个人讲礼貌,而另一个人不讲礼貌,或一个人明白时间这个概念,另一个人不明白),该协议就不能发挥作用。在网络中这个道理同样成立。即为了完成一项工作,要求两个或多个通信实体运行相同的协议。
1.1.3.2 网络协议
网络协议类似与人类协议,交换报文和采取动作的实体由人变成了硬件设备或软件组件,这些设备可以是计算机、智能手机、平板电脑、交换机和路由器等等具有网络能力的设备。在因特网中,所有的通信实体进行的所有活动都受协议的制约。
以大家最熟悉的一个计算机网络协议(HTTP)为例,考虑当你打开一个网页时所发生的情况。首先你在Web浏览器输入一个网页链接,然后回车,你的计算机将向该Web服务器发送一个请求连接报文,并等待服务器确认,该服务器收到你的连接请求后,如果返回一个连接响应报文,得知请求正常后,你的计算机则在一个GET请求报文中发送要从这台服务器上取回的网页名字。最后Web服务器向计算机返回该网页文档,然后你浏览器会展示该文档,这就是你看到的网页。
从上述的人类活动和网络例子中可见,报文的交换以及发送和接收这些报文时所采取的动作是定义一个协议的关键元素:
一个协议
定义了在两个或多个通信实体之间交换的报文格式和次序,以及发送和接收一条报文时所采取的动作。
因特网,或者更一般地说是计算机网络,到处都是协议,毫不夸张的说,掌握计算机网络领域知识的过程就是理解各种网络协议的构成、原理和工作方式的过程。