1. 程式人生 > >TCP、UDP協議詳解

TCP、UDP協議詳解

TCP和UDP協議是工作在傳輸層的兩個主要協議。在傳輸層主要負責:

提供建立、維護和拆除傳送連線的功能;

選擇網路層提供最合適的服務;

在系統之間提供可靠的透明的資料傳送,提供端到端的錯誤恢復和流量控制。

UDP協議

UDP協議,全稱使用者資料報協議。UDP協議是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。

這裡的無連線的意思是傳輸資訊時不需要接收方和傳送發建立連線,不可靠指的是傳送方只發送資料報,不負責接收方能完全準確的接受到傳送的資料。正因為UDP協議的控制選項較少,在資料傳輸過程中延遲小、資料傳輸效率高,適合對可靠性要求不高的應用程式,或者可以保障可靠性的應用程式,如DNS、TFTP、SNMP等。

UDP報文的構成:

報頭:

報頭由四個域組成:源埠號、目標埠號、資料報長度、校驗值;

源埠號和目標埠號主要用於指定傳送方和接收方主機發送/接受報文的埠。

資料報的長度是指包括報頭和資料部分在內的總位元組數。

UDP協議使用報頭中的校驗值來保證資料的安全。

TCP協議

傳輸控制協議TCP是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(Transport layer)通訊協議。

TCP層是位於IP層之上,應用層之下的傳輸層。不同主機的應用層之間經常需要可靠的、像管道一樣的連線,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。

應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分割成適當長度的報文段。之後TCP把結果包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個位元組一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的位元組發回一個相應的確認(ACK);如果傳送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的資料(假設丟失了)將會被重傳。TCP用一個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算和校驗。

在瞭解TCP協議具體工作之前,我們先來了解下TCP協議頭部中的幾個重要組成:

16位源埠號:16位的源埠中包含初始化通訊的埠。源埠和源IP地址的作用是標識報文的返回地址。

16位目的埠號:16位的目的埠域定義傳輸的目的。這個埠指明報文接收計算機上的應用程式地址介面。

32位序號:32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當SYN出現,序列碼實際上是初始序列碼(Initial Sequence Number,ISN),而第一個資料位元組是ISN+1。這個序列號(序列碼)可用來補償傳輸中的不一致。

32位確認序號:32位的序列號由接收端計算機使用,重組分段的報文成最初形式。如果設定了ACK控制位,這個值表示一個準備接收的包的序列碼。

4位首部長度:4位包括TCP頭大小,指示何處資料開始。

保留(6位):6位值域,這些位必須是0。為了將來定義新的用途而保留。

標誌:6位標誌域。表示為:緊急標誌、有意義的應答標誌、推、重置連線標誌、同步序列號標誌、完成傳送資料標誌。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN。

16位視窗大小:用來表示想收到的每個TCP資料段的大小。TCP的流量控制由連線的每一端通過宣告的視窗大小來提供。視窗大小為位元組數,起始於確認序號欄位指明的值,這個值是接收端正期望接收的位元組。視窗大小是一個16位元組欄位,因而視窗大小最大為65535位元組。

16位校驗和:16位TCP頭。源機器基於資料內容計算一個數值,收資訊機要與源機器數值 結果完全一樣,從而證明資料的有效性。檢驗和覆蓋了整個的TCP報文段:這是一個強制性的欄位,一定是由傳送端計算和儲存,並由接收端進行驗證的。

16位緊急指標:指向後面是優先資料的位元組,在URG標誌設定了時才有效。如果URG標誌沒有被設定,緊急域作為填充。加快處理標示為緊急的資料段。

選項:長度不定,但長度必須為1個位元組。如果沒有選項就表示這個1位元組的域等於0。

資料:該TCP協議包負載的資料。

在上述欄位中,6位標誌域的各個選項功能如下。

URG:緊急標誌。緊急標誌為"1"表明該位有效。

ACK:確認標誌。表明確認編號欄有效。大多數情況下該標誌位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有資料。

PSH:推標誌。該標誌置位時,接收端不將該資料進行佇列處理,而是儘可能快地將資料轉由應用處理。在處理Telnet或rlogin等互動模式的連線時,該標誌總是置位的。

RST:復位標誌。用於復位相應的TCP連線。

SYN:同步標誌。表明同步序列編號欄有效。該標誌僅在三次握手建立TCP連線時有效。它提示TCP連線的服務端檢查序列編號,該序列編號為TCP連線初始端(一般是客戶端)的初始序列編號。在這裡,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP連線交換的資料中每一個位元組都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個位元組的序列編號。

FIN:結束標誌。

三次握手:

TCP協議通過三個報文段完成連線的建立,這個過程稱為三次握手(three-way handshake),過程如下圖所示。

(1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。

(2)第二次握手:Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。

(3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。

四次揮手協議:

建立一個連線需要三次握手,而終止一個連線要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。

發起中斷請求的可以是客戶端也可以是服務端。

(1)第一次揮手:Client傳送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態。

(2)第二次揮手:Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

(3)第三次揮手:Server傳送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀態。

(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著傳送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。