Skip to content

计算机科学入门

互联网太棒啦,键盘敲几下就能在 Youtube 直播,在维基百科上阅读文章,在亚马逊买东西,和朋友视频,发一条天气推特。

毫无疑问,用户在全球网络中发送和接收信息的能力,永远改变了这个世界。

150 年前发一封信件从伦敦到加州要花 2~3 周,而且还是特快邮件,如今电子邮件只要几分之一秒,时延 改善了上百万倍,振兴了全球经济,帮助现代世界在遍布全球的光纤中快速发展。

球鞋网络

你可能觉得计算机和网络密切相关,但事实上,1970 年以前大多数计算机是独立运行的。

然而因为大型计算机开始随处可见,廉价机器开始出现在书桌上,分享数据和资源渐渐变得有用起来,首个计算机网络出现了。

第一个计算机网络出现在1950~ 1960年代,通常在公司或研究室内部使用,为了方便信息交换,比把纸卡或磁带送到另一栋楼里更快速可靠,这叫 球鞋网络 (sneakernet)。

第二个好处是能 共享 物理资源,举个例子,与其每台电脑配一台打印机,大家可以共享一台联网的打印机。

image-20231029172435865

局域网

早期网络也会共享存储空间,因为每台电脑都配存储器太贵了,计算机近距离构成的小型网络,叫 局域网 (Local Area Networks),简称 LAN

以太网

局域网能小到是同一个房间里的两台机器,或大到校园里的上千台机器,尽管开发和部署了很多不同 LAN 技术,其中最著名和成功的是 以太网 (Ethernet),开发于 1970 年代,在施乐的 帕洛阿尔托研究中心 诞生,今日仍被广泛使用。

image-20231029172500379

以太网的最简单形式是: 一条以太网电线连接数台计算机

image-20231029172557133

当一台计算机要传数据给另一台计算机时,它以电信号形式,将数据传入电缆,当然因为电缆是共享的,连在同一个网络里的其他计算机也看得到数据,但不知道数据是给它们的,还是给其他计算机的。

MAC 地址

为了解决这个问题以太网需要每台计算机有唯一的,媒体访问 控制地址 (Media Access Control address),简称 MAC 地址 ,这个 唯一 的地址放在头部,作为数据的前缀发送到网络中。

image-20231029172631518

所以,计算机只需要监听以太网电缆,只有看到自己的 MAC 地址,才处理数据,这运作得很好。

image-20231029172644436

现在制造的每台计算机都自带唯一的 MAC 地址,用于以太网和无线网络。

CSMA

多台电脑共享一个传输媒介,这种方法叫 载波侦听多路访问 (Carrier Sense Multiple Access),简称 CSMA

载体 (carrier) 指运输数据的共享媒介,以太网的 "载体" 是 铜线 ,WiFi 的 "载体" 是传播无线电波的 空间 ,很多计算机同时侦听载体,所以叫 侦听多路访问 ,而载体传输数据的 速度带宽

指数退避

不幸的是使用共享载体有个很大的弊端,当网络流量较小时计算机可以等待载体清空,然后传送数据,但随着网络流量上升两台计算机想同时写入数据的概率也会上升,这叫 冲突数据

image-20231029172838368

全都乱套了,就像两个人同时在电话里讲话。

image-20231029172914064

幸运的是计算机能够通过监听电线中的信号 检测 这些冲突,最明显的解决办法是 停止传输 ,等待网络空闲,然后再试一遍。

问题是其他计算机也打算这样做,其他等着的计算机可能在任何停顿间隙闯入,导致越来越多冲突。很快,每个人都一个接一个地讲话而且有一堆事要说。

以太网有个超简单有效的解决方法: 当计算机检测到冲突就会在重传之前等待一小段时间

因为要举例,假设是 1 秒好了,当然如果所有计算机用 同样 的等待时间是不行的,它们会在一秒后再次冲突,所以加入一个 **随机时间 ** 一台计算机可能等 1.3 秒,另一台计算机等待 1.5 秒。

要是运气好等 1.3 秒的计算机会醒来,发现载体是 空闲 的然后开始传输,当 1.5 秒的计算机醒来后会发现载体被占用,会等待其他计算机完成。

这有用但不能完全解决问题,所以要用另一个小技巧。

正如刚才说的,如果一台计算机在传输数据期间检测到冲突,会等一秒 + 随机时间、

然而如果再次发生冲突表明有 网络拥塞 ,这次不等 1 秒,而是等 2 秒,如果再次发生冲突等 4 秒,然后 8 秒 16 秒等等,直到成功传输。

因为计算机的退避冲突次数降低了,数据再次开始流动起来网络变得顺畅,这种指数级增长等待时间的方法叫 指数退避 (Exponential Backoff)。

冲突域和交换机

以太网和 WiFi 都用这种方法很多其他传输协议也用,但即便有了 指数退避 这种技巧,想用一根网线链接整个大学的计算机还是不可能的,为了减少冲突 + 提升效率,我们需要 减少 同一载体中设备的数量,载体和其中的设备总称 冲突域 (Collision Domain)。

让我们回到之前以太网的例子,一根电缆连 6 台计算机,也叫一个冲突域。

为了减少冲突我们可以用 交换机 (Network Switch)把它拆成两个冲突域,交换机位于两个更小的网络之间,必要时才在两个网络间传数据。

image-20231029173000902

交换机会记录一个列表,写着哪个 MAC 地址在哪边网络。

如果 A 想传数据给 C ,交换机不会把数据转发给另一边的网络。

image-20231029173018055

如果 E 想同一时间传数据给 F ,网络仍然是空的,两个传输可以同时发生。

image-20231029173028907

但如果 F 想发数据给 A 数据会通过交换机,两个网络都会被短暂占用。

image-20231029173047018

大的计算机网络也是这样构建的,包括最大的网络 互联网 也是多个连在一起的稍小一点网络,使不同网络间可以传递信息。

路由

这些大型网络有趣之处是,从一个地点到另一个地点通常有多条路线,这就带出了另一个话题: 路由 (routing)。

image-20231029173108842

连接两台相隔遥远的计算机或网路,最简单的办法,是分配一条 专用 的通信线路,早期电话系统就是这样运作的。

假设 印第安纳波利斯米苏拉 之间,有五条电话线,如果在 1910 年代,John 想打电话给 Hank ,John 要告诉 操作员 他想打到什么地方,然后工作人员 手动 将 John 的电话连到,通往米苏拉的未使用线路。

image-20231029173208850

通话期间这条线就被占用了如果五条线都被占用了,John 要等待某条线空出来。

image-20231029173220472

电路交换

这叫 电路交换 (Circuit Switching),因为是把电路连接到正确目的地,能用倒是能用,但不灵活而且价格昂贵因为总有闲置的线路。

好处是如果有一条 专属 于自己的线路,你可以最大限度地随意使用,无需共享。

因此军队,银行和其他一些机构依然会购买专用线路来连接数据中心。

image-20231029173246703

报文交换

传输数据的另一个方法是 报文交换 (Message Switching),就像邮政系统一样,不像之前 A 和 B 有一条专有线路,消息会经过好几个站点。

如果 John 写一封信给 Hank ,信件可能从 印第安纳波利斯芝加哥 ,然后 明尼阿波利斯 然后 比林斯 最后到 米苏拉

image-20231029173308734

每个站点都知道下一站发哪里,因为站点有表格,记录到各个目的地,信件该怎么传,报文交换的好处是可以用不同路由,使通信更可靠更能容错。

回到邮件的例子,如果 明尼阿波利斯 有暴风雪中断了通信,芝加哥 可以传给 奥马哈

image-20231029173332822

跳数

在这个例子里,城市就像路由器一样,消息沿着路由跳转的次数,叫 跳数 (hopcount)。记录跳数很有用,因为可以分辨出路由问题。

举例,假设芝加哥认为,去米苏拉的最快路线是奥马哈,但奥马哈认为,去米苏拉的最快路线是芝加哥。

这就糟糕了,因为 2 个城市看到目的地是米苏拉,结果报文会在 2 个城市之间,不停传来传去,不仅浪费带宽而且这个路由错误需要修复。

这种错误会被检测到,因为跳数记录在消息中,而且传输时会更新跳数,如果看到某条消息的跳数很高,就知道路由肯定哪里错了,这叫 跳数限制

数据包

报文交换的缺点之一是有时候报文比较大,会堵塞网络因为要把整个报文从一站传到下一站后,才能继续传递其他报文,传输一个大文件时整条路都阻塞了。

即便你只有一个 1KB 的电子邮件要传输,也只能等大文件传完,或是选另一条效率稍低的路线。

解决方法是将大报文 分成很多小块 ,叫 数据包 (packets),就像报文交换每个数据包都有目标地址,因此路由器知道发到哪里。

报文具体格式由 互联网协议 (Internet Protocol)定义,简称 IP ,这个标准创建于 1970 年代,每台联网的计算机都需要一个 IP 地址。

你可能见过,以点分隔的 4 组数字,例如 172.217.7.238 是Google其中一个服务器的 IP 地址。

数百万台计算机在网络上不断交换数据,瓶颈的出现和消失是毫秒级的,路由器会平衡与其他路由器之间的负载,以确保传输可以快速可靠,这叫 阻塞控制 (congestion control)。

分组交换

有时,同一个报文的多个数据包,会经过不同线路,到达顺序可能会不一样,这对一些软件是个问题。

image-20231029173425248

幸运的是,在 IP 之上还有其他协议,比如 TCP/IP ,可以解决乱序问题。

将数据拆分成多个小数据包,然后通过灵活的路由传递,非常高效且可容错,如今互联网就是这么运行的,这叫 分组交换 (Packet Switching)。

有个好处是它是去 中心化 的,没有中心权威机构,没有单点失败问题。

事实上因为冷战期间有核攻击的威胁,所以创造了分组交换。

如今,全球的路由器协同工作,找出最高效的线路,用各种标准协议运输数据,比如 因特网控制消息协议 (ICMP) 和 边界网关协议 ( BGP)。

世界上第一个分组交换网络,以及现代互联网的祖先是 ARPANET ,名字来源于赞助这个项目的机构, 美国高级研究计划局

这是1974年整个 ARPANET 的样子,每个小圆表示一个地点,比如大学或实验室,那里运行着一个路由器,并且有一台或多台计算机。

image-20231029173449848

能看到 PDP-1IBM360系统 ,甚至还有一个伦敦的 ATLAS ,是通过 卫星 连到网络里的。

显然互联网在这几十年间发展迅速,如今不再只有几十台计算机联网,据估计有接近 100 亿台联网设备,而且互联网会继续快速发展,特别是如今各种智能设备层出不穷,比如联网冰箱,恒温器,以及其他智能家电,它们组成了 物联网

image-20231029173530184

用心去做高质量的编程学习内容网站,欢迎star ⭐让更多人发现!