1. 程式人生 > >淺析TCP協議與UDP協議

淺析TCP協議與UDP協議

linux運維

TCP(Transmission Control Protocol,全稱傳輸控制協議。工作在TCP/IP協議棧中的傳輸層,為主機層對主機層的連接提供了可靠的鏈接服務。此協議通過三個步驟使客戶機與服務器建立一個連接,並通過四個步驟關閉此連接,這個過程我們分別稱之為三次握手和四次揮手。

UDP((User Datagram Protocol,全稱用戶數據報協議。同樣工作在傳輸層,是一種非面向連接的協議,因為其無恢復數據功能,所以是一種不可靠的網絡訪問。但因為發送數據時無需向TCP一樣反復建立連接,所以內存占用率小,傳輸性能高。

一:何為TCP/IP協議棧?

1.名詞解釋

TCP(Transmission Control Protocol 傳輸控制協議)/IP(Internet Protocol 因特網互聯協議)棧,是以TCP和IP協議為重要代表的多個協議的集合,該集合中還包括UDP、ICMP、RIP、TELNET、 FTP、SMTP、ARP等許多協議。

2.歷史:

最早發源於美國國防部(縮寫為DoD)的 因特網的前身ARPA網項目,1983年1月1 日,TCP/IP取代了舊的網絡控制協議NCP,成為今天的互聯網和局域網的基石和標準,由互聯網工程任務組負責維護。

3.TCP/IP協議棧結構:

我們知道,早期的OSI參考模型將網絡分為七層,而TCP/IP模型將網絡分為了五層,如下圖:

技術分享

圖一 : TCP/IP與OSI參考模型對比圖(點擊查看高清大圖)

二:深入理解TCP協議的三次握手和四次揮手

首先讓我們了解TCP首部組成結構,如下圖:

技術分享

圖二 : TCP首部結構

(點擊查看高清大圖)

(1)源端口和目標端口:

一般情況下,源端口為客戶端,目標端口為服務器端。由圖二可知源端口和目標端口各占16位,也就是2^16-1=65535,所以客戶端理論上來說可以打開65535個程序來訪問服務器端。其中客戶機端口號隨機生成,而服務器端口固定不變。可以通過 cat /etc/service 配合grep查看常見服務所用端口號。

(2)序號(seq):

表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由於序列號由32位 表示,所以每2^32個字節,就會出現序列號回繞,再次從 0 開始

(3)確認號(ack acknowledgement character):

表示接收方期望收到發送方下一個報文段的第一個字節數據的編號

總的來說,seq和ack都是數據包的序號。

(4)重要標記位:

從圖二我們可以看出,標記位共有六個,每一個只占一位,所以標記位取值只有0 、1種情況。


URG: 是否包含緊急數據(urgent)

PSH: 傳送(push)

RST:釋放連接並重置(reset)

ACK:表示前面的確認號字段(ack)是否有效。連接建立後,ACK=1。

SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1 ,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1帶SYN標誌的TCP報文段稱為同步報文段

FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即 告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標誌的TCP報 文段稱為結束報文段


好,了解完TCP首部結構中常用知識點後,讓我們以客戶端的三次握手和四次揮手為例,來具體了解建立連接和斷開連接的具體過程。

建立連接(三次握手)

技術分享

圖三:三次握手(點擊查看高清大圖)

第一步:處於close狀態的客戶端A主動打開,並對服務器B說:“我向你發送了序號為x的包(seq=x),請求建立連接(SYN=1),over”,並轉為同步已發送狀態SYN-SENT),等待B確認。


第二步:服務器B每隔一段時間就會轉為偵聽LISTEN)狀態,這時B收到來自A的請求,於是他向客戶端A說:“我同意建立連接(SYN=1),並且確認已經收到了你的包(ACK=1),並向你發送了y包(seq=y),請求你繼續給我發你下一個包(ack=x+1)“,並轉為同步收到(SYN-RCVD)狀態。


第三步:到此,AB都第一次收到了對方的包,第一次同步全部完成。

A收到B包後對B說:“我知確認你的請求了(ACK=1),並繼續向你發送序號為X+1的包(seq=x+1),請求你繼續向我發送你下一個包吧(ack=y+1)。”並轉為已建立連接(ESTABLISHED)狀態。B在收到A的包後,也轉為已建立連接(ESTABLISHED狀態。


至此,AB都進入了ESTABLISHED(已建立連接)狀態。三次握手已全部完成,AB雙方將進入數據傳送狀態。

斷開連接(四次揮手)

技術分享

圖四:四次揮手(點擊查看高清大圖)

第一步: 客戶機A對服務器B說:”我要和你斷開連接(FIN=1)“。與此同時,向B發送了一個序號為u的包,並將狀態由建立連接狀態(ESTABLISHED)轉換為終止等待1(FIN-WAIT-1)狀態


第二步: B收到A的包時,得知A要與自己單方面分手,於是先通知應用程序關閉,接著對A說:”我已經收到你的分手請求了(ACK=1),但並不代表我同意分手,請你向我發送你的下一個包(ack=u+1)“,並向A發送序號為v的包。並被迫將狀態轉為閉等待狀態(CLOSE-WAIT)


第三步: 由於B可能還有一些屬於A殘留數據沒有發送給A,所以,B還會發數據給A,這中間A將處於終止等待2狀態(FIN-WAIT-2),直到B發完。當財產分割完成以後,B對A說:”好啦,我已經接收到了你的分手請求包(ACK=1),屬於你的數據我也都還給你了,我同意和你分手(FIN=1),你可以給我發你下一個包啦(ack=u+1)“,並向A發送第w個包。並且轉為最後確認狀態( LAST-ACK)


第四步:A收到B的w包,並對B說:”我已經收到了你的分手確認(ACK=1),請你給我個回復(ack=w+1),“,並向B發送序號為u+1的包。

從圖四中我們可以看出,當服務器B收到u+1這個包時,就立即轉換為closed狀態了;而A卻沒有立即轉為closed狀態,而是轉為了時間等待狀態(TIME-WAIT),這個等待時間為2倍的MSL(最長數據傳輸時間)。所以客戶端A留出了足夠時間來接受來自B的殘留數據。

當服務器將屬於A的殘留數據全部歸還後,客戶端A最終轉換為closed關閉狀態,四次揮手結束,連接關閉成功。

淺析TCP協議與UDP協議