1700496801
算法之美:指导工作与生活的算法 分组交换
1700496802
1700496803
我们现在所认为的“互联网”实际上是许多协议的集合,但其中的主要内容(如此之多,以至于它经常被理解为互联网的同义词)是所谓的传输控制协议,即TCP。这是温顿·瑟夫和鲍勃·卡恩在1973年的一次演讲和1974年的一篇论文中首先提出的,他们还提出了他们所设想的“互联网络”的语言。
1700496804
1700496805
传输控制协议最初使用的是电话线,但更恰当地说它是邮件的演变,而不是电话。电话使用所谓的“电路交换”:系统在发送方和接收方之间打开一个通道,只要通话持续,就可以在两个方向之间提供持续的带宽。电路交换对人类的相互作用有很大的意义,但早在20世纪60年代,就很明显地能看出,这种模式对机器通信是不适用的。
1700496806
1700496807
正如加州大学洛杉矶分校的莱昂纳多·克莱洛克所回忆的那样:
1700496808
1700496809
我知道,电脑在说话的时候不会像我现在这样——不停地说。否则它们就会爆炸!它们会安静一会儿。过了一会儿,他们突然又爆发了。而且,你不能把通信连接用于几乎从来不说话的东西,但是只要它想要说话的时候,它就要立即访问。所以我们不得不使用电话网络,它是为连续的通话而设计的(电路交换网络)但它有些不同。
1700496810
1700496811
对于电话公司来说,他们似乎不太愿意谈论他们协议的根本转变。网络研究人员范·雅各布森曾说,不采用电路开关被认为是疯狂的“绝对异端之举”。克兰罗克是这样回忆他与电信行业的故事的:
1700496812
1700496813
我去了美国电话电报公司,那里有当时最大的网络,我向他们解释,你们应该给我们提供良好的数据通信。他们的回答是,你在说什么?美国是一座铜矿,所以到处都是电话线,直接用吧。我说,不,不,你不明白。打电话只需要35秒,而你们最少按3分钟收费,而我想发送100毫秒的数据!他们的回答是:“小男孩,走开。”于是,这个小男孩就和其他人一起走开了,但他之后开发了这项技术,抢了那些人的饭碗。
1700496814
1700496815
抢电路交换饭碗的技术将被称为包交换。包交换的网络没有给每个链接设立专用渠道,发送方和接收方将它们的消息拆分放入一个个称为“数据包”的小碎片中,再将这些碎片合并到数据的公共流中(有点儿像以光速移动的明信片)。
1700496816
1700496817
在这样的网络中,“你可能会说连接的是两个端点之间共同的幻觉,”苹果网络专家斯图尔特·切希尔解释道。“互联网上没有联系。在互联网上谈论一个连接就像是在谈论美国邮件系统中的一个连接。你给人写信,每封信都是独立的,你可能会有信件往来,并且有一定的连续性,但美国邮政不需要知道这些……他们只是投递信件。”
1700496818
1700496819
高效利用带宽并不是在20世纪60年代推动对包交换研究的唯一动力,另一个原因是核战争。兰德公司的保罗·巴兰正试图解决网络鲁棒性问题,以便军方通信系统能够在核进攻中幸存下来,而核进攻可以毁坏大部分的网络。受20世纪50年代为迷宫导航而开发的算法的启发,巴兰提出了一种设计,在这个设计中,每一条信息都可以通过自己的方式抵达目的地,即使网络处于动态变化中,或者已成碎片。
1700496820
1700496821
这是电路交换及其专用、稳定连接的第二个缺点:非常稳定意味着通话中断就会一直中断。电路交换不够灵活或适应能力不够强,体现不出足够的鲁棒性。而且,在这里,包交换也可以提供这个时代所需要的东西。在电路交换网络中,如果其中的任何一个链接被中断,通话就会失败,这意味着当网络变得更大时,可靠性会呈指数级下降。另一方面,在包交换中,不断增长的网络的路径扩散成为它的一种优点:现在有更多的方法可以让数据流动起来,因此网络的可靠性随着它的变大成倍地增长。
1700496822
1700496823
尽管如此,正如范·雅各布森所言,即使发明了包交换技术,电话公司也不为所动。“所有的电信人员都很大声地说,那不是网络!”那只是利用我们网络的一种糟糕的方式!你用我们的电线,用我们创造的路径进行传输!但你又在上面放了很多胶水,因此你就无法有效地使用它。但是,从包交换的角度来看,电话线只是一种达到目的的方式,发送方和接收方实际上并不关心数据包是如何传递的。在不同数量的不同媒体上进行不确定操作的能力将是包交换的伟大美德。在20世纪60年代末和70年代早期的初期网络(如阿帕网络)之后,所有类型的网络都证明了这一概念的可行性,并开始在全美国范围内发展壮大,包交换不仅可以在铜线上进行,还可以通过卫星和无线电。2001年,挪威卑尔根市的一群计算机科学家甚至曾短暂地实施了一项名为“信鸽”的包交换网络,即写在纸上并包装起来,然后绑在鸽子的脚上。
1700496824
1700496825
当然,分组交换也不是没有一点儿问题。对于任何协议、人类或机器来说,首先要问的问题之一就是:你如何知道你的消息已经发送了?
1700496826
1700496827
1700496828
1700496829
1700496831
算法之美:指导工作与生活的算法 信息确认
1700496832
1700496833
温顿·瑟夫和鲍勃·卡恩
1700496834
1700496835
任何传输都不是绝对可靠的。
1700496836
1700496837
“上帝创造了什么”并不只是在美国发出的第一条远程电报信息,它也是第二个:艾尔弗雷德·韦尔把这段引文又发回了在最高法院的莫尔斯,作为确认收到之前信息的一种方式。
1700496838
1700496839
现在,韦尔的回答可能会使莫尔斯和美国的立法者们都聚集在他周围,他相信莫尔斯的信息已经收到,当然,韦尔事先并不知道这会是什么样的信息。但是,怎样才能使韦尔知道他的确认已被接收了呢?
1700496840
1700496841
计算机科学家们知道这个概念是“拜占庭将军的问题”。想象一下有两个将军,站在一个山谷的两边,他们有共同的敌人,试图共同协调进攻。只有通过完美的同步,他们才能成功,因为单独攻击就意味着自取灭亡。更糟糕的是,两名将军之间如果要传送任何消息都必须通过敌人所在的阵地,这意味着任何信息都传送不出去。
1700496842
1700496843
第一个将军,例如他想建议发起攻击的时间,但他一人又不敢擅自进攻,除非他知道他的同伴也会一起出发。第二名将军收到命令并发回确认,但除非他知道第一个将军收到了确认,否则他也不敢发动攻击(因为第一个将军是不会独自去的)。第一个将军接受了确认,但仍不会进攻,因为他要等待第二位将军知道他收到了才行。遵循这一逻辑链需要一系列无穷无尽的信息,显然我们不需要这样做。沟通是一件只有在实践中才能奏效的令人愉快的事情,在理论上它是不可能的。
1700496844
1700496845
在大多数情况下,沟通失误的后果很少会如此可怕,对确定性的需求也很少会如此绝对。在传输控制协议中,失败通常只会导致重新传送,而不是死亡,因此对一个会话来说,这已经足够了,可以从所谓的“三重握手”开始。访问者说你好,服务器确认你好,并回复你好,访问者确认了这一点,如果服务器收到这第三条消息,则不需要进一步确认,他们就会开始正题。然而,即使在最初的连接完成之后,仍然存在风险,即一些后续包可能在传输过程中受损或丢失,或者出现故障。在邮件投递中,包裹的递送可以通过回执来确认。在网上,包裹递送可以通过所谓的确认包或确认字符来确认。这些对网络的运作至关重要。
1700496846
1700496847
确认字符工作的方式既简单又睿智。在三次握手的背后,每台机器都提供了一种序列号,而且每一个发送的数据包每次都会在发送的时候增加一个序列号,就像支票簿上的支票一样。例如,如果你的计算机启动与网络服务器的联系,它可能会向该服务器发送信号,例如数字100。服务器发送的确认字符还将指定服务器自己的数据包的序列号(例如5000),同时还会说“101号准备好了”。你机器的确认字符的序列号将是101号,并将“传送5001号”。(注意,这两个编号方案是完全独立的,每个序列的开头数通常是随机选择的。)
1700496848
1700496849
这种机制提供了一种精确的方法来确定数据包何时走错路。如果服务器期望得到101号,却得到了102号,那么它将发送一个确认字符到102号数据包,并仍然说“101号准备好了”。如果它下一次收到的是103号,它会再说一次,“101号准备好了”。重复三次这样冗余的操作后,它将会向你的机器发出信号:101号不仅被延迟了,而已经无望地消失了,所以它会重新发送那个数据包。在这一点上,服务器(保留了102号数据包和103号数据包)将发送一个确认字符“104号准备好了”用以表示已经恢复了序列。
[
上一页 ]
[ :1.7004968e+09 ]
[
下一页 ]