前言:瀏覽器
在衡量 Web 頁面性能的時候有一個重要的指標叫「FP(First Paint)」,是指從頁面加載到首次開始繪製的時長。這個指標直接影響了用戶的跳出率,更快的頁面響應意味着更多的 PV、更高的參與度,以及更高的轉化率。那什麼影響 FP 指標呢?其中一個重要的因素是網絡加載速度。服務器
一個數據包的「旅程」網絡
下面我將分別從「數據包如何送達主機」「主機如何將數據包轉交給應用」和「數據是如何被完整地送達應用程序」這三個角度來爲你講述數據的傳輸過程。數據結構
互聯網,其實是一套理念和協議組成的體系架構。其中,協議是一套衆所周知的規則和標準,若是各方都贊成使用,那麼它們之間的通訊將變得毫無障礙。架構
互聯網中的數據是經過數據包來傳輸的。若是發送的數據很大,那麼該數據就會被拆分爲不少小數據包來傳輸。好比你如今聽的音頻數據,是拆分紅一個個小的數據包來傳輸的,並非一個大的文件一次傳輸過來的。性能
1. IP:把數據包送達目的主機網站
數據包要在互聯網上進行傳輸,就要符合網際協議(Internet Protocol,簡稱 IP)標準。互聯網上不一樣的在線設備都有惟一的地址,地址只是一個數字,這和大部分家庭收件地址相似,你只須要知道一個家庭的具體地址,就能夠往這個地址發送包裹,這樣物流系統就能把物品送到目的地。視頻
計算機的地址就稱爲 IP 地址,訪問任何網站實際上只是你的計算機向另一臺計算機請求信息。blog
若是要想把一個數據包從主機 A 發送給主機 B,那麼在傳輸以前,數據包上會被附加上主機 B 的 IP 地址信息,這樣在傳輸過程當中才能正確尋址。額外地,數據包上還會附加上主機 A 自己的 IP 地址,有了這些信息主機 B 才能夠回覆信息給主機 A。這些附加的信息會被裝進一個叫 IP 頭的數據結構裏。IP 頭是 IP 數據包開頭的信息,包含 IP 版本、源 IP 地址、目標 IP 地址、生存時間等信息。排序
爲了方便理解,先把網絡簡單分爲三層結構,以下圖:
下面咱們一塊兒來看下一個數據包從主機 A 到主機 B 的旅程:
1.上層將含有「極客時間」的數據包交給網絡層;
2.網絡層再將 IP 頭附加到數據包上,組成新的 IP 數據包,並交給底層;
3.底層經過物理網絡將數據包傳輸給主機 B;
4.數據包被傳輸到主機 B 的網絡層,在這裏主機 B 拆開數據包的 IP 頭信息,並將拆開來的數據部分交給上層;
5.最終,含有「極客時間」信息的數據包就到達了主機 B 的上層了。
2. UDP:把數據包送達應用程序
IP 是很是底層的協議,只負責把數據包傳送到對方電腦,可是對方電腦並不知道把數據包交給哪一個程序,是交給瀏覽器仍是交給王者榮耀?所以,須要基於 IP 之上開發能和應用打交道的協議,最多見的是「用戶數據包協議(User Datagram Protocol)」,簡稱 UDP。
UDP 中一個最重要的信息是端口號,端口號其實就是一個數字,每一個想訪問網絡的程序都須要綁定一個端口號。經過端口號 UDP 就能把指定的數據包發送給指定的程序了,因此 IP 經過 IP 地址信息把數據包發送給指定的電腦,而 UDP 經過端口號把數據包分發給正確的程序。和 IP 頭同樣,端口號會被裝進 UDP 頭裏面,UDP 頭再和原始數據包合併組成新的 UDP 數據包。UDP 頭中除了目的端口,還有源端口號等信息。
爲了支持 UDP 協議,我把前面的三層結構擴充爲四層結構,在網絡層和上層之間增長了傳輸層,以下圖所示:
下面咱們一塊兒來看下一個數據包從主機 A 旅行到主機 B 的路線:
1.上層將含有「極客時間」的數據包交給傳輸層;
2.傳輸層會在數據包前面附加上 UDP 頭,組成新的 UDP 數據包,再將新的 UDP 數據包交給網絡層;
3.網絡層再將 IP 頭附加到數據包上,組成新的 IP 數據包,並交給底層;
4.數據包被傳輸到主機 B 的網絡層,在這裏主機 B 拆開 IP 頭信息,並將拆開來的數據部分交給傳輸層;
5.在傳輸層,數據包中的 UDP 頭會被拆開,並根據 UDP 中所提供的端口號,把數據部分交給上層的應用程序;
6.最終,含有「極客時間」信息的數據包就旅行到了主機 B 上層應用程序這裏。
在使用 UDP 發送數據時,有各類因素會致使數據包出錯,雖然 UDP 能夠校驗數據是否正確,可是對於錯誤的數據包,UDP 並不提供重發機制,只是丟棄當前的包,並且 UDP 在發送以後也沒法知道是否能達到目的地。雖然說 UDP 不能保證數據可靠性,可是傳輸速度卻很是快,因此 UDP 會應用在一些關注速度、但不那麼嚴格要求數據完整性的領域,如在線視頻、互動遊戲等。
3. TCP:把數據完整地送達應用程序
對於瀏覽器請求,或者郵件這類要求數據傳輸可靠性(reliability)的應用,若是使用 UDP 來傳輸會存在兩個問題:
1.數據包在傳輸過程當中容易丟失;
2.大文件會被拆分紅不少小的數據包來傳輸,這些小的數據包會通過不一樣的路由,並在不一樣的時間到達接收端,而 UDP 協議並不知道如何組裝這些數據包,從而把這些數據包還原成完整的文件。
基於這兩個問題,咱們引入 TCP 了。TCP(Transmission Control Protocol,傳輸控制協議)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。相對於 UDP,TCP 有下面兩個特色
:
對於數據包丟失的狀況,TCP 提供重傳機制;
TCP 引入了數據包排序機制,用來保證把亂序的數據包組合成一個完整的文件。和 UDP 頭同樣,TCP 頭除了包含了目標端口和本機端口號外,還提供了用於排序的序列號,以便接收端經過序號來重排數據包。
下面看看 TCP 下的單個數據包的傳輸流程:
經過上圖你應該能夠了解一個數據包是如何經過 TCP 來傳輸的。
TCP 單個數據包的傳輸流程和 UDP 流程差很少,不一樣的地方在於,經過 TCP 頭的信息保證了一塊大的數據傳輸的完整性。
下面咱們再看下完整的 TCP 鏈接過程,經過這個過程你能夠明白 TCP 是如何保證重傳機制和數據包的排序功能的。
從下圖能夠看出,一個完整的 TCP 鏈接的生命週期包括了「創建鏈接」「傳輸數據」和「斷開鏈接」三個階段。
首先,創建鏈接階段。這個階段是經過「三次握手」來創建客戶端和服務器之間的鏈接。TCP 提供面向鏈接的通訊傳輸。面向鏈接是指在數據通訊開始以前先作好兩端之間的準備工做。所謂三次握手,是指在創建一個 TCP 鏈接時,客戶端和服務器總共要發送三個數據包以確認鏈接的創建。
其次,傳輸數據階段。在該階段,接收端須要對每一個數據包進行確認操做,也就是接收端在接收到數據包以後,須要發送確認數據包給發送端。因此當發送端發送了一個數據包以後,在規定時間內沒有接收到接收端反饋的確認消息,則判斷爲數據包丟失,並觸發發送端的重發機制。一樣,一個大的文件在傳輸過程當中會被拆分紅不少小的數據包,這些數據包到達接收端後,接收端會按照 TCP 頭中的序號爲其排序,從而保證組成完整的數據。
最後,斷開鏈接階段。數據傳輸完畢以後,就要終止鏈接了,涉及到最後一個階段「四次揮手」來保證雙方都能斷開鏈接。
到這裏你應該就明白了,TCP 爲了保證數據傳輸的可靠性,犧牲了數據包的傳輸速度,由於「三次握手」和「數據包校驗機制」等把傳輸過程當中的數據包的數量提升了一倍。
注: 本文出自極客時間(瀏覽器工做原理與實踐),請你們多多支持李兵老師。若有侵權,請及時告知