Internet History, Technology and Security (Week6)
Week6
The Internet is desinged based on four-layer model. Each layer builds on the layers below it. The Link and Internetwork layers are the lowest layers of that model.
Technology: Transport Control Protocol(TCP)
Transport/Reliability
Keywords: transport layer, IP, TCP, Van Jacobson, Slow Start Algorithm, DNS, Reliability
Transport Layer
了解完第二层协议层,我们知道第二层负责定义了一些使数据从源主机传输到目的地经过一个或多个IP网络的协议。老师又把它比喻成postcard layer,明信片层,讲的是第二层解决的问题与寄明信片的过程很相似。
复习Internet Protocol(IP)
-
IP地址做了什么?使得一个数据包packet从发送源主机通过5-20个hop到达目的主机,可能途径多个网络。
-
路由算法具有尽量确保数据按照较优的路径传输的能力。
-
IP地址有一个缺点:不保证一定完成传输。也有可能因为出现死循环导致数据消失。
-
IP地址做的工作使其工作效率高、具有良好的可扩展性,协议的设计简洁、高效、优雅,因为它做的工作恰到好处不多不少,而不是把所有事情都做了(IP没有决定数据传输顺序、不保证一定传达到,不完美也是一种美嘛)。
- 很多链路、很多hops
- 很多路由;
- IP是动态的;
- IP可能会丢弃packet。
Transport Protocol(TCP)
对网络四层模型的介绍到了第三层——Transport Layer,运输层。
- TCP是建立在IP之上的。
- TCP假定IP是有可能丢失数据的。
- 以防数据丢失,将会保存一份数据的拷贝。需要时就会发送。
- 如果耗费“太长时间”,也会重发一份。(hop次数太多意味着无法送达)
TCP层的原理既有简单的部分,也有复杂的部分。TCP层的目的是为了弥补IP层可能出现的一些问题,同时也对可用资源进行效率最大化的使用。有时我们的网速很快,非常快;有时网速较低,但我们希望效率能高一点,TCP有一个目标就是和IP一起更加有效地为网络服务。除此之外,网络的可靠性问题,如果IP层传输失败了怎么办,都是TCP层要解决的问题。
简单的说,TCP做的事情是这样的:我们知道传输数据时会分成很多个packets,分开发送。我们重复这个发送过程,直到从目的端收到确认回复(acknowledgement),只有收到回复之后我们才会结束这个重发的过程。如果途中有出现数据丢失的情况,那么会一直重复发送直到收到目的端的确认为止。所以TCP的工作就是去指出哪些packet没有成功地通过互联网送达目的地,然后重新发送。(是不是可以理解为TCP是为IP擦屁股的)
Storage requirements
IP层被设计之时,就没有被要求做什么存储方面的工作,相反,路由器的思路就是尽量不存储数据,而是多多往前传递,做到尽量快的传输,还要具有智能选择路径等功能。虽说这个思路很不错,但还是有缺陷的,例如丢包。
存储方面的工作还是让计算机的内存来。当我们把计算机、笔记本电脑、手机等连入网络中时,它们自己有保存数据拷贝的责任,不期望网络去帮它们做存储工作。这是极好的机制,是互联网成功的原因之一。在我看来,这个设计不会加重网络本身的负担,而是专注于“communication”,恰到好处,让网络有很好的可靠性和可扩展性。
在上世纪80年代末期,有一种预言说因特网即将失败。而且这个观点在以前被不少人支持,因为他们认为学术界没有能力让互联网继续发展下去。当时的人甚至还认为让IBM等电子厂商去搞网络,其他的人们就花钱用供应商的网络。当NFSNet搞出来了之后,越来越多的电脑连上了网,导致网速越来越慢,甚至让人觉得互联网真的要完蛋了。老师本人也说,二十世纪八十年代是最后一次让人有“互联网真的要完蛋了”的感觉的时候了(94年就迎来互联网之年了嘛)。
在这样八十年代末期,这样一个“互联网要完蛋”的预言看起来似乎要成为现实的危急存亡之秋,工程师 Van Jacobson 做出了巨大的贡献,挽救了Internet。他最著名的贡献就是对于TCP协议的贡献,以及Slow Start Algorithm。在他的wiki页面的职业生涯中说到他的TCP/IP's flow control algorithms (Jacobson's algorithm)对解决网络拥堵起到了很好的作用,挽救了互联网,使其避免了崩坏的命运。所以说,这也是一位英雄啊!
Van Jacobson - Slow Start Algorithm
You do not have to fully understand all the technical detail in this vedio. Focus on understanding the slow start algorithm at a high level
NSFNet和Ethernet让大学网络在当时十分受欢迎,许多人通过网络交流、收发电子邮件等,人们都为这种新技术感到激动不已。但是越来越多接入的电脑让网络负载加大,网速变慢,很多packet在传输中丢失。
Van当时在伯克利教书,也深受网速慢困扰。于是Van就与Mike Karels进行合作,Mike是 Berkeley Unix 中 BSD组的负责人。
当时运行TCP/IP的最好方式是运行Berkeley Unix,因为这是美国军方资助的。不过有目共睹的是,这个程序的表现非常糟糕,在运行小规模测试的时候就崩溃了。他们做了很多的工作来寻找原因,在这些工作中他们就把目光逐渐聚焦到了协议的本身和协议的配置方面来。
避免拥塞
这个解决方案的名称是:TCP congestion control
Van要解决的问题就是防止出现网络拥塞。网络拥塞就像堵车,轻则车速下降,重则交通瘫痪。
横向代表时间,网络传输数据需要一定时间。纵向的容器粗细不同代表带宽的不同,在图片中是十倍的差距,实际可达几百倍。比较粗的,代表网络两端,一端是发信源,另一端是目的源。发送者有大量packet需要发送,如果一次都让它们进入网络,可能会引起拥塞。这时上文提到的acknowledgement(下文简称为ACK)就很有用了。我们控制进入网络的packet速度,每当目的源收到一个ACK,我们发送端再发送packet。ACK其实像一个时钟一样,提示何时网络是通畅的,这时就可以发送packet而不造成网络拥塞。这个机制运行起来后,新的packet发送不会让瓶颈(网络)内的packet造成拥塞。
这个机制只要运行起来,就是很完美的,唯一一个困难的地方就是刚刚启动的时候。简单来说刚启动的时候不知道网络拥堵的情况是怎样的,如果放太多packet过去还是会造成拥塞,这是我们不想看到的。这里就要用到Slow Start Algorithm——慢启动算法。如果你使用慢启动,逐渐地启动这个机制,让它慢慢跑起来,那么就能防止网络拥塞,这也是TCP的目标。
关于慢启动算法,教学材料中没有讲太详细。这里贴一贴我找到的一些不错的参考资料的链接。
慢启动,就是TCP在启动时的机制,目的也同样是为了防拥塞。
这里有两种极端我们要避免:
- 没有ACK机制,把大量packet直接传入网络,这很糟糕,有可能导致拥塞。
- 完全遵循以下原则:发送一个packet之后,只有收到ACK之后才发送下一个packet。虽说这样肯定不会导致拥塞,但资源利用率非常低,也不推荐。
所以说慢启动就是在在其中寻找一个平衡点。在未知网络拥塞程度的情况下,一开始以较慢的传输速度作为开始,然后提速,在不导致网络拥塞的情况下,加快传输速率,最大化利用资源。
TCP的慢启动主要依靠拥塞窗口(congestion window,简写cwnd)来控制。窗口具有大小,它表示无需等待确认应答就可以继续发送数据包的最大数量。当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小(相当于每次翻一番,指数上升)。所以说,慢启动的速度一点也不慢,只是起点比较低而已。
从这里可以看到,cwnd可以很快的增长上来,从而最大程度利用网络资源,但很明显cwnd不能无限增长,一定需要一个限制。TCP使用的是慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是65536(同样以字节计算)。拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。
The Domain Name System
Domain Name System,域名系统,是一个为任何连接到网络的电脑、服务器、或其他任何资源命名的分层分散式系统。它将各种信息与域名分配给每个参与的实体。最突出的特点是它使用对人类友好的、更容易记住的域名去代替数字的IP地址,实现定位和识别计算机服务和设备与底层网络协议。通过提供一个全球分布式目录服务,域名系统是因特网功能的一个重要的组成部分,并且自1980年代以来一直在使用。
数字IP地址,对于网络来说是很重要的。但对我们人类来说就不太友好,显然记住一串有意义的英文或者英文缩写的组合比记一串数字更加容易也更加直观。在我看来,DNS之于数字IP地址就好比高级编程语言之于编译器编译产生的机器语言。高级编程语言,是让人类看的懂的,更加直观,方便编程。
在前面我们了解到,IP地址的前缀代表的是area code,所以说从左到右读的话,代表范围从大到小。
中国人写地址也是从左到右读代表从大到小,先写省市,再写区,街道,楼房,门牌号等。
域名是相反的。我们知道,英美的地址写法是从右到左读,域名和这种情况相似。举www.si.umich.edu作为例子分析:
edu:代表教育机构
umich:代表一个特定的教育机构:密歇根大学
si:密歇根大学里一个特定的学院:信息学院
www:是特殊的服务器
域名系统,在网络四层分层模型中不是严格地属于哪一层。IP地址是对连接到网络中的结点进行地理性上的编码,我们在上网时,不太关心地理上的事儿,而是记住那些对人类更加友好的网址。所以老师倾向于把DNS放在第二层协议层和第三层运输层之间。
TCP Wrap Up
总的来说,TCP做的事就是弥补IP层所做的工作的不完美之处。数据到达时,可以不再是无序的;TCP使得数据在发送端储存了拷贝,如果没有收到ACK就会重复发送,确保数据不会丢失;TCP的缓存机制,使得互联网快速发展。
再说说网络四层模型。我们出于分层的思想,把底端的三层想象成很简单的、一段坚固的水管,从一端流进去什么就能从另一端流出什么。虽然我们知道Link层、IP层、TCP层的实际原理很复杂,但我们简化这三层,在此基础之上,研究“我们能用这水管来干些什么?”,也就是第四层,应用层,Application Layer。