1. 程式人生 > >計算機網路(七)--使用者資料報協議UDP和傳輸控制協議TCP概述

計算機網路(七)--使用者資料報協議UDP和傳輸控制協議TCP概述

使用者資料報協議UDP只在IP的資料報服務之上增加了很少一點的功能:複用、分用、差錯檢測。

(1)UDP是無連線的,即傳送資料之前不需要建立連線(當然,傳送資料結束時也沒有連線可釋放),因此減少了開銷和傳送資料之前的時延。

(2)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連線狀態表(這裡面有許多引數)。

(3)UDP是面向報文的。傳送方的UDP對應用程式交下來的報文,在新增首部後就向下交付IP層。UDP對應用層交下來的報文,即不合並也不拆分,而是保留這些報文的邊界。若報文太長,UDP把它交付給IP層,IP層在傳送時可能要進行分片,這會降低IP層的效率。反之,若報文太短,UDP把它交給IP層,會使IP資料報的首部的相對長度太大,這也降低了IP層的效率。

(4)UDP沒有擁塞控制,因此網路出現的擁塞不會使源主機的傳送速率降低。UDP很好適合實時應用(如IP電話、實時視訊會議等,實時應用要求源主機以恆定的速率傳送資料,並且允許在網路發生擁塞時丟失一些資料,但卻不允許資料有太大的時延)。

(5)UDP支援一對一一對多多對一和多對多的互動通訊

(6)UDP的首部開銷小,只有8位元組,比TCP的20個位元組的首部要短。

UPD的首部格式

使用者資料報UDP有兩個欄位:資料欄位和首部欄位。

首部欄位8位元組,由四個欄位組成,每個欄位的長度都是兩個位元組。

(1)源埠              源埠號。在需要對方回信時選用。不需要時可用全0。

(2)目的埠          目的埠號。這在終點交付報文時必須要使用到。

(3)長度                 UDP使用者資料報的長度,其最小值是8(僅有首部)。

(4)檢驗和              檢驗UDP使用者資料報在傳輸中是否有錯。有錯就丟棄。


當運輸層從IP層收到UDP資料報時,根據首部中的目的埠,把UDP資料報通過相應的埠,上交最後的終點---應用程序(即埠分用)。

如果接收方UDP發現收到的報文中的目的埠號不正確(即不存在對應於該埠號的應用程序),就丟棄該報文,並由網際控制報文協議ICMP傳送“埠不可達”差錯報文給傳送方。

注意:在ICMP的應用舉例中,討論traceroute時,就是讓傳送的UDP使用者資料報故意使用一個非法的UDP埠,結果ICMP就返回“埠不可達”差錯報文,從而達到了測試的目的。

UDP使用者資料報首部中檢驗和的計算方法:在資料報之前增加12位元組的偽首部。

所謂的“偽首部”就是這種偽首部即不向下傳送也不向上遞交,僅作計算檢驗和用。

UDP的檢驗和是把首部和資料部分一起都檢驗


把UDP使用者資料報連同偽首部(以及可能的填充全零位元組)一起,按二進位制反碼求這些16位字的和。再得出檢驗和寫入首部。檢驗時仍求16位字的反碼和,結果為全1時無差錯。這種簡單的差錯檢驗方法的檢錯能力並不強,但它的好處是簡單,處理起來較快。

偽首部的第3欄位是全零,第4欄位是IP首部中的協議欄位的值,對於UDP,此協議欄位值為17。

傳輸控制協議TCP

TCP是TCP/IP體系中非常複雜的一個協議。

(1)TCP是面向連線的運輸層協議。應用程式在使用TCP協議之前,必須先建立TCP連線。

(2)每一條TCP連線只能有兩個端點(endpoint),每一條TCP連線只能是點對點的(一對一)。

(3)TCP提供可靠交付的服務。通過TCP連線傳送的資料,無差錯、不丟失、不重複、並且按序到達。

(4)TCP提供全雙工通訊。TCP允許通訊雙方的應用程序在任何時候都能傳送資料

(5)面向位元組流。TCP中的"流"(stream)指的是流入到程序或從程序流出的位元組序列。“面向位元組流”的含義是:雖然應用程式和TCP的互動是一次一個資料塊(大小不等),但TCP把應用程式交下來的資料看成僅僅是一連串的無結構的位元組流。TCP不保證接收方應用程式所收到的資料塊和傳送方應用程式所發出的資料塊具有對應大小的關係(即傳送方可能傳送了10個數據塊,但接收方可能只用了4個數據塊就把資料上交了,但總資料量相同)。

TCP連線是一條虛連線(也就是邏輯連線)而不是一條真正的物理連線。TCP報文段先要傳送到IP層,加上IP首部後,再傳送到資料鏈路層。再加上資料鏈路層的首部和尾部後,才離開主機發送到物理鏈路。

TCP並不關心應用程序一次把多長的報文傳送到TCP的快取中,而是根據對方給出的視窗值和當前網路擁塞的程度來決定一個報文段應包含多少個位元組(UDP傳送的報文長度是應用程序給出的)。如果應用程序傳送到TCP快取的資料塊太長,TCP就可以把它劃分短一些再傳送。如果應用程序一次只發來一個位元組,TCP也可以等待積累有足夠多的位元組後再構成報文段傳送出去。(資料很少的時候,應該有一個等待時間(資料少)超時後傳送)

TCP把連線作為最基本的抽象

TCP連線的端點叫做套接字(socket)或插口。埠號拼接到IP地址即構成了套接字。

套接字socket = (IP地址:埠號)

每一條TCP連線唯一地被通訊兩端的兩個端點(即兩個套接字)所確定。

TCP連線 ::= { socket1,socket2 } = {(IP1:port1),(IP2 : port2)}

TCP連線就是由協議軟體所提供的一種抽象。TCP連線的端點是個很抽象的套接字,同一個IP地址可以有很多個不同的TCP連線,而同一個埠號也可以出現在多個不同的TCP連線中。

同一個名詞socket卻可表示多種不同的意思。

(1)允許應用程式訪問連網協議的應用程式設計介面API(Application Programming Interface),即運輸層和應用層之間的一種介面,稱為socketAPI,並簡稱為socket。

(2)在socketAPI中使用的一個函式名也叫作socket。

(3)呼叫socket函式的端點稱為socket,如“建立一個數據報socket”

(4)呼叫socket函式時,其返回值稱為iesocket描述符,可簡稱為socket。

(5)在作業系統核心中戀網協議的Berkeley實現,稱為socket實現。

TCP報文段的首部格式

TCP雖然是面向位元組流的,但TCP傳送的資料單元卻是報文段。TCP報文段首部的前20個位元組是固定的,後面有4n位元組是根據需要而增加的選項。


(2)序號      佔4個位元組。序號範圍是[0,2^32 - 1],序號增加到2^32 - 1後,下一個序號就又回到0。TCP是面向位元組流的。在一個TCP連線中傳送的位元組流中每一個位元組都是按順序編號。整個要傳送的位元組流的起始序號必須在連線建立是設定。首部中的序號欄位值則指的是本報文段所傳送的資料中的第一個位元組的序號

(3)確認號   佔4個位元組,是期望收到對方下一個報文段的第一個資料位元組的序號。

         若確認號 = N,則表明:到序號N - 1為止的所有資料都已正確收到。

(5)資料偏移    佔4位,指出TCP報文段的首部長度。

(6)保留   佔6位,保留為今後使用,但目前應置為0。

(7)URG(URGent)緊急       當URG=1時,表明緊急指標欄位有效。傳送應用程序就告訴傳送方的TCP有緊急資料要傳送。於是傳送方TCP就把緊急資料插入到本報文段資料的最前面,而在緊急資料後面的資料仍是普通資料。

(8)ACK(ACKnowlegment)確認     僅當ACK=1時確認號欄位才有效。當ACK=0時,確認號無效。TCP規定,在連線建立後所有傳送的報文段都必須把ACK置1。

(9)PSH(PuSH)推送   當兩個應用程序進行互動式的通訊時,有時在一端的應用程序希望在鍵入一個命令後立即就能夠收到對方的響應。在這種情況下,TCP就可以使用推送(push)操作。這時,傳送方TCP把PSH置1,並立即建立一個報文段傳送出去。接收方TCP收到PSH=1的報文段,就儘快地(即“推送”向前)交付接收應用程序,而不再等到整個快取都填滿了後面再向上交付。

(10)RST(ReSeT)復位     當RST=1時,表明TCP連線中出現嚴重差錯(如由於主機崩潰或其它原因),必須釋放連線,然後在重新建立運輸連線。RST置1還用來拒絕一個非法的報文段或拒絕開啟一個連線。RST也可稱為重建位或重置位。

(11)SYN(SYNchronization)同步    在連線建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線請求報文段。對方若同意建立連線,則應在響應的報文段中使SYN=1和ACK=1。因此,SYN置為1就表示這是一個連線請求或連線接受報文。

(12)FIN(FINis)終止    用來釋放一個連線。當FIN=1時,表明此報文段的傳送方的資料已傳送完畢,並要求釋放運輸連線。

(13)視窗    佔2位元組。視窗值是[0,2^16 - 1]之間的整數。視窗指的是傳送本報文段的一方的接收視窗(而不是自己的傳送視窗)。

視窗值告訴對方:從本報文段首部中的確認號算起,接收方目前允許對方傳送的資料量。之所以要有這個限制,是因為接收方的資料快取空間是有限的。總之,視窗值作為接收方放傳送方設定其傳送視窗的依據。

視窗欄位明確指出了現在允許對方傳送的資料量。視窗值是經常在動態變化的。

(14)檢驗和   佔2位元組。檢驗和欄位檢驗的範圍包括首部和資料這兩部分。檢驗方法和UDP一樣。

(15)緊急指標  佔2位元組。指出本報文段中的緊急資料的位元組數(緊急資料結束後就是普通資料)。因此,緊急指標指出了緊急資料的末尾在報文段中的位置。值得注意的是,即使視窗為零時也可以傳送緊急資料

(16)選項   長度可變,最長可達40位元組。

最大報文段長度MSS(Maximum Segment Size)選項、視窗擴大選項、時間戳選項、選擇確認選項。

          MSS是每一個TCP報文段中的資料欄位的最大長度。資料欄位加上TCP首部才等於整個的TCP報文段。

問題:為什麼要規定最大報文段長度MSS?是考慮接收方的接收快取可能放不下TCP報文段中的資料?

解答:實際上,MSS與接收視窗值沒有關係。TCP報文段的資料部分至少要加上40位元組的首部(TCP首部20位元組和IP首部20位元組)才能組裝成一個IP資料報。所以MSS過小導致網路的利用率很低,MSS過大導致在IP層運輸時要分解成多個短資料報片。這樣使兩邊的開銷增大。

因為IP資料報所經歷的路徑是動態變化的,所以最佳的MSS是很難確定的。在連線建立的過程中,雙方都把自己能夠支援的MSS寫入這一欄位,以後就按照這個數值傳送資料,兩個傳送方向可以有不同的MSS值。若主機未填寫,MSS的預設值是536位元組長。因此,所有在因特網上的主機都應能接受的報文段長度(這裡指TCP報文)是536+20(固定首部長度)=556位元組。

           視窗擴大選項是為了擴大視窗。TCP首部中視窗欄位的長度是16位,因此最大的視窗大小為64位元組。對早期的網路是足夠用的,但對於包含衛星通道的網路,傳播時延和頻寬都很大,要獲得高吞吐率需要更大的視窗大小。

視窗苦大選項佔3位元組,其中有一個位元組表示移位值S。新的視窗值等於TCP首部中的視窗位數從16增大到(16+S)。移位值允許使用的最大值是14,相當於視窗最大值增大到2^(16+14) - 1 = 2^30 - 1。

視窗擴大選項可以在雙方初始化建立TCP連線時進行協商。如果連線的某一端實現了視窗擴大,當它不再需要擴大其視窗時,可傳送S=0的選項,使視窗大小回到16。

           時間戳選項佔10位元組,其中最主要的欄位時間戳值欄位(4位元組)和時間戳回送回答欄位(4位元組)。時間戳選項有以下兩個功能:

第一,用來計算往返時間RTT。傳送方在傳送報文段時把當前時鐘的時間值放入時間戳欄位,接收方在確認該報文段時把時間戳欄位值複製到時間戳回送回答欄位。因此,傳送方在收到確認該報文段時把時間戳欄位值複製到時間戳回送回答欄位。因此,傳送方在收到確認報文後,可以準確地計算出RTT來。

第二,用來處理TCP序號超過2^32的情況,這又稱為防止序號繞回PAWS(Protect Against Wrapped Sequence numbers)。當使用高速網路時,在一次TCP連線的資料傳送中序號很可能會被重複使用,為了使接收方能夠把新的報文段和遲到很久的報文段區分開,可以在報文段中加上這種時間戳。

           選擇確認選項,將在之後詳細介紹。