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.html
Keywords: transport layer, IP, TCP, Van Jacobson, Slow Start Algorithm, DNS, Reliability編程
瞭解完第二層協議層,咱們知道第二層負責定義了一些使數據從源主機傳輸到目的地通過一個或多個IP網絡的協議。老師又把它比喻成postcard layer,明信片層,講的是第二層解決的問題與寄明信片的過程很類似。緩存
IP地址作的工做使其工做效率高、具備良好的可擴展性,協議的設計簡潔、高效、優雅,由於它作的工做恰到好處很少很多,而不是把全部事情都作了(IP沒有決定數據傳輸順序、不保證必定傳達到,不完美也是一種美嘛)。服務器
對網絡四層模型的介紹到了第三層——Transport Layer,運輸層。網絡
TCP層的原理既有簡單的部分,也有複雜的部分。TCP層的目的是爲了彌補IP層可能出現的一些問題,同時也對可用資源進行效率最大化的使用。有時咱們的網速很快,很是快;有時網速較低,但咱們但願效率能高一點,TCP有一個目標就是和IP一塊兒更加有效地爲網絡服務。除此以外,網絡的可靠性問題,若是IP層傳輸失敗了怎麼辦,都是TCP層要解決的問題。dom
簡單的說,TCP作的事情是這樣的:咱們知道傳輸數據時會分紅不少個packets,分開發送。咱們重複這個發送過程,直到從目的端收到確認回覆(acknowledgement),只有收到回覆以後咱們纔會結束這個重發的過程。若是途中有出現數據丟失的狀況,那麼會一直重複發送直到收到目的端的確認爲止。因此TCP的工做就是去指出哪些packet沒有成功地經過互聯網送達目的地,而後從新發送。(是否是能夠理解爲TCP是爲IP擦屁股的)tcp
IP層被設計之時,就沒有被要求作什麼存儲方面的工做,相反,路由器的思路就是儘可能不存儲數據,而是多多往前傳遞,作到儘可能快的傳輸,還要具備智能選擇路徑等功能。雖然說這個思路很不錯,但仍是有缺陷的,例如丟包。編程語言
存儲方面的工做仍是讓計算機的內存來。當咱們把計算機、筆記本電腦、手機等連入網絡中時,它們本身有保存數據拷貝的責任,不指望網絡去幫它們作存儲工做。這是極好的機制,是互聯網成功的緣由之一。在我看來,這個設計不會加劇網絡自己的負擔,而是專一於「communication」,恰到好處,讓網絡有很好的可靠性和可擴展性。分佈式
在上世紀80年代末期,有一種預言說因特網即將失敗。並且這個觀點在之前被很多人支持,由於他們認爲學術界沒有能力讓互聯網繼續發展下去。當時的人甚至還認爲讓IBM等電子廠商去搞網絡,其餘的人們就花錢用供應商的網絡。當NFSNet搞出來了以後,愈來愈多的電腦連上了網,致使網速愈來愈慢,甚至讓人以爲互聯網真的要完蛋了。老師本人也說,二十世紀八十年代是最後一次讓人有「互聯網真的要完蛋了」的感受的時候了(94年就迎來互聯網之年了嘛)。
在這樣八十年代末期,這樣一個「互聯網要完蛋」的預言看起來彷佛要成爲現實的危急存亡之秋,工程師 Van Jacobson 作出了巨大的貢獻,挽救了Internet。他最著名的貢獻就是對於TCP協議的貢獻,以及Slow Start Algorithm。在他的wiki頁面的職業生涯中說到他的TCP/IP's flow control algorithms (Jacobson's 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在啓動時的機制,目的也一樣是爲了防擁塞。
這裏有兩種極端咱們要避免:
因此說慢啓動就是在在其中尋找一個平衡點。在未知網絡擁塞程度的狀況下,一開始以較慢的傳輸速度做爲開始,而後提速,在不致使網絡擁塞的狀況下,加快傳輸速率,最大化利用資源。
TCP的慢啓動主要依靠擁塞窗口(congestion window,簡寫cwnd)來控制。窗口具備大小,它表示無需等待確認應答就能夠繼續發送數據包的最大數量。當新建鏈接時,cwnd初始化爲1個最大報文段(MSS)大小,發送端開始按照擁塞窗口大小發送數據,每當有一個報文段被確認,cwnd就增長1個MSS大小(至關於每次翻一番,指數上升)。因此說,慢啓動的速度一點也不慢,只是起點比較低而已。
從這裏能夠看到,cwnd能夠很快的增加上來,從而最大程度利用網絡資源,但很明顯cwnd不能無限增加,必定須要一個限制。TCP使用的是慢啓動門限(ssthresh)的變量,當cwnd超過該值後,慢啓動過程結束,進入擁塞避免階段。對於大多數TCP實現來講,ssthresh的值是65536(一樣以字節計算)。擁塞避免的主要思想是加法增大,也就是cwnd的值再也不指數級往上升,開始加法增長。此時當窗口中全部的報文段都被確認時,cwnd的大小加1,cwnd的值就隨着RTT開始線性增長,這樣就能夠避免增加過快致使網絡擁塞,慢慢的增長調整到網絡的最佳值。
Domain Name System,域名系統,是一個爲任何鏈接到網絡的電腦、服務器、或其餘任何資源命名的分層分散式系統。它將各類信息與域名分配給每一個參與的實體。最突出的特色是它使用對人類友好的、更容易記住的域名去代替數字的IP地址,實現定位和識別計算機服務和設備與底層網絡協議。經過提供一個全球分佈式目錄服務,域名系統是因特網功能的一個重要的組成部分,而且自1980年代以來一直在使用。
數字IP地址,對於網絡來講是很重要的。但對咱們人類來講就不太友好,顯然記住一串有意義的英文或者英文縮寫的組合比記一串數字更加容易也更加直觀。在我看來,DNS之於數字IP地址就比如高級編程語言之於編譯器編譯產生的機器語言。高級編程語言,是讓人類看的懂的,更加直觀,方便編程。
在前面咱們瞭解到,IP地址的前綴表明的是area code,因此說從左到右讀的話,表明範圍從大到小。
中國人寫地址也是從左到右讀表明從大到小,先寫省市,再寫區,街道,樓房,門牌號等。
域名是相反的。咱們知道,英美的地址寫法是從右到左讀,域名和這種狀況類似。舉www.si.umich.edu做爲例子分析:
edu:表明教育機構 umich:表明一個特定的教育機構:密歇根大學 si:密歇根大學裏一個特定的學院:信息學院 www:是特殊的服務器
域名系統,在網絡四層分層模型中不是嚴格地屬於哪一層。IP地址是對鏈接到網絡中的結點進行地理性上的編碼,咱們在上網時,不太關心地理上的事兒,而是記住那些對人類更加友好的網址。因此老師傾向於把DNS放在第二層協議層和第三層運輸層之間。
總的來講,TCP作的事就是彌補IP層所作的工做的不完美之處。數據到達時,能夠再也不是無序的;TCP使得數據在發送端儲存了拷貝,若是沒有收到ACK就會重複發送,確保數據不會丟失;TCP的緩存機制,使得互聯網快速發展。
再說說網絡四層模型。咱們出於分層的思想,把底端的三層想象成很簡單的、一段堅固的水管,從一端流進去什麼就能從另外一端流出什麼。雖然咱們知道Link層、IP層、TCP層的實際原理很複雜,但咱們簡化這三層,在此基礎之上,研究「咱們能用這水管來幹些什麼?」,也就是第四層,應用層,Application Layer。