IP、UDP和TCP的關(guān)系
互聯(lián)網(wǎng),實際上是一套理念和協(xié)議組成的體系架構(gòu)。其中,協(xié)議是一套眾所周知的規(guī)則和標準,如果各方都同意使用,那么它們之間的通信將變得毫無障礙。
IP:把數(shù)據(jù)包送達目的主機
數(shù)據(jù)包要在互聯(lián)網(wǎng)上進行傳輸,就要符合網(wǎng)際協(xié)議(IP)標準,互聯(lián)網(wǎng)上不同的在線設(shè)備都有唯一的地址,地址只是一個數(shù)字,這和大部分家庭收件地址類似,你只需要知道一個家庭的具體地址,就可以往這個地址發(fā)送包裹,這樣物流系統(tǒng)就能把物品送到目的地。
計算機的地址就稱為 IP 地址,訪問任何網(wǎng)站實際上只是你的計算機向另外一臺計算機請求信息。
如果要想把一個數(shù)據(jù)包從主機 A 發(fā)送給主機 B,那么在傳輸之前,數(shù)據(jù)包上會被附加上主機 B 的 IP 地址信息,這樣在傳輸過程中才能正確尋址。額外地,數(shù)據(jù)包上還會附加上主機 A 本身的 IP 地址,有了這些信息主機 B 才可以回復(fù)信息給主機 A。這些附加的信息會被裝進一個叫 IP 頭的數(shù)據(jù)結(jié)構(gòu)里。IP 頭是 IP 數(shù)據(jù)包開頭的信息,包含 IP 版本、源 IP 地址、目標 IP 地址、生存時間等信息。
簡化的 UDP 網(wǎng)絡(luò)三層傳輸模型
UDP:把數(shù)據(jù)包送達應(yīng)用程序
IP 是非常底層的協(xié)議,只負責(zé)把數(shù)據(jù)包傳送到對方電腦,但是對方電腦并不知道把數(shù)據(jù)包交給哪個程序,是交給瀏覽器還是交給王者榮耀?因此,需要基于 IP 之上開發(fā)能和應(yīng)用打交道的協(xié)議,最常見的是“用戶數(shù)據(jù)包協(xié)議(User Datagram Protocol)”,簡稱UDP。
UDP 中一個最重要的信息是端口號,端口號其實就是一個數(shù)字,每個想訪問網(wǎng)絡(luò)的程序都需要綁定一個端口號。通過端口號 UDP 就能把指定的數(shù)據(jù)包發(fā)送給指定的程序了,所以IP 通過 IP 地址信息把數(shù)據(jù)包發(fā)送給指定的電腦,而 UDP 通過端口號把數(shù)據(jù)包分發(fā)給正確的程序。和 IP 頭一樣,端口號會被裝進 UDP 頭里面,UDP 頭再和原始數(shù)據(jù)包合并組成新的 UDP 數(shù)據(jù)包。UDP 頭中除了目的端口,還有源端口號等信息。
簡化的 UDP 網(wǎng)絡(luò)四層傳輸模型
UDP 不能保證數(shù)據(jù)可靠性,但是傳輸速度卻非???,所以 UDP 會應(yīng)用在一些關(guān)注速度、但不那么嚴格要求數(shù)據(jù)完整性的領(lǐng)域,如在線視頻、互動游戲等。
TCP:把數(shù)據(jù)完整地送達應(yīng)用程序
對于瀏覽器請求,或者郵件這類要求數(shù)據(jù)傳輸可靠性(reliability)的應(yīng)用,如果使用 UDP 來傳輸會存在兩個問題:
- 數(shù)據(jù)包在傳輸過程中容易丟失;
- 大文件會被拆分成很多小的數(shù)據(jù)包來傳輸,這些小的數(shù)據(jù)包會經(jīng)過不同的路由,并在不同的時間到達接收端,而 UDP 協(xié)議并不知道如何組裝這些數(shù)據(jù)包,從而把這些數(shù)據(jù)包還原成完整的文件。
基于這兩個問題,我們引入 TCP 了。TCP(Transmission Control Protocol,傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。相對于 UDP,TCP 有下面兩個特點:
- 對于數(shù)據(jù)包丟失的情況,TCP 提供重傳機制;
- TCP 引入了數(shù)據(jù)包排序機制,用來保證把亂序的數(shù)據(jù)包組合成一個完整的文件。
和 UDP 頭一樣,TCP 頭除了包含了目標端口和本機端口號外,還提供了用于排序的序列號,以便接收端通過序號來重排數(shù)據(jù)包。
簡化的 TCP 網(wǎng)絡(luò)四層傳輸模型
下面我們再看下完整的 TCP 連接過程,通過這個過程你可以明白 TCP 是如何保證重傳機制和數(shù)據(jù)包的排序功能的。
一個TCP連接的生命周期
從上圖可以看出,一個完整的 TCP 連接的生命周期包括了建立連接、傳輸數(shù)據(jù)、關(guān)閉連接三個階段。
- 首先,建立連接階段。這個階段是通過“三次握手”來建立客戶端和服務(wù)器之間的連接。TCP 提供面向連接的通信傳輸。面向連接是指在數(shù)據(jù)通信開始之前先做好兩端之間的準備工作。所謂三次握手,是指在建立一個 TCP 連接時,客戶端和服務(wù)器總共要發(fā)送三個數(shù)據(jù)包以確認連接的建立。
- 其次,傳輸數(shù)據(jù)階段。在該階段,接收端需要對每個數(shù)據(jù)包進行確認操作,也就是接收端在接收到數(shù)據(jù)包之后,需要發(fā)送確認數(shù)據(jù)包給發(fā)送端。所以當(dāng)發(fā)送端發(fā)送了一個數(shù)據(jù)包之后,在規(guī)定時間內(nèi)沒有接收到接收端反饋的確認消息,則判斷為數(shù)據(jù)包丟失,并觸發(fā)發(fā)送端的重發(fā)機制。同樣,一個大的文件在傳輸過程中會被拆分成很多小的數(shù)據(jù)包,這些數(shù)據(jù)包到達接收端后,接收端會按照 TCP 頭中的序號為其排序,從而保證組成完整的數(shù)據(jù)。
- 最后,斷開連接階段。數(shù)據(jù)傳輸完畢之后,就要終止連接了,涉及到最后一個階段“四次揮手”來保證雙方都能斷開連接。
TCP 為了保證數(shù)據(jù)傳輸?shù)目煽啃裕瑺奚藬?shù)據(jù)包的傳輸速度,因為“三次握手”和“數(shù)據(jù)包校驗機制”等把傳輸過程中的數(shù)據(jù)包的數(shù)量提高了一倍。