用戶在全球網絡中發送和接收信息的能力。
150年前,發一封信件從倫敦到加州,要花2~3周,並且仍是特快郵件。現在,電子郵件只要幾分之一秒,「時延」改善了上百萬倍(時延指傳播一條信息所須要的時間),幫助現代世界在遍及全球的光纖中快速發展。
可能以爲計算機和網絡密切相關,但事實上,1970年以前,大多數計算機是獨立運行的,然而,由於大型計算機開始隨處可見,廉價機器開始出如今書桌上。分享數據和資源漸漸變得有用起來,首個計算機網絡就出現了。算法
局域網
第一個計算機網絡出如今1950~1960年代,一般在公司或研究室內部使用,爲了方便信息交換。比把紙卡或磁帶送到另外一棟樓裏更快速可靠,這叫「球鞋網絡」,第二個好處是能共享物理資源。例如,與其每臺電腦配一臺打印機,能夠共享一臺聯網的打印機,早期網絡也會共享存儲空間,由於每臺電腦的配存儲太貴了。
計算機近距離構成的小型網絡,叫局域網,簡稱LAN。
局域網能小到是同一個房間裏的兩臺機器或大到校園裏上千臺機器,儘管開發和部署了不少不一樣LAN技術,其中最著名和成功的是「以太網」,開發於1970年代,在施樂的「帕洛阿爾託研究中心」誕生,今日仍被普遍使用。segmentfault
媒體訪問控制地址
以太網的最簡單形式是:一條以太網電線鏈接數臺計算機。當一臺計算機要傳數據給另外一臺計算機時,它以電信號形式,將數據傳入電纜,固然,由於電纜是共享的,連在同一個網絡裏的其它計算機也看獲得數據。但不知道數據是它們的,仍是給其餘計算機的,爲了解決這個問題,以太網須要每臺計算機有惟一的媒體訪問控制地址,簡稱 MAC地址。windows
這個惟一的地址放在頭部,做爲數據的前綴發送到網絡中,因此,計算機只須要監聽以太網電纜,只有看到本身的MAC地址,才處理數據。這運做的很好,如今製造的每臺計算機都自帶了惟一的MAC地址,用於以太網和無線網絡。瀏覽器
載波偵聽多路訪問
多臺電腦共享一個傳輸媒介,這種方法叫「載波偵聽多路訪問」 簡稱「CSMA「,載體指運輸數據的共享媒介。以太網的「載體」是銅線,WiFi的」載體「是傳播無限電波的空氣,不少計算機同時偵聽載體,因此叫「偵聽」和「多路訪問」,而載體傳輸數據的速度 叫「帶寬」。服務器
不幸的是,使用共享載體有個很大的弊端,當網絡流量較小時,計算機能夠等待載體清空,而後傳輸數據,但隨着網絡流量上升,兩臺計算機想同時寫入數據的機率也會上升,這叫衝突,數據全都亂套了。就像兩我的同時在講話。
幸運的是計算機可以經過監聽電線中的信號檢測這些衝突,最明顯的解決辦法是中止傳輸,等待網絡空閒,而後再試一遍。問題是,其它計算機也打算這樣作,其餘等着的計算機可能在任何停頓間隙闖入,致使愈來愈多衝突,很快,每一個人都一個接一個的講話,並且有一堆事要說,以太網有個超簡單有效的解決方法,當計算機檢測到衝突,就會在重傳以前等待一小段時間。網絡
固然,若是全部計算機用一樣的等待時間,是不行的,它們會在必定時間內再次衝突,因此加入一個隨機時間,一臺計算機可能等1.3秒,另外一臺計算機等待1.5秒,要是運氣好,等1.3秒的計算機會醒來,發現載體是空閒的,而後開始傳輸。當1.5秒的計算機醒來後,會發現載體被佔用了,會等待其餘計算機完成。這有用,但不能徹底解決問題,因此要用另外一個小技巧。若是一臺計算機在傳輸數據期間檢測到衝突。會等一秒+隨機時間。(等待空令牌),然而,若是再次發生衝突,代表有網絡擁塞,此次不等1秒,而是等2秒。若是再發生衝突,等4秒,而後8秒,16秒等等,直到成功傳輸。由於計算機的退避,衝突次數下降了,數據再次開始流動起來,網絡變得順暢。(二進制退避算法)框架
指數退避
這種指數級增加等待時間的方法叫:指數退避。以太網和WiFi都用這種方法,不少其它傳輸協議也用。但即使有了「指數退避」這種技巧,想用一根網線連接整個大學的計算機仍是不可能的,爲了減小衝突 + 提高效率,須要減小同一載體中設備的數量,載體和其中的設備總稱「衝突域」。分佈式
爲了減小衝突,能夠用交換機把它拆成兩個衝突域。交換機位於兩個更小的網絡之間,必要時纔在兩個網絡間傳數據,交換機會記錄一個列表,寫着哪一個MAC地址在哪邊網絡。ide
若是A想傳C,交換機不會把數據轉發給另外一邊的網絡。
若是E想同一時間傳數據給F,網絡仍然是空的,兩個傳輸是同時發生的。
(鏈路層,處理的事情)網站
但若是F想發數據給A,數據就會經過交換機,兩個網絡都會被短暫佔用。
分組主要目的時間減少衝突域的範圍,switch是交換機,birdge是網橋
大的計算機網絡也是這樣構建,包括最大的網絡:互聯網。也是多個鏈接在一塊兒的稍小一點網絡。使不一樣網絡間能夠傳遞信息。
這些大型網絡有趣之處是,從一個地點到另一個地點一般有多條路線,引出路由概念。
鏈接兩臺相隔遙遠的計算機或網絡,最簡單的辦法,是分配一條專用的通訊線路,早期電話系統就是這樣運做的。
電路交換
假設(X,Y)兩地之間,有五條電話線,若是在1910年,A 想打電話給B,A要告訴操做員他想打到什麼地方,而後工做人員手動將A的電話連到通往Y地的未使用線路,通話期間,這條線路就被佔用,若是五條線都被佔用了,A要等待某條線空出來。 這叫 「電路交換」,由於是把電路鏈接到正確目的地。
能用卻是能用,但不靈活並且價格昂貴,由於總有閒置的線路。
好處是,若是有一條專屬於本身的線路,能夠最大限度地隨意使用,無需共享。
報文交換
所以軍隊,銀行和其它一些機構,依然會購買專用線路來鏈接數據中心,傳輸數據的另外一個方法是「報文交換」,「報文交換」就像郵政系統同樣,不像以前X和Y有一條專有線路,消息會通過好幾個站點。
若是A想寫一封信給B,信件可能從X出發,到其它地點,而後轉發最終到Y。每一個站點都知道下一站發哪裏,由於站點有表格,記錄到各個目的地,信件該怎麼傳,報文交換的好處是,能夠用不一樣路由使通訊更可靠更能容錯。在這個例子裏,城市就像路由器同樣,消息沿着路由跳轉的次數,叫「跳數(hop count)」記錄跳數頗有用,由於能夠分辨出路由問題。
例如,假設芝加哥認爲去米蘇拉的最快路線是奧馬哈,但奧馬哈認爲去米蘇拉的最快城市是芝加哥,這就致使,2個城市看到目的地是米蘇拉,結果報文會在2個城市之間不停傳來傳去。不只浪費帶寬,並且這個路由錯誤須要修復。這種錯誤會被檢測到,由於跳數記錄在消息中,並且傳輸時會更新跳數。若是看到某條消息的跳數很高,就知道路由確定哪裏錯了,這叫「跳數限制」(鏈路狀態協議會用到距離)
報文交換的缺點之一是有時候報文比較大,會阻塞網絡,由於要把整個報文從一站傳到下一站後才能繼續傳遞其它報文。傳輸一個大文件時,整條路都阻塞了,即使只有一個1KB的電子郵件要傳輸,也只能等大文件傳完,或是選另外一條效率稍低的路線。 解決方法是 將大報文分紅不少小塊,叫「數據包」。
就像報文交換,每一個數據包都有目標地址,所以路由器知道發到哪裏,報文具體格式由「互聯網協議」定義,簡稱IP,這個標準建立於1970年代。每臺聯網的計算機都須要知道一個IP地址。以點分割的4組數字。數百萬臺計算機在網絡上不斷交換數據,瓶頸的出現和消失是毫秒級的。
路由器會平衡與其餘路由器之間的負載,以確保傳輸能夠快速可靠,這叫「阻塞控制」
分組交換
有時,同一個報文的多個數據包,會通過不一樣線路,到達順序可能會不同,這對一些軟件是個問題。幸運的是,在IP之上還有其它協議,好比TCP/IP
,以解決亂序問題。將數據拆分紅多個小數據包,而後經過靈活的路由傳遞,很是高效且可容錯,現在互聯網就是這麼運行的。這叫「分組交換」。
有個好處是,它是去中心化的,沒有中心權威機構,沒有單點失敗問題,事實上,由於冷戰期間有核攻擊的威脅,因此創造了分組交換。
現在,全球的路由器協同工做,找出最高效的線路,用各類標準協議運輸數據,好比「因特網控制消息協議(ICMP)」和「邊界網關協議(BGP)」世界上第一個分組交換網絡,以及現代互聯網的祖先是ARPANET
。
每一個小圓表示一個點,好比大學或實驗室,那裏運行着一個路由器,而且有一臺或多臺計算機,能看到PDP-1
和IBM 360系統
,甚至還有一個倫敦的ATLAS
是經過衛星連到網絡裏的。
顯然,互聯網在這幾十年發展迅速,現在再也不只有幾十臺計算機聯網,據估計,有接近100億臺聯網設備,並且互聯網會繼續快速發展。特別是現在各類智能設備層出不窮,好比聯網冰箱,恆溫器,以及其它智能家電,它們組成了「物聯網」。
計算機和一個巨大的分佈式網絡連在一塊兒,這個網絡叫互聯網。
互聯網由無數聯網設備組成,並且日益增多,計算機爲了獲取這個資源,首先要連到局域網,也叫LAN
。
家中WIFI路由器連着的全部設備,組成了局域網,局域網再連到廣域網,廣域網也叫WAN
。WAN
的路由器通常屬於「互聯網服務提供商」,簡稱「ISP」。好比,Comcast
, AT&T
, Verizon
這樣的公司。
廣域網裏,先連到一個區域性路由器,這路由器可能覆蓋一個街區,而後連到一個更大的WAN
,可能覆蓋整個城市,可能再跳幾回,但最終會到達互聯網主幹。互聯網主幹由一羣超大型,帶寬超高路由器組成。
爲了從網絡上獲取視頻,數據包(packet)要先到互聯網主幹,沿着主幹到達對應有視頻文件的網站服務器中。數據包從計算機到網站服務器,可能要跳個10次,先跳4次到互聯網主幹,2次穿過主幹,主幹出來可能再跳4次,而後到網站服務器。
若是用windows,Mac OS或Linux系統,能夠用traceroute
來看跳了幾回。
數據包究竟是怎麼過去的呢?
若是傳輸時數據包被弄丟了,會發生什麼?
若是在瀏覽器裏輸入 segmentfault.com,瀏覽器怎麼知道服務器地址是多少?
IP/TCP/UDP
互聯網是一個巨型分佈式網絡,會把數據拆成一個個數據包來傳輸,若是要發的數據很大,好比郵件附件,數據會被拆成多個小數據包。
例如:,網絡上的視頻就是一個個到達電腦的數據包,而不是一整個大文件發過來。
數據包(packet)想在互聯網上傳輸要符合「互聯網協議」的標準,簡稱「IP」。
就像郵寄手寫信同樣,郵寄是有標準的,每封信須要一個地址,並且地址必須是獨特的,而且大小和重量是有限制的。
IP數據包也是如此,由於IP是一個很是底層的協議。
數據包的頭部只有一個目標地址,頭部存「關於數據的數據」也叫元數據(metadata),這意味着當數據包到達對方電腦,對方不知道把包交給哪一個程序,所以須要在IP之上,開發更高級的協議,這些協議裏,最簡單最多見的叫「用戶數據報協議」,UDP
。
UDP
也有頭部,這個頭部位於數據前面,頭部裏包含有用的信息。
信息之一是端口號,每一個想訪問網絡的程序,都要想操做系統申請一個端口號。
當一個數據包到達時(好比是skype端口號3478),接收方的操做系統會讀UDP
頭部,讀裏面的端口號。若是看到端口號是3478,就把數據包交給skype。
總結:
IP
負責把數據包送到正確的計算機。UDP
負責把數據包送到正確的程序(端口負責送到正確的程序,由於TCP也有端口)。UDP
頭部裏還有「校驗和」,用戶檢查數據是否正確。 正如「校驗和」這個名字所暗示的檢查方式是把數據求和來對比。假設UDP
數據包裏原始數據是89, 111, 33, 32, 58, 41。在發送數據包前,電腦會把全部數據加在一塊兒,算出「校驗和」。
例如,89 + 111 + 333...
,以此推類。獲得364,這就是「校驗和」。UDP
中,「校驗和」以16位形式存儲(就是16個0或1),若是算出來的和,超過了16位能表示的最大值高位會被扔掉,保留低位。
當接收方電腦收到這個數據包,它會重複這個步驟,把全部數據加在一塊兒,89 + 111 + 333...
以此推類。若是結果和頭部的校驗和保持一致,表明一切正常。若是不一致,數據確定壞掉了。也許傳輸時碰到了功率波動,或電纜出故障了。
UDP
不提供數據修復或數據重發機制,接收方知道數據損壞後,通常只是扔掉。並且,UDP
沒法得知數據包是否到達。發送方發了以後,沒法知道數據包是否到達目的地。
這些特性看起來很糟糕,可是有些程序不在乎這些問題。由於UDP又簡單又快。
例如,Skype,它用UDP來作視頻通話,能處理壞數據或缺失數據。全部網速慢的時候,Skype卡卡的,由於只有一部分數據包到了電腦中,但對於其它一些數據,這個方法不實用。好比,郵件。
若是「全部數據必須達到」就用「傳輸控制協議TCP
」。TCP
和UDP
同樣,頭部也在數據前面,所以,通常叫作TCP/IP
。
就像UDP
,TCP
頭部也有「端口號」和「校驗和」,但TCP
有更高級的功能。
TCP
數據包有序號。 15號以後是16號,16號以後是17號,以此推類,發上百萬個數據包也是有可能的。序號使接收方能夠把數據包排成正確順序,即便到達時間不一樣,哪怕到達順序是亂的,TCP
協議也能把順序排對。TCP
要求接收方的電腦收到數據包而且「校驗和」檢查無誤後(數據沒有損壞)給發送方一個確認碼,表明收到了。「確認碼」簡稱ACK
,得知上一個數據包成功抵達後,發送方會發送下一個數據包。若是過了必定時間還沒收到確認碼,發送方會再發送一次。注意,數據包可能的確到了,只是確認碼延誤了好久,或傳輸丟失了。但不礙事,由於收件方有序列號。若是收到重複的數據包就會刪掉。TCP
不是隻能一個包一個包發,能夠同時發送多個數據包,收多個確認碼,這大大增長了效率,不用浪費事件等確認碼。確認碼的成功率和來回時間能夠推測網絡的擁堵程度,TCP
用這個信息,調整同時發包數量,解決擁堵問題。
簡單說,TCP
能夠處理亂序和丟失數據包,丟了就重發。還能夠根據擁擠狀況自動調整傳輸率。
迅雷是,P2P技術,是創建在TCP
協議之上的。
既然TCP
那麼厲害,還有人用UDP
嘛?TCP
最大的缺點是,那些「確認碼」數據包把數量翻了一倍,但並無傳遞更多信息,有時候這種代價是不值得的,特別是對時間要求很高的程序,好比在線射擊遊戲。若是玩遊戲很卡,也會以爲這樣不值得。
當計算機訪問一個網址時,須要二個東西:
有了ip和端口號,就能正確訪問網站。但記憶一長串數字很討厭,因此互聯網有個特殊服務,負責把域名和ip地址一一對應。就像專爲互聯網的電話簿,它叫「域名系統」,簡稱DNS
。
它的運做原理:
在瀏覽器輸入地址,瀏覽器會去問DNS
服務器,它的IP地址是多少,通常DNS
服務器是互聯網供應商提供的。DNS
會查表,若是域名存在,就返回對應的IP地址。而後瀏覽器會給這個IP地址發TCP
請求。
現在有三億個域名註冊,因此爲了更好管理,DNS
不是存在一個超長超長的列表,而是存成樹狀結構。頂級域名(簡稱TLD),在最頂部,好比.com
和.gov
。下一層是二級域名,好比.com
下面有baidu.com
和dftba.com
。更下一層叫子域名,好比image.baidu.com
。這個樹超級大。
三億個域名,只是二級域名,不是全部子域名。所以,這些數據散佈在不少DNS
服務器上,不一樣服務器負責樹不一樣部分。
能夠進行再次封裝。
線路里的電信號,以及無線網絡裏的無線信號。這些叫「物理層」。
而「數據鏈路層」負責操控「物理層」,數據鏈路層有:媒體訪問控制地址(MAC),碰撞檢測,指針退避,以及一些底層協議。
再上一層是「網絡層」,負責各類報文交換和路由。
「傳輸層」裏的一大部分是TCP
和UDP
這些協議,負責在計算機之間進行點到點的傳輸,並且還會檢測修復錯誤。
「會話層」,會使用TCP
和UDP
來建立鏈接,傳遞信息,而後關掉鏈接。
開放式系統互聯通訊參考模型
開放式系統互聯通訊參考模型(OSI)的底下5層,這個概念性框架,把網絡通訊劃分紅多層,每一層處理各自的問題,若是不分層,直接從上到下捏在一塊兒實現網絡通訊,是徹底不可能的。抽象使得科學家和工程師能分工同時改進多個層,不被總體複雜度難倒。
OSI模型還有兩層,「表示層」和「應用程序層」。其中有瀏覽器,Skype,HTML解碼,在線看電影等。
互聯網是傳遞數據的管道,各類程序都會用。
電線,信號,交換機,數據包,路由器,協議,它們共同組成了互聯網。再抽象一層,就是萬維網。
萬維網(World Wide Web)和互聯網(Internet)不是一回事,萬維網在互聯網之上運行,互聯網之上有Skype,Instagram,互聯網是傳遞數據的管道,各類程序都會用,其中傳輸最多的數據的程序是萬維網。
分佈在全球數百萬個服務器上,能夠用「瀏覽器」來訪問萬維網。
超連接
萬維網的最基本單位,是單個頁面。頁面有內容,也有去其它頁面的連接,這些連接叫「超連接」。這些超連接造成巨大的互聯網絡,這就是萬維網的名字來源。Vannevar Bush
的形容是「關聯式索引..選一個物品會引發,另一個物品被當即選中」,他解釋說:「將兩樣東西聯繫在一塊兒的過程十分重要,在任什麼時候候,當其中一件東西進入視線,只須要點一下按鈕,立馬就能回憶起另外一件。」
爲了使網頁能相互鏈接,每一個網頁須要一個惟一的地址,這個地址叫「統一資源定位器」,簡稱URL
計算機首先會作「DNS查找」,「DNS查找」的輸入是一個域名,好比「www.google.com」,DNS會輸出對應的IP地址,如今有了IP地址,瀏覽器會打開一個TCP鏈接到這個IP地址,這個地址運行着「網絡服務器」,網絡服務器的標準端口是80端口,
下一步是 向服務器請求「courses」這個頁面,這裏會用「超文本傳輸協議」(HTTP),HTTP的第一個標準,HTTP 0.9,建立於1991年,只有一個指令,「GET」指令。該指令以「ASCII編碼」發送到服務器,服務器會返回該地址對應的網頁而後瀏覽器會渲染到屏幕上。
若是用戶點擊了另外一個連接,計算機會從新發一個GET請求,瀏覽網站的時候,這個步驟會不斷重複。
在以後的版本,HTTP添加了狀態碼,狀態碼放在請求前面。
「超文本」的存儲和發送都是以普通文本形式,由於若是隻有純文本,沒法代表什麼是連接,什麼不是連接。因此,有必要開發一種標記方法。由於有了超文本標記語言(HTML)。
HTML初版的版本號0.8,建立於1990年,有18種HTML指令。最新版的HTML,HTML5,有100多種標籤。
搜索引擎
網頁瀏覽器和網頁服務器溝通,瀏覽器不只獲取網頁和媒體,獲取後還負責顯示。Tim Berners-Lee
在1990年寫的,一共花了2個月,爲了作出來,同時創建了幾個最基本的網絡標準,URL,HTML和HTTP,在內部使用了一段時間,在1991年發佈出去,萬維網就此誕生,重要的是,萬維網有開放標準,均可以開發新服務器和新瀏覽器。
最先的搜索引擎,叫JumpStation
,它有3個部分,
與其信任網頁上的內容,搜索引擎會看其餘網站,有沒有連接到這個網站。因此這些「反向連接」的數量,特別是有信譽的網站,表明了網站的質量。
網絡中立性,應該平等對待全部數據包,不管是這個數據包是郵件,或則是在看對視頻,速度和優先級應該是同樣的。但不少公司會樂意讓它們的數據優先到達。例如,Comcast,它們不可是大型互聯網服務提供商並且擁有多家電視頻道,好比,NBC和The Weather Channel,能夠在線看。
Comcast可讓本身的內容優先到達,節流(Throttled,故意給更少的寬帶和更低優先級)其餘線上視頻。
支持網絡中立性的人說,沒有中立性後,服務商能夠推出提速的「高級套餐」,給剝削性商業模式埋下種子。互聯網服務供應商成爲信息的「守門人」,它們有着強烈的冬季去碾壓對手。另外一方面,從技術緣由看,也會但願不一樣數據傳輸速度不一樣。