計算機網絡筆記5-運輸層

第5章 運輸層

主要內容

  1. 介紹運輸層協議的特點

  2. 進程之間的通信和端口等重要概念

  3. 講述比較簡單的UDP協議

  4. 討論較爲複雜但非常重要的TCP協議

4.1. 可靠傳輸的工作原理,包括停止等待協議和ARQ協議.

4.2. 講述TCP報文段的首部格式

4.3. 討論TCP的三個重要問題: 滑動窗口,流量控制 和 擁塞控制機制.

4.4. 介紹TCP的連接管理.

運輸層 是整個網絡體系結構中的關鍵層次之一

  1. 運輸層爲相互通信的應用進程提供邏輯通信.

  2. 端口和套接字的意義.

  3. 無連接的UDP的特點.

  4. 面向連接的TCP的特點.

  5. 在不可靠的網絡上實現可靠傳輸的工作原理,停止等待協議和ARQ協議.

  6. TCP的滑動窗口,流量控制,擁塞控制和連接管理.

運輸層協議概述

進程之間的通信

從通信和信息處理的角度看,運輸層向它上面的應用層提供通信服務,它屬於面向通信部分的最高層,同時也是用戶功能中的最低層.

當網絡的邊緣部分中的兩臺主機使用網絡的核心部分的功能進行端到端的通信時,只有主機的協議棧纔有運輸層,而網絡核心部分中的路由器在轉發分組時都只用到下三層的功能.

通信的真正端點並不是主機而是主機中的進程.

端到端的通信 是應用進程之間的通信.

一臺主機中經常有 多個應用進程 同時分別和 另一臺主機中的多個應用進程 通信.

這表明運輸層有一個很重要的功能——複用 (multiplexing)和分用 (demultiplexing).

  • 複用: 指在發送方不同的應用進程都可以使用同一個運輸層協議傳送數據(當然需要加上適當的首部)

  • 分用: 指接收方的運輸層在剝去報文的首部後能夠把這些數據正確交付目的應用進程

邏輯通信

運輸層提供應用進程間的邏輯通信.

從應用層來看,只要把應用層報文交給下面的運輸層,運輸層就可以把這報文傳送到對方的運輸層(哪怕雙方相距很遠,例如幾千公里),好像這種通信就是沿水平方向直接傳送數據.

但事實上這兩個運輸層之間並沒有一條水平方向的物理連接.數據的傳送是經過多個層次傳送的.

網絡層爲主機之間提供邏輯通信,而運輸層爲應用進程之間提供端到端的邏輯通信.

運輸層還要對收到的報文進行差錯檢測.

在網絡層,IP數據報首部中的檢驗和字段,只檢驗首部是否出現差錯而不檢查數據部分.

根據應用程序的不同需求,運輸層需要有兩種不同的運輸協議,即面向連接的TCP 和無連接的UDP

運輸層向高層用戶屏蔽了下面網絡核心的細節 (如網絡拓撲,所採用的路由選擇協議等),它使應用進程看見的就是好像在兩個運輸層實體之間有一條端到端的邏輯通信信道,但這條邏輯通信信道對上層的表現卻因運輸層使用的不同協議而有很大的差別.

當運輸層採用面向連接的TCP協議時,儘管下面的網絡是不可靠的 (只提供盡最大努力服務),但這種邏輯通信信道就相當於一條全雙工的可靠信道.

但當運輸層採用無連接的UDP協議時,這種邏輯通信信道仍然是一條不可靠信道.

運輸層的兩個主要協議

TCP/IP運輸層的兩個主要協議都是互聯網的正式標準,即:

  1. 用戶數據報協議 UDP(User Datagram Protocol)

  2. 傳輸控制協議 TCP(Transmission Control Protocol)

TCP和UDP

兩個對等運輸實體在通信時傳送的數據單位叫做運輸協議數據單元TPDU(Transport Protocol Data Unit).

但在TCP/IP體系中,則根據所使用的協議是TCP或UDP,分別稱之爲TCP報文段 (segment)UDP用戶數據報.

UDP在傳送數據之前不需要先建立連接.

遠地主機的運輸層在收到UDP報文後,不需要給出任何確認.

雖然UDP不提供可靠交付,但在某些情況下UDP卻是一種最有效的工作方式.

TCP則提供面向連接的服務.

在傳送數據之前必須先建立連接,數據傳送結束後要釋放連接.

TCP不提供廣播或多播服務.由於TCP要提供可靠的,面向連接的運輸服務,因此不可避免地增加了許多的開銷,如確認,流量控制,計時器以及連接管理等.

這不僅使協議數據單元的首部增大很多,還要佔用許多的處理機資源.

使用UDP和TCP協議的各種應用和應用層協議

應用      應用層協議     運輸層協議  
名字轉換     DNS(域名系統)     UDP  
文件傳送     TFTP(簡單文件傳送協議)     UDP  
路由選擇協議     RIP(路由信息協議)     UDP  
IP地址配置     DHCP(動態主機配置協議)     UDP  
網絡管理     SNMP(簡單網絡管理協議)     UDP  
遠程文件服務器     NFS(網絡文件系統)     UDP  
IP電話     專用協議     UDP  
流式多媒體通信     專用協議     UDP  
多播     IGMP(網際組管理協議)     UDP  
電子郵件     SMTP(簡單郵件傳送協議)     TCP  
遠程終端接入     TELNET(遠程終端協議)     TCP  
萬維網     HTTP(超文本傳送協議)     TCP  
文件傳送     FTP(文件傳送協議)     TCP

運輸層的端口

應用層所有的應用進程都可以通過運輸層再傳送到IP層(網絡層),這就是複用.

運輸層從IP層收到發送給各應用進程的數據後,必須分別交付指明的各應用進程,這就是分用.

雖然通信的終點是應用進程,但只要把所傳送的報文交到目的主機的某個合適的目的端口,剩下的工作(即最後交付目的進程)就由TCP或UDP來完成.

UDP和TCP的首部格式中,都有源端口 和目的端口 這兩個重要字段.

當運輸層收到IP層交上來的運輸層報文時,就能夠根據其首部中的目的端口號把數據交付應用層的目的應用進程.

TCP/IP的運輸層用一個16位端口號 來標誌一個端口.

它只是爲了標誌本計算機 應用層中的各個進程在和運輸層交互時的層間接口.

16位的端口號可允許有65535個不同的端口號

這個數目對一個計算機來說是足夠用的.

兩個計算機中的進程要互相通信,不僅必須知道對方的IP地址(爲了找到對方的計算機),而且要知道對方的端口號(爲了找到對方計算機中的應用進程).

(1)服務器端使用的端口號 這裏又分爲兩類,最重要的一類叫做熟知端口號 (well-known port number)或系統端口號,數值爲0~1023.

IANA把這些端口號指派給了TCP/IP最重要的一些應用程序,讓所有的用戶都知道.當一種新的應用程序出現後,IANA必須爲它指派一個熟知端口,否則互聯網上的其他應用進程就無法和它進行通信.

另一類叫做登記端口 號,數值爲1024~49151.這類端口號是爲沒有熟知端口號的應用程序使用的.使用這類端口號必須在IANA按照規定的手續登記,以防止重複.

(2)客戶端使用的端口號 數值爲49152~65535.由於這類端口號僅在客戶進程運行時才動態選擇,因此又叫做短暫端口號

(3)這類端口號留給客戶進程選擇暫時使用.當服務器進程收到客戶進程的報文時,就知道了客戶進程所使用的端口號,因而可以把數據發送給客戶進程.通信結束後,剛纔已使用過的客戶端口號就不復存在,這個端口號就可以供其他客戶進程使用.

用戶數據報協議UDP

UDP概述

用戶數據報協議UDP只在IP的數據報服務之上增加了很少一點的功能,這就是複用和分用的功能以及差錯檢測的功能.

UDP的主要特點是:

(1)UDP是無連接的,即發送數據之前不需要建立連接(當然,發送數據結束時也沒有連接可釋放),因此減少了開銷和發送數據之前的時延.

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

(3)UDP是面向報文的.發送方的UDP對應用程序交下來的報文,在添加首部後就向下交付IP層.UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界.這就是說,應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文.在接收方的UDP,對IP層交上來的UDP用戶數據報,在去除首部後就原封不動地交付上層的應用進程.也就是說,UDP一次交付一個完整的報文.因此,應用程序必須選擇合適大小的報文.若報文太長,UDP把它交給IP層後,IP層在傳送時可能要進行分片,這會降低IP層的效率.反之,若報文太短,UDP把它交給IP層後,會使IP數據報的首部的相對長度太大,這也降低了IP層的效率.

(4)UDP沒有擁塞控制,因此網絡出現的擁塞不會使源主機的發送速率降低.這對某些實時應用是很重要的.很多的實時應用(如IP電話,實時視頻會議等)要求源主機以恆定的速率發送數據,並且允許在網絡發生擁塞時丟失一些數據,但卻不允許數據有太大的時延.UDP正好適合這種要求.

(5)UDP支持一對一,一對多,多對一和多對多的交互通信.

(6)UDP的首部開銷小,只有8個字節,比TCP的20個字節的首部要短.

雖然某些實時應用需要使用沒有擁塞控制的UDP,但當很多的源主機同時都向網絡發送高速率的實時視頻流時,網絡就有可能發生擁塞,結果大家都無法正常接收.因此,不使用擁塞控制功能的UDP有可能會引起網絡產生嚴重的擁塞問題.

還有一些使用UDP的實時應用,需要對UDP的不可靠的傳輸進行適當的改進,以減少數據的丟失.在這種情況下,應用進程本身可以在不影響應用的實時性的前提下,增加一些提高可靠性的措施,如採用前向糾錯或重傳已丟失的報文.

UDP的首部格式

用戶數據報UDP有兩個字段:數據字段和首部字段.首部字段很簡單,只有8個字節

由四個字段組成,每個字段的長度都是兩個字節.各字段意義如下:

(1)源端口 源端口號.在需要對方回信時選用.不需要時可用全0.

(2)目的端口 目的端口號.這在終點交付報文時必須使用.

(3)長度 UDP用戶數據報的長度,其最小值是8(僅有首部).

(4)檢驗和 檢測UDP用戶數據報在傳輸中是否有錯.有錯就丟棄.

當運輸層從IP層收到UDP數據報時,就根據首部中的目的端口,把UDP數據報通過相應的端口,上交最後的終點——應用進程.

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

傳輸控制協議TCP概述

TCP最主要的特點

  1. TCP是面向連接的運輸層協議.應用程序在使用TCP協議之前,必須先建立TCP連接.在傳送數據完畢後,必須釋放已經建立的TCP連接.

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

  3. TCP提供可靠交付 的服務.通過TCP連接傳送的數據,無差錯,不丟失,不重複,並且按序到達.

  4. TCP提供全雙工通信.TCP允許通信雙方的應用進程在任何時候都能發送數據.TCP連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的數據.在發送時,應用程序在把數據傳送給TCP的緩存後,就可以做自己的事,而TCP在合適的時候把數據發送出去.在接收時,TCP把收到的數據放入緩存,上層的應用進程在合適的時候讀取緩存中的數據.

  5. 面向字節流.TCP中的"流"(stream)指的是流入到進程或從進程流出的字節序列.

面向字節流

雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序交下來的數據僅僅看成是一連串的無結構的字節流.

TCP並不知道所傳送的字節流的含義.TCP不保證接收方應用程序所收到的數據塊和發送方應用程序所發出的數據塊具有對應大小的關係.

(例如,發送方應用程序交給發送方的TCP共10個數據塊,但接收方的TCP可能只用了4個數據塊就把收到的字節流交付上層的應用程序).

但接收方應用程序收到的字節流必須和發送方應用程序發出的字節流完全一樣.

當然,接收方的應用程序必須有能力識別收到的字節流,把它還原成有意義的應用層數據.

TCP連接是一條虛連接(也就是邏輯連接),而不是一條真正的物理連接.

TCP報文段先要傳送到IP層,加上IP首部後,再傳送到數據鏈路層.再加上數據鏈路層的首部和尾部後,才離開主機發送到物理鏈路.

TCP和UDP在發送報文時所採用的方式完全不同.TCP並不關心應用進程一次把多長的報文發送到TCP的緩存中,而是根據對方給出的窗口值和當前網絡擁塞的程度來決定一個報文段應包含多少個字節(UDP發送的報文長度是應用進程給出的).

如果應用進程傳送到TCP緩存的數據塊太長,TCP就可以把它劃分短一些再傳送.

如果應用進程一次只發來一個字節,TCP也可以等待積累有足夠多的字節後再構成報文段發送出去.

TCP的連接

TCP把連接 作爲最基本的抽象.

TCP的許多特性都與TCP是面向連接的這個基本特性有關.

每一條TCP連接有兩個端點.那麼,TCP連接的端點是什麼呢?不是主機,不是主機的IP地址,不是應用進程,也不是運輸層的協議端口.

TCP連接的端點叫做套接字(socket)或插口.

IP地址 + 端口號 即構成了套接字.

套接字的表示方法是在點分十進制的IP地址後面寫上端口號,中間用冒號或逗號隔開.

例如,若IP地址是192.3.4.5而端口號是80,那麼得到的套接字就是(192.3.4.5:80).

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

即:

IP1 和 IP2 分別是兩個端點主機的IP地址,而 port1 和 port2 分別是兩個端點主機中的端口號.

TCP連接的兩個套接字就是 socket1 和 socket2.

TCP連接的端點是個很抽象的套接字,即(IP地址 : 端口號).

同一個IP地址可以有多個不同的TCP連接,而同一個端口號也可以出現在多個不同的TCP連接中.

socket的多種含義

隨着互聯網的不斷髮展以及網絡技術的進步,同一個名詞socket卻可表示多種不同的意思.例如:

  1. 允許應用程序訪問連網協議的應用編程接口API (Application Programming Interface),即運輸層和應用層之間的一種接口,稱爲socket API,並簡稱爲socket.

  2. 在socket API中使用的一個函數名 也叫做socket.

  3. 調用socket函數的端點 稱爲socket,如"創建一個數據報socket.

  4. 調用socket函數時,其返回值 稱爲socket描述符,可簡稱爲socket.

  5. 在操作系統內核中連網協議的Berkeley實現,稱爲socket實現.

可靠傳輸的工作原理

TCP發送的報文段是交給IP層傳送的.但IP層只能提供盡最大努力服務,也就是說,TCP下面的網絡所提供的是不可靠的傳輸.因此,TCP必須採用適當的措施才能使得兩個運輸層之間的通信變得可靠.

理想的傳輸條件有以下兩個特點:

  1. 傳輸信道不產生差錯.

  2. 不管發送方以多快的速度發送數據,接收方總是來得及處理收到的數據.

在這樣的理想傳輸條件下,不需要採取任何措施就能夠實現可靠傳輸.

然而實際的網絡都不具備以上兩個理想條件.

但我們可以使用一些可靠傳輸協議,當出現差錯時讓發送方重傳出現差錯的數據,同時在接收方來不及處理收到的數據時,及時告訴發送方適當降低發送數據的速度.

這樣一來,本來不可靠的傳輸信道就能夠實現可靠傳輸了.

停止等待協議

全雙工通信的雙方既是發送方也是接收方.

"停止等待"就是每發送完一個分組就停止發送,等待對方的確認.在收到確認後再發送下一個分組.

1.無差錯情況

A發送分組M1,發完就暫停發送,等待B的確認.B收到了M1 就向A發送確認.A在收到了對M1 的確認後,就再發送下一個分組M2.同樣,在收到B對M2 的確認後,再發送M3.

2.出現差錯

可靠傳輸協議是這樣設計的:A只要超過了一段時間仍然沒有收到確認,就認爲剛纔發送的分組丟失了,因而重傳前面發送過的分組.這就叫做超時重傳.

要實現超時重傳,就要在每發送完一個分組時設置一個超時計時器.如果在超時計時器到期之前收到了對方的確認,就撤銷已設置的超時計時器.

這裏應注意以下三點.

第一,A在發送完一個分組後,必須暫時保留已發送的分組的副本 (在發生超時重傳時使用).只有在收到相應的確認後才能清除暫時保留的分組副本.

第二,分組和確認分組都必須進行編號.這樣才能明確是哪一個發送出去的分組收到了確認,而哪一個分組還沒有收到確認.

第三,超時計時器設置的重傳時間應當比數據在分組傳輸的平均往返時間更長一些.

3.確認丟失和確認遲到

B所發送的對M1 的確認丟失了.A在設定的超時重傳時間內沒有收到確認,並無法知道是自己發送的分組出錯,丟失,或者是B發送的確認丟失了.

因此A在超時計時器到期後就要重傳M1.

現在應注意B的動作.假定B又收到了重傳的分組M1.這時應採取兩個行動.

第一,丟棄這個重複的分組 M1,不向上層交付.

第二,向A發送確認.不能認爲已經發送過確認就不再發送,因爲A之所以重傳M1 就表示A沒有收到對M1 的確認.

也是一種可能出現的情況.傳輸過程中沒有出現差錯,但B對分組M1 的確認遲到了.A會收到重複的確認.對重複的確認的處理很簡單:收下後就丟棄.B仍然會收到重複的M1,並且同樣要丟棄重複的M1,並重傳確認分組.

通常A最終總是可以收到對所有發出的分組的確認.如果A不斷重傳分組但總是收不到確認,就說明通信線路太差,不能進行通信.

使用上述的 確認 和 重傳機制,我們就可以在不可靠的傳輸網絡上實現可靠的通信.

像上述的這種可靠傳輸協議常稱爲 自動重傳請求 ARQ(Automatic Repeat reQuest).意思是重傳的請求是自動進行的.接收方不需要請求發送方重傳某個出錯的分組.

信道利用率

停止等待協議的優點是簡單,但缺點是信道利用率太低.

爲了提高傳輸效率,發送方可以不使用低效率的停止等待協議,而是採用流水線傳輸.

流水線傳輸就是發送方可連續發送多個分組,不必每發完一個分組就停頓下來等待對方的確認.

這樣可使信道上一直有數據不間斷地在傳送.顯然,這種傳輸方式可以獲得很高的信道利用率.

連續ARQ協議

滑動窗口協議比較複雜,是TCP協議的精髓所在.

這裏先給出連續ARQ協議最基本的概念,但不涉及許多細節問題.詳細的滑動窗口協議將在後面討論.

表示發送方維持的發送窗口,它的意義是:位於發送窗口內的5個分組都可連續發送出去,而不需要等待對方的確認.這樣,信道利用率就提高了.

分組發送是按照分組序號從小到大發送的.

連續ARQ協議規定,發送方每收到一個確認,就把發送窗口向前滑動一個分組的位置.

接收方一般都是採用累積確認 的方式.這就是說,接收方不必對收到的分組逐個發送確認,而是在收到幾個分組後,對按序到達的最後一個分組發送確認,這就表示:到這個分組爲止的所有分組都已正確收到了.

累積確認有優點也有缺點.優點是:容易實現,即使確認丟失也不必重傳.但缺點是不能向發送方反映出接收方已經正確收到的所有分組的信息.

TCP報文段的首部格式

TCP雖然是面向字節流的,但TCP傳送的數據單元卻是報文段.

一個TCP報文段分爲首部和數據兩部分,而TCP的全部功能都體現在它首部中各字段的作用.

因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理.

TCP報文段首部的前20個字節是固定的,後面有4n 字節是根據需要而增加的選項(n 是整數).因此TCP首部的最小長度是20字節.

TCP的連接釋放

數據傳輸結束後,通信的雙方都可釋放連接.

現在A和B都處於ESTABLISHED狀態

A的應用進程先向其TCP發出連接釋放報文段,並停止再發送數據,主動關閉TCP連接.

A把連接釋放報文段首部的終止控制位FIN置1,其序號seq=u,它等於前面已傳送過的數據的最後一個字節的序號加1.

這時A進入FIN-WAIT-1(終止等待1)狀態,等待B的確認.

請注意,TCP規定,FIN報文段即使不攜帶數據,它也消耗掉一個序號.

B收到連接釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於B前面已傳送過的數據的最後一個字節的序號加1.

然後B就進入CLOSE-WAIT(關閉等待)狀態.

TCP服務器進程這時應通知高層應用進程,因而從A到B這個方向的連接就釋放了,這時的TCP連接處於半關閉 (half-close)狀態,即A已經沒有數據要發送了,但B若發送數據,A仍要接收.

也就是說,從B到A這個方向的連接並未關閉,這個狀態可能會持續一段時間.

A收到來自B的確認後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段.

若B已經沒有要向A發送的數據,其應用進程就通知TCP釋放連接.

這時B發出的連接釋放報文段必須使FIN=1.

現假定B的序號爲w(在半關閉狀態B可能又發送了一些數據).B還必須重複上次已發送過的確認號ack=u+1.這時B就進入LAST-ACK(最後確認)狀態,等待A的確認.

A在收到B的連接釋放報文段後,必須對此發出確認.在確認報文段中把ACK置1,確認號ack=w+1,而自己的序號是seq=u+1(根據TCP標準,前面發送過的FIN報文段要消耗一個序號).

然後進入到TIME-WAIT(時間等待)狀態.

請注意,現在TCP連接還沒有釋放掉.必須經過時間等待計時器 (TIME-WAIT timer)設置的時間2MSL後,A才進入到CLOSED狀態.

時間MSL叫做最長報文段壽命.

因此,從A進入到TIME-WAIT狀態後,要經過4分鐘才能進入到CLOSED狀態,才能開始建立下一個新的連接.

當A撤銷相應的傳輸控制塊TCB後,就結束了這次的TCP連接.

因此,從A進入到TIME-WAIT狀態後,要經過4分鐘才能進入到CLOSED狀態,才能開始建立下一個新的連接.

當A撤銷相應的傳輸控制塊TCB後,就結束了這次的TCP連接.

TCP的有限狀態機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章