PM技術課 | 計算機網絡知多少?
本文筆者將與大家分享:TCP/IP協議族、HTTP、TCP、UDP、Socket、狀態碼等的基礎知識。
一個完整的通信過程
互聯網,顧名思義,就是互相連接,形成網絡。其中的關鍵是“聯網”,從技術上看,聯網就是通信。
那么,通信的過程是怎么樣的呢?使用瀏覽器訪問網頁,是最為常見的通信方式,我們也以訪問網頁為例,查看一個完整的通信過程。
我們在瀏覽器中輸入一個 URL,回車之后便會在瀏覽器中觀察到頁面內容,實際上這個過程經過了很多個步驟。
- 我們在地址欄輸入一個URL鏈接,比如www.baidu.com;
- 瀏覽器向百度服務器發送了一個訪問請求;
- 百度服務器接收到這個訪問請求之后進行處理和解析,知道客戶端是想要訪問網站;
- 百度服務器返回對應的響應給瀏覽器,包含了頁面的源代碼等內容;
- 瀏覽器再對其進行響應解析;
- 瀏覽器將網頁呈現出來。
互聯網的基礎:TCP/IP協議族
互聯網的的關鍵是通信,而通信的關鍵則是通信協議。
說句題外話,有段時間,聯想5G投票事件鬧得沸沸揚揚,除了民族情緒,更多的還是對通信協議的爭奪,誰掌握了通信協議,誰就掌握了通信的核心。
計算機之間的通信協議是TCP/IP協議族,通信協議定義了通信的基本問題。
比如:由哪一邊先發起通信、使用哪種語言進行通信、數據傳輸順序是怎么樣的、怎樣結束通信等規則,這些規則稱為協議(protocol)。通過這些協議,不同的計算機、手機甚至智能手表之間都可以互相通信。
“族”的意思是很多種協議,比如TCP、UDP、IP、FTP、HTTP、ICMP等都屬于 TCP/IP 族內的協議。這些協議本身又可以劃分為不同的層次,大致可以分為4層,分別是:應用層、傳輸層、網絡層和鏈路層。
當然也有不同的劃分方式,不同的劃分方式大同小異,沒有本質的區別。
1)應用層
應用層負責傳送各種最終形態的數據,是直接與用戶打交道的層,典型協議是HTTP、FTP等。
2)傳輸層
傳輸層負責傳送文本數據,傳輸層有兩個性質不同的協議,分別是 TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Data Protocol,用戶數據報協議)。
3)網絡層
網絡層負責分配地址和傳送數據,主要協議是IP協議。
IP地址(Internet Protocol Address)是指:互聯網協議地址,它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異,用來在網絡中標記一臺電腦的一串數字,比如192.168.1.1。
4)鏈路層
鏈路層向該層用戶提供透明的和可靠的數據傳送基本服務。
透明性是指:該層上傳輸的數據的內容、格式及編碼沒有限制,也沒有必要解釋信息結構的意義;可靠的傳輸使用戶免去對丟失信息、干擾信息及順序不正確等的擔心。
你可能會感到奇怪,為什么要層次化呢?
- 在保證層次之間接口不變的情況下,層次內部可以改動,不至于“牽一發而動全身”
- 降低了開發的復雜度,開發的過程中,也只需要關注某一層的協議,而不需要深入了解所有的協議。
數據是如何流動傳輸?
數據發送的時候依次經過應用層、傳輸層、網絡層、鏈路層,之后通過光纖等硬件傳送給接收端。
接收端的鏈路層接收到數據,并依次通過網絡層、傳輸層、最終到達應用層,進行數據處理。
首先,作為發送端的客戶端在應用層(HTTP 協議)發出的 HTTP請求(比如想要訪問http://www.baidu.com),并生成HTTP數據。
- 為了傳輸方便,在傳輸層(比如TCP 協議)把從應用層處收到的數據(HTTP 數據)進行封裝,之后轉發給網絡層。
- 在網絡層(IP 協議),增加作為通信目的地的地址后轉發給鏈路層。
- 給這些數據附加上以太網數據并進行發送處理,生成的以太網數據將通過物理層傳輸給接收端。
- 接收端在鏈路層接收到數據,依次往上層傳輸,直至應用層。當傳輸到應用層,才能算真正接收到由客戶端發送過來的 HTTP 請求。
HTTP是啥?
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)是用于服務器傳輸超文本到本地瀏覽器的傳送協議。HTTP是TCP/IP協議族的一部分,屬于應用層的面向對象的協議,由于其簡捷、快速的方式,受到了廣泛的應用。
HTTP協議工作于客戶端-服務端架構上,客戶端向服務器發送所有請求,服務器根據接收到的請求后,向客戶端發送響應信息。
HTTP協議具有以下特點:
- HTTP協議簡單快速,客戶端向服務器請求服務時,只需傳送請求方法和路徑。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
- HTTP系統通信靈活,允許傳輸任意類型的數據對象。比如:文字、圖片、音頻和視頻等內容,這也是我們可以在瀏覽器或者手機APP查看各種音頻、視頻的原因。
- HTTP協議面向無連接通信,面向無連接是指通信雙方不需要事先建立一條通信線路,而是把每個帶有目的地址的包送到線路上,由系統自主選定路線進行傳輸。這就像我們做出租車的時候,只會告訴司機目的地,并不需要跟司機說走哪條路。
TCP、UDP、Socket
TCP
TCP(transport control protocol,傳輸控制協議)是面向連接的、可靠的流協議。
流就是指不間斷的數據,你可以把它想象成排水管中的水流。
面向連接,是指發送數據之前必須在兩端建立連接。建立連接,為數據的可靠傳輸打下了基礎。
可靠的意思是信息不會丟失,當一臺計算機想要與另一臺計算機通訊時,兩臺計算機之間的通信需要暢通且可靠,這樣才能保證正確收發數據。比如:查收電子郵件的時候,有時候差一個字,意思可能就不一樣了,所以要保證每一個字都能夠接收到。
在技術實現上,TCP為了保證報文傳輸的可靠,就給每個包一個序號,序號也保證了傳送到接收端實體的包的按序接收。接收端接受到數據之后,也會向發送端發送一個確認的信息(Acknowledgement ,ACK)。如果發送端在一定時間內沒有收到接收端返回的ACK,那么發送端會重新發送數據,保證通信的可靠性。
UDP
UDP(user datagram protocol,用戶數據報協議)與TCP協議一樣用于處理數據包,是一種無連接,面向消息的,提供高效率服務的協議。
UDP是面向無連接的協議, UDP不需要在發送數據前進行建立連接,想發數據就可以開始發送了。有時候,接收端還沒有準備好,發送端就開始發送數據了!
UDP也沒有數據拆分和編號操作,一股腦直接發送過去了。特別是在網絡傳輸狀況較差的時候,發送端只顧著發送數據,接收端可能壓根沒有接受到數據。
但UDP這樣做也有好處,就是傳輸速度快,TCP在傳輸之前要建立連接,傳輸過程中還要編號。接收端接收到所有編號之后,重新組裝成信息,需要花費不少時間,在對時間較高的場景,這樣做明顯會帶來較長的時延。
所以,UDP常用在對實時性較高的通信領域,比如:視頻會議,這些情況對實時性要求較高,即使丟失了一些數據,也不影響接受信息。
TCP提供面向連接的可靠服務 ,UDP提供無連接的不可靠的服務。對數據準確性要求高,速度可以相對較慢的,可以選用TCP,對實時性要求高的場景可以使用UDP。
Socket
除了TCP/IP,我們可能也會聽說過Socket。
Socket(套接字) 是對 TCP/IP 協議的封裝,Socket 只是個接口(API)不是協議,通過 Socket 我們才能使用 TCP/IP 協議。
創建 Socket 接口的時候,需要指定傳輸層協議,可以是 TCP 或者 UDP,當用 TCP 連接,該Socket就是個TCP連接,反之亦然。
狀態碼:404
服務器響應客戶端請求的時候,會返回HTTP狀態碼(HTTP Status Code)。狀態碼是表示服務器響應狀態的3位數字代碼,表示訪問請求已經被服務器接收、理解并接收。
狀態碼可以分為下面5類:
- 1xx:指示信息–表示請求已接收,繼續處理;
- 2xx:成功–表示請求已被成功接收、理解、接受;
- 3xx:重定向–要完成請求必須進行更進一步的操作;
- 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現;
- 5xx:服務器端錯誤–服務器未能實現合法的請求。
下面是幾個比較常見的狀態碼。
1)200:OK
請求已成功,出現此狀態碼是表示正常狀態。
2)403:Forbidden
服務器已經理解請求,但是拒絕執行它,通常是服務器文件權限設置導致,比如:用戶無權訪問。
3)404:Not Found
用戶最常見的狀態碼是404,即請求失敗,通常是訪問的資源在服務器中不存在。用戶沒有找到自己需要的資源,給用戶的體驗很不好,自定義404錯誤頁面是提高用戶體驗的常見做法。
當用戶訪問的資源不存的時候,不是直接返回404,而是指向一個設計好的html 文件,有些網站甚至會為404設置個小游戲,作為彩蛋。
比如:游戲公司暴雪的404網頁延續了其冷酷的設計,一張被錘子砸得面目全非的網頁告訴用戶:你真的走錯路了。
八卦:下載那些事兒
帶寬與網速
我們去中國電信、中國聯通、中國移動辦理寬帶網絡的時候,帶寬通常是10M、20M,但安裝完成后,下載速度卻可能只有1M/s,遠遠達不到所說的10M。是運營商欺騙了我們么?帶寬、網速是什么,又有什么關系呢?
- 帶寬是數據傳輸的速度,單位是比特/秒(bps),10M=10Mbps。
- 網速是數據傳輸的速度,但是單位與帶寬的單位不同,單位是字節/秒(B/s),1MB/s=1024KB/s 。
比特是信息的最小單位,1字節=8比特,1字節/秒=8比特/秒。因此, 10M帶寬=1.25MB/s網速,1M帶寬=0.125MB/s=128KB/s,運營商提供的10M網絡,轉換成網速也就是1.25M/s,跟我們日常的體驗相符,這也算是運營商的“小詭計”了。
帶寬成本
對普通用戶而言,10M的寬帶,每個月的上網費用就要幾十塊錢。不只是對普通用戶,帶寬成本對互聯網公司而言同樣是巨大的成本,特別是對于各大視頻網站而言,帶寬成本是非常巨大的運營成本。
根據阿里云提供的數據,按流量計費,要0.8元/G,一部電影通常在2G左右,下載一部電影就需要 1.6元,這個數據看起來可能不大,但考慮到用戶規模,數據就會變得很大了。如果有100萬個用戶,每個用戶每天看一部電影,每天的帶寬成本可能就有160萬元,這也是視頻網站難以盈利的重要原因。
為了減低帶寬成本,互聯網公司也是想盡辦法,比如:百度網盤會對非會員限速,巨大的帶寬成本是百度網盤這么做的重要原因。
面對用戶對限速的質疑,百度網盤回應,“作為一款免費的云存儲產品,每年的服務器成本和帶寬成本是硬傷啊。百度網盤存活著為廣大用戶提供免費的空間內存已經是一筆需每年持續支出的高額成本。除此之外,還有服務成本和帶寬成本,寶寶們雖然已經為家里的網絡網速買過單,但是當寶寶們打開百度網盤上傳和下載文件時,我們還需要為這些文件傳輸時的帶寬進行支付,用戶文件傳輸時帶寬越大我們需要支付的費用越高”。
即使是財大氣粗的百度公司,也要考慮到昂貴的帶寬成本,帶寬成本始終是高流量網站需要面對的問題。
P2P
提高下載速度就要增加帶寬,增加帶寬,運營成本也隨之提高;如果不增加帶寬,下載速度就會降低,用戶體驗很差。
有沒有什么辦法可以解決成本和下載速度之間的矛盾呢?
P2P是個好主意,這里的P2P不是互聯網金融的P2P,而是點對點(peer to peer)通信的網絡技術。P2P依賴網絡中參與者的計算能力和帶寬,而不是把依賴都聚集在較少的幾臺服務器上,互聯網金融的P2P借鑒了這個技術概念。
定義有些拗口,我們舉個例子就明白了。
傳統下載方式是從服務器端下載文件到客戶端,由于是從一臺服務器下載,服務器所提供的帶寬是一定的,因此下載人越多速度越慢。假設服務器的帶寬是100M,即12500kb/s。有100臺客戶端連接,那么每一臺分享到的帶寬就是125kb/s,難怪下載速度這么慢!
為了避免服務端帶寬的限制, P2P下載應運而生。與傳統下載不同,P2P下載是用戶越多,下載越快,這是因為P2P用的是一種共享的方式提供下載。
我們可能也會聽說過BT,BT全名叫”BitTorrent”, BT和P2P有些差別,P2P指的是數據的一種傳送方式,而BT是應用這種方式的軟件。但我們大多數人接觸較多的都是P2P,這里就用P2P直接使用P2P代指P2P和BT了,請讀者知曉。
我們以迅雷下載為例,說明P2P的下載過程。
比如:用戶甲從網上下載《流浪地球》,得到一個下載地址A,然后使用迅雷下載,下載地址A就會被迅雷收集在服務器上,另外還有一個用戶乙使用迅雷從另外一個網站下載《流浪地球》,迅雷同樣會收集這個下載地址B。
這時候,迅雷就有了(下載地址A,下載地址B)兩個下載地址,同時用戶甲,用戶乙也會作為新的下載地址(行話叫做’“ 肉雞”),此時,迅雷就有(下載地址A,下載地址B,用戶甲,用戶乙)四個下載地址。
當新用戶丙使用迅雷下載《流浪地球》的時候,就可以分別從下載地址A,下載地址B,用戶甲,用戶乙這四個地方同時下載不同的片段,等下載完成之后再拼成一部完整的電影。
當然,用戶丙在下載的過程中,也給其他人提供下載地址,此時迅雷的數據庫里有(下載地址A、下載地址B、用戶甲、用戶乙、用戶丙)五個下載地址,這也是迅雷下載速度較快的原因。不只是迅雷,快播、電驢、BT下載等P2P下載也是類似的原理。
通過P2P下載,在不增加服務器帶寬的時候,卻能提高下載速度!網絡真奇妙!
本文由@李艷賓 原創發布于人人都是產品經理,未經許可,禁止轉載
題圖來自Unsplash, 基于CC0協議
最后一點不是很明白,下載地址A、下載地址B、用戶甲、用戶乙作為用戶丙的下載地址,那用戶甲或者用戶乙關機了,那用戶丙下載的電影不是少了一段?
下載那段內容,異常精彩!感謝
獲益匪淺
最后一段寫的是這牛逼,沒想到下載行業程序這么牛逼
作者辛苦了 寫的真好
通俗易懂
嗯,看不懂
是專業名詞、概念太多,而平時基本接觸不到這些東西嗎?
加個雞腿
作者辛苦了