今天的因特网无疑是有史以来由人类创造的、精心设计的最大系统、该系统由数以千计的计算机设备(计算机、平板电脑、智能手机)彼此相互连接构成,并且还有一批与因特网相互连接的物品比如游戏机、监控系统、汽车、医疗设备、智能眼镜、手表、运动手环等,随着5G时代的到来,万物互联也越来越称为可能,这里推荐一下 尤瓦尔·赫拉利 的《未来简史》,这个人的格局很高,他书中描述的未来也越来越成为现实,他写的文字能让你感觉到你更想变为计算机世界里的一片硅片。
但是,面对互联网如此巨大且迅速的变化,我们能做些什么?我在地铁站等车的时候经常被地铁广告洗脑,鼓吹人工智能发展的多么牛逼,鼓吹大家都成为人工智能的高端型人才,我不能否认这个操作,但是我认为人工智能并不适合每个人,而且人工智能需要的技术和知识储备是巨大的,所以,与其憧憬成为人工智能的高端型人才,不如把眼下的计算机基础知识学好,你的未来才会有更多的可能性。毕竟,一切计算力发展的源头都是计算机,也可以说现在互联网一切的衍生物都是计算机的儿子。
说到计算机基础,就不得不提计算机网络,就像人长大后是需要和外界进行交流一样,计算机网络也是计算机彼此通信的必要条件。如果计算机的创造好比新中国成立,那么计算机网络的出现就相当于是改革开放。并且计算机网络是每个软件工程师必须要学好的一门知识。扯了这么多,下面开始进入正题,一展计算机网络的宏图。
什么是因特网
首先来聊一下因特网是什么,wiki 对它的定义是:因特网是一个全球范围的互联网系统,它使用 TCP/IP 协议簇来链接全世界的设备。我们可以从两个方面来描述一下因特网
- 我们描述因特网可以通过基本硬件和软件组件来进行描述
- 我们能够根据为分布式应用提供服务的联网基础设施来描述因特网
我们先从第一条描述开始
因特网的描述
通过硬件和软件来描述
因特网是一个世界范围的计算机网络。说到因特网的构成,就不得不提构成因特网的组件是什么,还记得我们开头提到的因特网设备吗?智能手机、平板电脑,智能电视,智能家居,游戏机,手表,汽车,眼镜,温度调节系统,这些构件在因特网中有个专门的术语,所有的这些设备都被称为主机(host)或者端系统(end system),一提到主机你是不是想到的是计算机的主机?这两个主机的领域虽然不同,但是它们的作用是相同的,都是系统的大脑。据保守性评估,2015年已经有大约50亿台设备接入了因特网。而到了2020年这个数字将会变为250亿。
那么这些主机或者端系统之间是如何进行通信的呢?实际上,端系统通过通信链路(communication link)和分组交换机(packet switch) 连接到一起。
通信链路:指的是因特网中两个节点之间的物理通道。通信链路的传输介质有双绞线、光纤 和 微波
分组交换机:网络交换设备,它主要包括三个基本部分:交换单元、接口单元和控制单元。
不同的链路能够以不同的速率进行传输数据,称为链路的传输速率(transmission type) ,以 比特/秒(bit/s,或 bps)进行度量。当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节。由此形成的信息包用计算机网络的术语称为分组(packet),这个分组的概念非常重要,以后我们会经常提到。这些分组通过网络发送到目的端系统,在那里被装配成初始数据。
分组交换机从它的一条入通信链路接收到达的分组,并从它的一条出通信链路转发该分组。分组交换机的种类有很多种,最著名最常见的分组交换机就是路由器(router) 和 链路层交换机(link-layer switch),一个分组所经历的一系列通信链路和分组交换机称为通过该网络的路径(route 或者 path)。
上面讲述的名词肯能比较晦涩,如果你不是很理解的话,就可以把分组在交换网络中的传输比作是 运输车在高速公路上的运输,分组类似于卡车,通信链路类似于高速公路,分组交换机类似于交叉口,端系统类似于建筑物,就像卡车需要从某一建筑物的起点经过高速公路和交叉口到达另外一个建筑物的过程。就像卡车需要选取一条路进行运输一样,分组也选取计算机网络的一条路径前行。
端系统通过因特网服务提供商(Internet Service Provider,ISP) 接入因特网,包括如本地电缆或电话公司那样的住宅区 ISP、公司 ISP、大学 ISP,在机场、咖啡馆或者公共场所所提供的 WiFi 接入的 ISP,以及为智能手机或者其他设备提供移动接入的蜂窝数据。
我们国家的 ISP 主要有三大基础运营商,中国电信、中国移动和中国联通。
端系统、分组交换机和其他因特网部件都要运行一系列的 协议(protocol),这些协议控制因特网中信息的接收和发送。其中 TCP和 IP 协议是因特网中最重要的两个协议。IP协议定义了在路由器和端系统之间发送和接收的分组格式。因特网中的协议统称为TCP/IP,而不单单指的是TCP 和 IP 两个协议。
那么这些协议是由谁制定的呢?实际上,这些因特网协议或者称为因特网标准是由因特网工程任务组(Internet Engineering Task Force)
通过分布式应用程序来描述
上面我们描述的因特网是从硬件和软件层面进行说明的,除此之外,我们还可以通过为分布式应用提供服务的联网基础设施来描述因特网,这个概念比较抽象,我们还是举例子说明一下。除了传统应用程序就像是电子邮件和web 冲浪外,因特网应用还包括智能手机和平板应用程序,这些应用程序中又包括像是即时通讯、来自云的音乐流、电影和电视流、在线社交网络、视频会议、多人游戏和基于位置的推荐系统。因为这些应用程序涉及多个相互交换的端系统,所以这些应用被称为分布式应用程序。重要的是,因特网应用程序运行在端系统上,而不是运行在网络核心的分组交换机中。
我们来深入的探究一下,因为应用程序可能会运行在端系统上,所以你需要编写使其运行在端系统上的程序,你可能会使用 C、Java、Python 来编写。现在,因为你开发了一个分布式应用程序,这个程序运行在不同的端系统需要彼此发送消息。此时我们遇见一个核心问题,那就是一个运行在端系统的应用程序如何让其他运行在端系统的应用程序收发数据呢?
接入因特网的端系统提供了一个套接字接口(socket Interface)用于和其他端系统的应用程序收发数据。这个因特网套接字是应用程序必须要遵守的约定。
协议是什么
既然我们已经对因特网有了一点概念了,下面我们就来探讨一下因特网又一个很重要的概念那就是协议,协议就相当于是人类活动所遵守的约定。
人类活动的比喻
理解计算机网络协议最简单的方式就是把它抽象为我们的生活,因为我们人类无时无刻都在执行协议。考虑一下当你想向其他人询问当前时间的时候你会怎样做?下面是一个典型的询问方式
上图是一个男女双方都比较友好的对话,那么假如女方回答:"请不要烦我",或者说我不会说中文等等类似不合时宜的回答造成双方不再对话,那么此时就会造成中断。通常情况下,发问者就会放弃继续询问。那么造成上述中断的原因是什么呢?是不是男女双方没有就询问时间这个话题达成一致呢?也就是说,协议最重要的一点就是为了完成一项工作,需要两个(或多个)通信实体遵守相同的协议。
网络协议
网络协议非常类似于人类协议,除了通信双方由人类变为乐计算机载体,哦,协议也会不一样。以大家熟悉的一个计算机网络协议为例,考虑当你向一个 Web 服务器发送请求时(即你在 Web 浏览器中键入一个 Web 页面的 URL)所发生的情况。