【Internet History, Technology, and Security】第六讲心得
结合第五周的课程,依照TCP/IP网络架构从下往上,这周主要讲解的是传输层。
Transport Layer
如果说前面都只是IP层的内容,那从传输层开始,就是TCP层面的内容了,TCP层的目的是补偿IP层中可能出现的错误,并最大限度地利用可用资源。TCP/IP组网是为了有效地共享,所以我们需要知道我们的网络是快还是慢,这就是我们用TCP层要解决的问题。底层网络的速度有多快,可靠性有多高,如果出现问题,我们应该如何处理。因此,TCP/IP协议的核心思想就是在发送数据时,将数据分成多个包,然后将每个包发送出去。然后我们保留它们,直到它们得到另一边的承认,然后我们才把它们扔掉。在某些情况下,如果数据包丢失,则可以再次发送,直到最终在目的系统中确认为止。这基本上就是TCP所做的,就是它判断出哪些数据包在整个互联网层都存在,哪些数据包还没有到达。
一个简单的例子:一个数据报被分成五片,编号分别是:100,200,300,400,500。首先 我们发送 100,200,300的三片数据,100,300到达了目的地,但200在途中销毁。过了一段时间,接收端会发送消息告诉发送端它缺少了编号200的信息,这样发送端就能推测出100已经成功发出,但200需要重新发送。重新发送完200并收到回执后,发送端就能知道300已经发送成功,那这次应该从400开始,以此类推,直到消息发送完毕。
我们可以在单个连接中很容易地实现上面的操作,但是在网络中存在着很多的路由器,每台路由器搭载的PC合计可能会有上十亿,我们需要让数据的传输具有可靠性,因此在每次发送的时候,都需要在本地计算机上先存储一个副本。
从理论上看这是一个很庞大的工程,所以在20世纪80年代末,有预言说互联网将会消亡也就不足为奇了。那时候有一群人觉得学者不够聪明,不能建立一个网络,而且随着NSF网络的发展,越来越多的计算机在后台连接起来,主干的速度太慢了,以至于开始出现故障。看起来,所有的计算机供应商都说学者们不能建立一个强大的、可扩展的网络的预言将会是真的。
Van Jacobson - Slow Start Algorithm
预言终究没有成真,因为在1987年,网络严重崩溃的时候,市面上的计算机都安装了VanJacobson补丁,它使得网络变得更好,同时这也是最后一次出现整个互联网崩溃的情况。人们把它命名为Van Jacobson协议。但有趣的是,他本人不喜欢这个称呼,因为他是一个害羞和谦逊的人。但无论如何,事实是不会改变的,在80年代末的那一刻,他发明了慢启动算法,拯救了网络。事实上,包括在这堂课的录制过程中,这项技术也在被使用着。
说起Van去研究慢启动算法的原因,就要从最早的校园以太网说起,那时候有许多校园以太网,你可以通过电缆使它成为一个更大的网络,而那时NSF宣布用56kb的电缆把那些校园网络连在一起,形成一个巨大的网络。之前不能交谈的人突然可以通过网络交谈了,人们还发电子邮件,移动巨大的文件,人人都都对这项技术感到兴奋,但是,任何一个校园都会使网络上千倍地超载,会让网络丢弃很多分组。
那时候,Van在Lawrence Berkeley实验室做研究员,那是80年代中期,每一门课都有一个消息群,像一个小新闻组,所有的作业会放到网上。Van试着从LBL的办公室下载课程材料 到Berkeley Evans Hall的一个机器上,但他惊讶地发现,网络的吞吐量居然为零,大概每十分钟才有一个分组,于是他去和Mike Karels探讨这个问题,结果无巧不成书, Mike Karels领导了开发Berkeley Unix的BSD团队也收到了从全国各地发来的关于这个问题的报告,两人一拍即合,决定一起研究来解决这个麻烦。
当时最简单运行TCP/IP的方法是启动Berkeley Unix,因为它内嵌了一个ARPA资助的非常好的应用,但是这个程序的性能十分糟糕,在进行小规模测试的时候崩溃了,Van他们努力了几个月来找到问题出在哪,但却没有突破口,这时候Van认为这是因为不了解线路是怎样工作的,如果能明白它的工作原理,那自然也就有相应的处理方法,于是他们将关注点转移到“协议是如何处理带宽变化”上。
传输消息时,可以将他们看成一个分组,如果你把这些分组压入带宽,它会立即扩散出去,最终会到达一个接收器,这个接收器会把每一个数据分组变成一个ACK,所以你得到了很多ACK,而这些ACK又会返回到发送端。这些ACK像某种时钟一样告诉发送端什么是安全的时刻,来发送每一个新分组,它们总是根据网络中最慢的那个时间点被间隔开的。关键的问题是如何用最快的速度把他们排序而没有浪费,Van在观察之后,发现TCP在运行的时候其实是非常完美的,但是如果将它突然启动的时候,它的某个网关会很容易进入饱和状态,这时候发送消息就会不断地进入丢失状态;但如果你逐步将其启动的话,你就不会过载,因为你会得到一个时钟(ACK)来控制TCP数据报输出队列,以便控制缓存
而如何让这种机制植入到全球的TCP/IP中的呢?Van使用了一个比较偏门的办法,他让组内的资深内核黑客编写了一个程序,这个程序会获得用户数据报,并发生内核错误,他们把所有这些程序打包 放在TCP/IP的邮件列表上,很多人会去下载试用,于是程序崩溃,Van就获取他们的反馈信息,并将其修复,再崩溃,又修复,如此循环,最终生成了一个不会发生内核错误的版本。
The Domain Name System
域命名系统(DNS)有点类似于处于互联网和传输层之间,或互联网和链路层之间的某个地方,当然, 它肯定不属于应用层,也不属于链路层,虽然域名系统使用到了链路层,但它只是添加到这一层的辅助协议。
计算机使用IP地址,所以路由器实际并不知道域名,它只是简单地根据IP地址移动数据,然而数字地址对于人们来说是很难记住的,随着网络越来越发达,接入的计算机与服务器也越来越多,复杂的IP地址让人应接不暇,所以域名系统的概念被发明了出来,使用这些可见的名称,我们就可以不为人察觉地切换其对应的IP地址,因此,域名系统就像互联网的地址簿,它是一个大而快速的分布式数据库。域名系统使用缓存,即使部分网络出现故障,本地的域名解析速度仍会很快。
随着进度的加深,讲课的内容也开始慢慢贴近生活,相对于之前几讲理解起来会容易一些。