本系列为作者学习记录
感谢Jack-Cui视频的启发
视频地址:【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
系列文章目录
从零开始的自我提升计划:计算机科学(一)
从零开始的自我提升计划:计算机科学(二)
从零开始的自我提升计划:计算机科学(三)
从零开始的自我提升计划:计算机科学(四)
从零开始的自我提升计划:计算机科学(五)
从零开始的自我提升计划:计算机科学(六)
从零开始的自我提升计划:计算机科学(七)
前言
本文内容包括:
- 计算机网络-Computer Networks
- 互联网-The Internet
- 万维网-The World Wide Web
- 计算机安全-Cybersecurity
- 黑客与攻击-Hackers & Cyber Attacks
- 加密-Cryptography
一、计算机网络
当计算机逐渐小型化后,分项数据和资源渐渐开始有用起来。第一个计算机网络出现在1950~1960年代,在公司内部或研究室内使用,叫做“球鞋网络(Sneakernet)”,它不仅可以传输数据,还可以共享物理资源,早期的网络也可以共享存储设备。
计算机近距离构成的小型网络叫“局域网”,简称LAN,最著名最成功的的是“以太网”,至今仍被广泛使用。以太网使用以太网线将所有设备连接在一起,每台设备都有唯一的媒体访问控制地址,简称MAC地址,用来解决共享数据时无法得知数据是传给哪台设备的问题。多台电脑共享一个传输媒介,这种方法叫做“载波侦听多路访问”,简称CSMA。共享载体有一个很大的弊端,即当多台设备需要同时写入数据时,会发生冲突。这个问题有一个十分简单的方法,即当发生冲突时,使计算机暂停一段时间后重传,不同设备的暂停时间不同防止暂停时间过后再次发生冲突。这个方法虽然有用,但是不能完全解决问题,因此使用另外一个技巧——指数退避,即计算机的等待时间会随着发生冲突的次数指数增长,假设第一次冲突等待1s,当再次发生冲突时则等待2s,第三次4s,第四次8s,以此类推,直至成功传输。
为了减少冲突并提高效率,我们需要减少同一载体中设备的数量,载体和其中的设备总称为“冲突域”,通过使用交换机将一个大的冲突域拆分为更小的冲突域,交换机位于更小的网络之间,必要时才在两个网络之间传输数据。许多大型网络也是这样构建的,包括互联网,这些大型网络的特点是从一个地点到另一个地点通常有多条路线,这就涉及到“路由”的问题。
连接两台相隔很远的计算机,最简单的方法就是分配一条专用的通信线路,早期的电话系统就是这样运作的,这叫做“电路交换”,不灵活并且价格昂贵。传输数据的另一个方法是“报文交换”,就像邮政系统,消息会经过很多站点。报文交换的好处是可以用不同的路由,使通信更可靠、容错率更高。消息沿着路由跳转的次数称为“跳数”,根据跳数可以分辨出路由问题,如果看到某条消息的跳数很高,那么路由一定存在某些问题,这叫做“跳数限制”。报文交换的缺点之一就是当数据比较大时,会堵塞网络,解决方法是将大报文分为许多称为“数据包”的小块。报文的具体格式由“互联网协议”定义,简称IP。在计算机交换数据时,路由器会平衡与其他路由器之间的负载以确保传输的快速可靠,这叫做“阻塞控制”。有时,同一个报文的多个数据包经不同线路到达顺序可能会不一样,对于一些软件是个问题,幸运的是,在IP之上还有其他协议,例如TCP/IP,可以解决乱序的问题。将数据拆分为小数据包然后通过灵活的路由传递,叫做“分组交换”,这是的传输十分高效且容错率高,如今的互联网就是这样运行的。分组交换是去中心化的,没有单点失败问题。
如今,全球的路由器协同工作找出最高效的线路,用各种标准协议运输数据,例如“因特网控制消息协议(ICMP)”,“边界网关协议(BGP)”等。世界上第一个分组交换网络以及现代互联网的祖先是ARPANET。互联网在几十年间发展迅速,如今联网设备越来越多,包括恒温器、冰箱等智能家居,它们组成了“物联网”。
二、互联网
计算机想要获取网络上的视频,首先要连接局域网LAN,家用的WIFI路由器连接着所有设备组成了局域网,局域网再连接到广域网WAN,WAN的路由器一般属于互联网服务的提供商(ISP)。在广域网中,先连接到一个局域性路由器,这些路由器可能覆盖一个街区,然后连接到更大的WAN,可能覆盖整个城市。为了获取视频,数据包要先到互联网的主干,沿着主干到达有视频文件的服务器。
上节中说道,数据包在互联网上传输需要满足IP协议。IP协议是一个非常底层的协议,数据包的头部只有目标地址,头部也存放元数据,这意味着当数据包到达目标时,对方不知道将数据包传输给哪个程序,因此需要在IP之上开发更高级的协议。
最简单常见的叫“用户数据协议(UDP)”,UDP也有头部,这个头部在数据前,包含端口号、校验和等信息。每个想要访问网络的程序都要向操作系统申请一个端口号,根据端口号就可把数据包交给对应的程序。校验和用来检查数据是否正确,顾名思义,检查方法是把数据求和来进行对比,如果校验和发送和接收的不一致,则代表数据有所损坏,然而UDP并没有提供数据修复或是重发的机制,如果发生损坏一般直接将其丢掉。
在一些情况下,这种丢掉不会影响结果,但是在传输邮件等内容时,必须满足所有数据都要保留。如果需要所有数据必须到达,就要使用“传输控制协议(TCP)”。TCP的头部也存在数据之前,这个组合成为TCP/IP。TCP头部也含有端口号和校验和,但是TCP有其他更高级的功能。一是TCP数据包有序号,序号使数据包可以排序,即使到达时间是错乱的,也可排为正确顺序。二是TCP要求接收方收到的数据包和校验和检查无误后,给发送方发送一个确认码代表已经收到了,确认码简称ACK,得知上一个数据包成功抵达后,发送方发送下一个数据包,如果过了一定时间还没有收到确认码,则会重发一次。另外TCP并非每次只发送单个数据包,而是发送一批数据包,接收一批确认码。确认码接收的成功率和来回时间可以推测网络的拥堵程度,TCP使用这个信息动态调整发包数量来解决拥堵问题。TCP也有缺点,最大的缺点就是确认码使网络传输的消息增加了许多,但没有携带更多的信息,但是这种代价有时是不值得的,特别是对时间要求很高的程序。
当计算机访问网站时,需要两样东西:IP地址和端口号。但是一长串表示IP地址和端口号的数字很难记忆,域名更容易记忆,因此互联网有个服务可以将域名和IP地址一一对应,这叫做“域名系统(DNS)”。当在浏览器中输入域名后,浏览器会去访问DNS的服务器取得IP地址,DNS服务器一般由互联网供应商提供,若域名存在,则返回对应的IP地址,如果不存在,则会返回错误。因为域名越来越多,为了更好的管理,DNS将其存为树状结构,顶级域名(TLD)在最顶部,例如.com和.gov等;下一层是二级域名,例如google.com等;再下一层是子域名,例如images.google.com等。这些数据散布在许多DNS服务器上,不同服务器负责不同部分。
线路里的电信号以及无线网络中的无线信号,这些叫做“物理层”;而“数据链路层”负责操控物理层,数据链路层有MAC,碰撞检测,指数退避以及一些其他底层协议;再上一层是“网络层”,负责各种报文交换和路由;UDP和TCP这些协议存放在“传输层”中,负责计算机之间点到点的传输,还会检测和修复错误;“会话层”会使用TCP和UDP来创建连接,传递信息,然后关掉连接,这一整套叫做会话,查询DNS或者查看网页时,就会发生这一套流程。以上是**开放式系统互联网通信参考模型(OSI)**的下5层,还包括“表示层”和“应用程序层”,将在下节中介绍。
三、万维网
万维网和互联网不是一回事。互联网是传输数据的通道,各种程序都会使用,而传输最多数据的程序就是万维网。
万维网的最基本单位是单个页面,页面有内容,也有去其他页面的链接,称为“超链接”,这些超链接形成巨大的互联网络,这就是万维网名字的由来。因为文字超链接十分强大,因此它又得到一个名字——“超文本”。为了使网页相互连接,每个网页需要一个唯一的地址,这个地址叫“统一资源定位器(URL)”。
上节中提到使用IP地址和端口访问到了网站的服务器,接下来需要向服务器请求想要访问的页面,会使用到“超文本传输协议(HTTP)”。第一个HTTP标准创建与1991年,只有一个GET指令,使用get指令得到某个页面然后通过浏览器渲染,在访问网页时不断重复这个过程。在之后的版本,HTTP添加了状态码,放在请求之前,状态码代表不同的状态,例如200代表网页找到了,400~499表示出错。
如果只有纯文本时,无法区分它与超文本,所以需要开发一种标记方法——“超文本标记语言(HTML)”。HTML的第一个版本创建于1990年,有18种指令,用来创建网页。最新的HTML是HTML5,有100多种标签。
浏览器不仅获取网页,获取后还负责显示。第一个浏览器和服务器是Tim Berners-Lee在1990年写的,他同时还建立了几个最基本的网络标准——URL,HTML,HTTP。1991年将其发布,万维网就此诞生。第一个可以在文字旁显示图片的浏览器是Mosaic浏览器,还引进了书签等功能。1990年代末有许多浏览器和服务器面世,每年都有许多新的网站被创造。
随着万维网越来越繁荣,人们越来越需要搜索。起初人们依靠维护一个目录来链接到其他网站,但是网络越来越大,人工编辑的目录十分不便利,所以开发了搜索引擎。最早的搜索引擎叫JumpStation,它有3个部分,一是爬虫,每当看到新链接,就加进自己的列表内;二是不断扩张的索引,记录访问过的网页上出现过哪些词;三是查询索引的搜索算法,将出现关键词的网页全部显示。早期的排序方式非常简单,利用关键词在网页出现的次数来排序,但是会被恶意利用,例如在网页上写几百个关键词来吸引人们。Google创造了一个聪明的算法来规避这个问题,搜索引擎会看其他网站有没有链接到这个网站,一个写满关键词的垃圾网站是没有网站会指向它的,而有对于关键词有用内容的网站,会有许多其他网站指向它。
“网络中立性”是指网络应该平等对待所有数据包,速度和优先级应该一致。但是许多公司想要让它们的数据优先到达,这会给剥削性商业模式埋下种子。
四、计算机安全
计算机没有道德观念,因此我们需要网络安全来减少虚拟世界中的犯罪。计算机安全是保护系统和数据的保密性、完整性和可用性。保密性是只有有权限的人才能读取计算机系统的信息;完整性是只有有权限的人才能使用和修改系统和数据;可用性是有权限的人可以随时访问系统和数据。为了实现这三个目标,安全专家从抽象层面想象敌人可能是谁,这叫做“威胁模型分析”,模型会对攻击者有个大致描述,攻击手段又叫做“攻击矢量”,如何保护,需要具体情况具体分析。
保护计算机系统、网络和数据的方法有很多,很多安全问题可以总结成两个:你是谁?以及你能访问什么?为了区分正确和错误的人,使用“身份认证”,让计算机得知使用者是谁。身份认证有三种,各有利弊:你知道什么?你有什么?你是什么?“你知道什么”是基于只有用户和计算机知道的密码,如今使用最广泛也最容易实现,在破解密码时,如果只是尝试遍历一切可能,叫做“暴力攻击”。“你有什么”是基于用户有特定物体,例如钥匙和锁。“你是什么”基于你把特征展示给计算机进行验证,例如指纹、虹膜等,这种验证方式十分安全但是价格昂贵。
前两种验证方式是确定性的,如果你知道密码或者拥有钥匙,那么一定可以获得访问权限,如果没有,则进入的概率为0。但是生物识别是概率性的,系统有可能认不出你,虽然几率很低,但不为0。生物认证的另外一个问题是无法重设,如果攻击者拿到你指纹、虹膜的数据,那么安全性就无法保证了。所以,对于重要账户,安全专家建议使用两种或者两种以上的认证的方式,这叫做“双因素”或“多因素”认证。
身份验证之后,就来到了“访问控制”,一旦系统知道你是谁,它需要知道你能访问什么,这可以通过“权限”或者“访问控制列表(ACL)”来实现。有一种“不能向上读,不能向下写”的访问控制方法叫做“Bell-LaPadula模型”,是为美国国防部“多层安全政策”制定的。
身份验证和访问控制是基于软硬件是必须可信的,但假如攻击者给计算机安装了恶意软件,控制了操作系统,我们则无法确定安全系统是否能够保证安全。系统级安全的圣杯之一是“安全内核”或“可信计算机基础”,它们是一组尽可能少的操作系统软件,安全性是接近可验证的。正式验证代码的安全性是一个活跃的研究领域,现在最好的手段是“独立安全检查和质量验证”。
即使尽可能做了安全措施,攻击者还是会找到方法入侵,因此优秀的开发人员应当计划当程序被攻破后,如何限制损害,控制损害的最大程度,不让它危害到计算机上的其他东西,这叫“隔离”。为了实现隔离,可以“沙盒”程序,通过给每个程序独有的内存块,其他程序不能使用。一台计算机可以运行多个虚拟机,每个虚拟机都在自己的沙盒内,如果程序出错,最坏的情况是它自己崩溃,或者弄坏它所处的虚拟机,计算机上其他虚拟机是隔离的,不受影响。
五、黑客与攻击
黑客入侵最常见的方式,不是通过技术,而是欺骗别人,这叫“社会工程学”,欺骗别人让人泄露信息,或者让别人配置电脑系统,变得易于攻击。最常见的攻击是网络钓鱼,使用钓鱼网站假冒银行等机构的官方网站诱导用户输入账号密码。另一种方法叫做“假托”,攻击者给某个公司打电话,假装是IT部门的人,然后让别人把电脑配置得容易入侵或者让他们泄露机密信息,比如密码或者网络配置。邮件里附带“木马”也是常见手段,伪装成无害的东西,实际上是恶意软件,恶意软件有许多种,有的会窃取数据,有的会加密文件,需要交赎金才可解密,也就是“勒索软件”。
如果攻击者无法用木马或者电话欺骗,只能被迫使用其他手段。方法之一就是上节中的暴力攻击,但是通过延长等待时间可以有效抵御。而最近出现的一种方法叫“NAND镜像”,如果可以物理接触到电脑,可以往内存上接线然后复制整个内存,然后暴力尝试密码直到设备让你等待,然后用复制的内容覆盖内存,就重置了等待时间。
如果无法物理接触设备,就必须远程攻击,远程攻击一般需要利用系统漏洞,来获得某些能力和访问权限,这叫做“漏洞利用”。一种常见的漏洞利用叫“缓冲区溢出”,利用更长的数据使存放密码的缓冲区的相邻的数据被覆盖,有时会让系统崩溃,但是攻击者可以注入有意义的新值,有时可以获得任意修改内存的能力,可以绕过登录程序,甚至劫持整个系统。最简单的阻止这种入侵的方法是在复制之前检查长度,这叫“边界检查”,程序也会随机存放变量在内存中的位置,这样黑客就不知道应该覆盖内存的哪个位置,导致更容易让程序崩溃而不是获得访问权限。程序也可以在缓冲区之后留一些不同的空间来跟踪里面的值是否发生变化来判断是否有攻击者,这些内存空间叫做“金丝雀”。另一种经典手段叫做“代码注入”,最常用于攻击数据库的网站,使用“结构化查询语言(SQL)”,利用SQL的机制来注入代码,甚至不需要侵入系统,也没有获得访问权限,也可以来制造混乱。很多用户名和密码表单不允许输入特殊字符来作为第一道防御;有的数据库也会清理输入,修改或删除特殊字符,然后才放入SQL中。
有用的漏洞利用一般会在网上贩卖或者分享,当软件制造者不知道软件有新的漏洞被发现了,这个漏洞就叫“零日漏洞”,所以系统保持更新十分重要,很多更新都是安全性补丁。如果有足够多的电脑有漏洞,让恶意程序在电脑之间互相传播,就叫“蠕虫”,如果黑客拿下大量电脑,这些电脑可以组成“僵尸网络”,可以用于很多目的,比如发送垃圾邮件、用他人的算力“挖矿”,发起“拒绝服务攻击(DDoS)”来攻击服务器。DDoS利用僵尸网络中的所有电脑发送一大堆垃圾信息来堵塞服务器。
六、加密
计算机安全中最常见的防御形式是密码学。为了加密信息,需要用加密算法把明文转为密文,把明文转化为密文的过程叫“加密”,而把密文恢复为明文的过程叫“解密”。加密算法在计算机出现之前就有了,朱利叶斯·凯撒用“凯撒加密”的方法来加密私人信件,他把信件中的字母向前移动三个位置,例如A变为D。
有一大类算法叫做“替换加密”,凯撒加密就是其中一种,算法把每个字母都替换为其他字母。另一类加密算法叫“移位加密”,首先将明文填入某个大小的网格,然后换个顺序来读,例如从下往上、从左往右,就完成了加密。1900年代,人们利用密码学做了加密机器,最有名的是在之前介绍过的德国英格玛加密器,它使用的加密方式就是一种替换加密。
随着计算机的出现,加密从硬件转往软件,早期加密算法用应用最广泛的是IBM和NSA在1977年开发的“数据加密标准(DES)”。DES最初使用的是56bit长度的二进制密钥,意味着有大约72千万亿(
7.2
×
1
0
16
7.2×10^{16}
7.2×1016)个不同密钥,在那时除NSA没有人有足够的算力来暴力破解所有可能的密钥,但到了1999年,将DES暴力破解成为了可能,使DES算法不再安全。因此在2001年提出了“高级加密标准(AES)”,AES使用更长的密钥使暴力破解更加困难。AES将数据切块,每块16字节,然后用密钥进行一系列替换加密和移位加密,再加上一些其他操作进一步加密信息,每块数据将重复这个过程十次以上。
但是现在我们没有密码本这种东西来保存密钥,因此需要某种方法在互联网上传递密钥给对方,解决方法就是“密钥交换”,不发送密钥就可以让两台计算机在密钥上达成共识。我们可以使用“单向函数”,它很容易算出结果,但是想要从结果逆向推算输入就十分困难了。“迪菲-赫尔曼密钥交换”的单向函数是模幂运算,先做幂次运算,拿一个数字当底数另外一个当指数,然后除以第三个数字,得到余数,如果只给余数和底数,则很难知道指数是多少,当位数很长时,想要得知指数是多少几乎不可能。迪菲-赫尔曼密钥交换的过程如下:首先,有公开的值即底数
B
B
B和余数
M
M
M,发送方选择一个秘密指数
X
X
X,然后计算
B
X
m
o
d
M
B^X\mod M
BXmodM,将这个数字发送,接收方也经过相同的操作,选择一个秘密指数
Y
Y
Y,将
B
Y
m
o
d
M
B^Y\mod M
BYmodM的结果发送,然后发送方利用接收到的余数和自己的秘密指数
X
X
X进行模幂运算
(
B
Y
m
o
d
M
)
X
m
o
d
M
(B^Y\mod M)^X\mod M
(BYmodM)XmodM(视频中此处有错),这个运算相当于
B
Y
X
m
o
d
M
B^{YX}\mod M
BYXmodM,接收方也经过相同的操作,最终得到一样的数,双方就得到了一样的密钥。
双方使用一样的密钥加密和解密信息,这叫做“对称加密”,凯撒加密、英格玛、AES都是对称加密。还有“非对称加密”,有两个不同密钥,一个是公开的,另一个是私有的,人们使用公钥加密信息,只有拥有私钥的人才能解密。相似的,也可以使用私钥加密,用公钥解密,这种做法用于签名,服务器可以用私钥加密,任何人都可以用公钥解密,就像做了一个不可伪造的签名,能够证明数据来自正确的服务器或个人。目前最流行的非对称加密技术是RSA,名字来源于三个发明者的首字母。
总结
本文介绍了计算机网络、互联网、万维网、计算机安全、黑客与攻击以及加密。