TCP/IP運輸層的兩個主要協議分別是TCP(傳輸控制協議)與UDP(用戶數據報協議)。傳送的數據單位分別叫“TCP報文段”或“UDP用戶數據報”。
UDP(用戶數據報協議)
主要特點:
1)無連接的,發送數據之前不需要連接,減少了開銷。
2)盡最大努力交付。即不保證可靠交付。
3)面向報文。發送方的UDP對應用程序交下來的報文,在添加首部后就向下交付IP層。同樣的,IP層交上來的UDP用戶數據報,去除首部后就原封不動的交付上面的應用進程。也就是說,一次交付一個完整的報文。
4)沒有擁塞控制。因此網絡擁塞不會使主機發送速率降低。但是可能會丟失一些數據。
5)支持一對一,一對多,多對一和多對多的交互通信。
6)UDP首部開銷小,只有8個字節,比TCP的20個字節的首部要短。
UDP的首部格式:
用戶數據報UDP有兩個字段:數據字段和首部字段。首部字段很簡單只有8個字節,由四個字段組成,每個字段的長度都是2個字節。意義如下:
- 源端口:需要對方回信時選用,不需要時可用全0.
- 目的端口:交付報文時需要。
- 長度:用戶數據報的長度,最小值為8(僅有首部)。
- 檢驗和:檢測UDP用戶數據報在傳輸中是否有錯。有錯就丟棄。
TCP(傳輸控制協議)
TCP較復雜,因此先對TCP協議作一般的介紹,再逐步深入討論TCP的可靠傳輸、流量控制和擁塞控制等問題。
TCP最主要的特點:
- 面向連接的運輸層協議。這就是說,應用程序在使用TCP協議之前,必須先建立TCP連接。在傳送數據完畢后,必須釋放已經建立的TCP連接。也就是說,應用進程之間的通信好像在“打電話”,通話之前要先撥號建立連接,通話結束后要掛機釋放連接。
- 每一條TCP只能有兩個端點。每一條TCP連接只能是點對點的(一對一)。
- TCP提供可靠交付。通過TCP連接傳送的數據,無差錯、不丟失不重復,并且按序到達。
- TCP提供全雙工通信(全雙工通信:即通信的雙方可以同時發送和接收信息的信息交互方式。半雙工通信:即通信的雙方都可以發送和接受信息,但同一時刻只能有一個方向。)。
- 面向字節流。TCP中的“流”指的是流入到進程或從進程流出的字節序列。發送方要先把數據轉化為字節流寫入發送緩存進行發送,且接收方必須有能力識別字節流。
TCP的連接
TCP把連接作為最基本的抽象。TCP的許多特性都與TCP是面向連接的這個基本特性有關。
每一條TCP有兩個端點。我們稱之為套接字或端口(socket)。它并不是端口,也不是主機的IP地址,也不是應用進程。根據定義,端口號拼接到IP地址構成了套接字。因此,套接字的表示方法是在點分十進制的IP地址后面加上端口號,中間用冒號或逗號隔開。
例:192.3.4.5:80。
每一條TCP連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定。
可靠傳輸的工作原理:
TCP發送的報文段是交給IP層傳送的,而IP層只能提供盡最大努力服務,也就是說,TCP下面的網絡鎖提供的是不可靠的傳輸。因此,TCP必須采用適當的措施才能使得兩個運輸層之間的通信變得可靠。
停止等待:每發送完一個分組就停止發送等待對方的確認。在收到確認后在發送下一個分組。
傳遞過程:
1)無差錯情況
停止等待協議可用下圖說明。(a)代表無差錯情況。A發送分組M1,發完就暫停發送,等待B確認。B收到M1就向A發送確認。A收到對M1的確認后,再發送下一個分組M2。
2) 出現差錯
B接受M1時檢測出了差錯,就丟棄M1,其他什么也不做(不通知A有差錯的分組)。B不會發送任何信息。可靠傳輸協議是這樣設計的:A只要超過了一段時間任然沒有收到確認,就認為剛才發送的分組丟失了,因而重傳前面發送過的分組。這就叫超時重傳。要實現超時重傳,就要在每發送完一個分組時設置一個超時計時器。若收到,取消超時計時器的設置。
注意以下三點:
- 第一,A在發送完一個分組后,必須暫時保留已發送分組的副本。只有在收到相應的確認后才能清除暫時保留的分組副本。
- 第二,分組和確認分組都必須進行編號。這樣才能明確是哪一個發送出去的分組收到了確認,而哪一個分組還沒有收到確認。
-
第三,超時計時器設置的重傳時間應當比數據在分組傳輸的平均往返時間更長一些。
image.png
3)確認丟失和確認遲到
下圖(a)說明,B發送的對M1的確認丟失了。A在設定的超時重傳時間內沒有收到確認,并無法知道自己發送的分組出錯,丟失,或者是B發送的確認丟失了。因此A在超時計時器到期后就要重傳M1。假定B又收到了M1,這時應采取兩個行動:
1)丟棄這個重復的分組M1,不向上層交付。
2)向A發送確認。A收到了B收到的確認消息后,將繼續傳送M2。
圖b也是一種可能出現的情況,傳輸過程中沒有出現差錯,但B對分組M1的確認遲到了。A會收到重復的確認。對重復的確認處理很簡單:收下后就丟棄。
使用上述方法就可以在不可靠的傳輸網絡上實現可靠的通信。
TCP報文段的首部格式
TCP的傳送數據單元是報文段。分為首部和數據兩部分,而TCP全部功能都體現在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。
首部格式:
前20個字節是固定的,后面有4n字節是根據需要而增加的選項(n為int)。因此TCP首部最小長度是20字節。
TCP的控制位:
1)URG:URG=1時,表示此報文段有緊急數據,應盡快傳送(優先級高),而非排隊順序傳送。
2)ACK:ACK=1時有效,ACK=0時無效。TCP規定,連接建立后所有傳送的報文段都必須把ACK置1。
3)PSH:推送。兩個應用進程交互式通信時,有時在一端的應用進程希望在鍵入一個命令后立即就能夠收到對方的響應。在這種情況下,TCP就可以使用推送操作,PSH=1。立即創建一個報文段發送出去。
4)RST:復位。RST=1時表示TCP連接中出現嚴重差錯,必須釋放連接,然后再重新建立連接。
5)SYN:在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是個連接請求報文段。對方若同意建立連接,則應在響應的報文段中使SYN和ACK置1。
6)FIN:用來釋放一個連接。當FIN=1時,表明此報文段的發送方得數據已發送完畢,并要求釋放運輸連接。
UDP與TCP的區別
- UDP在傳送數據之前不需要先建立連接。遠地主機運輸層在收到UDP報文后,不需要給出任何確認。因此UDP不提供可靠交付,但是效率高。TCP則提供面向連接的服務。在傳送數據之前必須先建立連接,數據傳送結束后要釋放連接。TCP要提供可靠的、面向連接的運輸服務,因此不可避免地增加了許多的開銷,如確認、流量控制等。
- TCP和UDP在發送報文時所采用的方式完全不同。TCP并不關心進程一次把多長的報文發送到TCP的緩存中,而是根據對方給出的窗口值和當前網絡擁塞程度決定一個報文段包含多少字節,而UDP發送報文長度是應用進程給出的。如果應用進程傳送到TCP緩存的數據塊太長,TCP就劃分短一些再傳送。若過短也可以等待積累足夠多的字節后再構成報文段發送出去。
- UDP程序結構比較簡單。它的首部最少為8字節而TCP最少為20字節。
- UDP不保證數據的順序結構,而TCP必須保證數據的順序結構。
- TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的,UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)。