1. 程式人生 > >讀書筆記之《計算機網路》---第五章 運輸層

讀書筆記之《計算機網路》---第五章 運輸層

本章目錄

  1. 運輸層協議概述
  2. 使用者資料報協議UDP
  3. 傳輸控制協議TCP概述
  4. 可靠傳輸的工作原理
  5. TCP報文段首部格式
  6. TCP可靠傳輸的實現
  7. TCP流量控制
  8. TCP擁塞控制
  9. TCP的運輸連線管理

運輸層協議概述
兩個主機進行通訊其實就是兩個主機中的應用程序互相通訊
運輸層的兩種不同的運輸協議,面向連線的TCP和無連線的UDP
兩個對等運輸實體在通訊時傳送的資料單位叫做運輸協議資料單元,根據TCP或UDP分別稱為TCP報文段和UDP使用者資料報
這裡寫圖片描述

在運輸層使用協議埠號,簡稱埠,解決程序通訊複用和分用問題
埠號只具有本地意義
服務端使用的埠號分為兩類:

  1. 熟知埠號或系統埠號:0~1023
  2. 登記埠號:1024~49161

使用者資料報協議UDP
UDP的主要特點:

  1. UDP是無連線到
  2. UDP使用盡最大努力交付
  3. UDP是面向報文的:應用層交給UDP多長的報文,UDP就照樣傳送,不拆分,也不合並
    UDP沒有擁塞控制
    UDP支援一對一、一對多、多對一和多對多的互動通訊
    UDP的首部開銷小

UDP的首部格式如下圖:
這裡寫圖片描述
源埠:源埠號
目的埠:目的的埠號
長度:UDP使用者資料報的長度,最小值是8(僅首部)
檢驗和:檢測UDP使用者資料報再傳輸中是否有錯
偽首部:在計算校驗和時臨時加上,不是真正的UDP首部,傳送UDP資料報時會去掉
UDP的檢驗和是首部和資料部分一起檢驗

UDP計算檢驗和的方法與IP資料報的檢驗類似,IP資料報的檢驗和只檢驗首部,而UDP的檢驗和把首部和資料部分一起檢驗。
檢驗方法

:在傳送方首先把全零放入檢驗和欄位,再把偽首部以及UDP使用者資料報看成許多16位的字串接起來,若UDP的使用者資料包的資料部分不是偶數個位元組,則要填入一個全零的位元組(但這個位元組不會被髮送),然後按照二進位制反碼計算出這些16位字的和,將此和的二進位制反碼寫入檢驗和欄位。在接收方把UDP使用者資料報連同偽首部一起,按照二進位制反碼求這些16位字的和,當無差錯是,其借工應全為1。如下圖所示:
這裡寫圖片描述

傳輸控制協議TCP概述
TCP最重要的特點:

  1. TCP是面向連線的運輸層協議
  2. 每一條TCP只能有兩個端點
  3. TCP提供可靠交付服務
  4. TCP提供全雙工通訊
  5. 面向位元組流

這裡寫圖片描述
上圖指出,TCP和UDP在傳送報文時採用的方式完全不同,TCP對應用程序一次把多長的報文傳送到TCP快取是不關心的,TCP根據對方給的視窗之和當前網路的擁塞程度來決定一個報文應包含的位元組數,而UDP傳送的報文長度是應用程序給出的。如果傳到TCP快取的資料塊太長,TCP就可以把它劃分短一些在傳送,若果太短,TCP也可以等待累積足夠多的位元組後再構成報文段傳送。

每一條TCP連線有兩個端點,TCP端點叫做套接字或插口
套接字socket=(IP地址:埠號)
同一名字socket表示多種不同的意思:

  1. 應用程式設計介面API,稱為socket API,簡稱socket
  2. 在socket API中的一個函式名也叫socket
  3. 呼叫socket函式的端點稱為socket
  4. 呼叫socket函式返回值稱為socket描述,也可簡稱為socket
  5. 作業系統核心中聯網協議的Berkeley實現稱為socket實現

可靠傳輸的工作原理

“停止等待”就是在每傳送完一個分組後就通知傳送,等待對方確認,在收到確認後再發送下一個分組,流程如下圖所示:
這裡寫圖片描述
在B接收到出錯報文時丟棄報文,他什麼都不用做,A在一定時間內未收到確認,就認為傳送的分組丟失了,重傳,叫做超時重傳,所以每傳送一份分組都要設定一個超市計時器。
我們應該注意三點:

  1. A在傳送一個分組後必須保留已經發送的分組的副本,只有收到確認後才能清除副本
  2. 分組和確認都必須進行編號
  3. 超時計時器的時間應比資料往返時間更長一點
    確認報文丟失和遲到:傳輸過程沒有出錯,但回送的確認報文丟失了或遲到了,這時傳送方會重傳,接收方收到了重傳分組後就丟棄,不向上層傳送。然後再想傳送方傳送確認。因為接收方是由於沒有收到確認所以重傳資料的。
    停止等待協議的優點是簡單,但缺點是通道利用率太低

為了提高傳輸效率,採用流水線傳輸
這裡寫圖片描述

連續ARQ協議:傳送方維護一個滑動視窗,滑動視窗內的分組可以連續傳送給接收方,而不需要等待確認。
連續ARQ協議規定,傳送發每收到一個分組確認,就把視窗向前滑動一個分組
接收方一般採用累積確認的方式,對按序到達的最後一個分組傳送確認
這裡寫圖片描述
累積確認的優點是容易實現,即使確認丟失也不必重傳。缺點是不能向傳送方正確反映接收方已經正確接收到的所有分組

TCP報文段首部格式
TCP報文段分為首部和資料兩部分,如下圖
這裡寫圖片描述

  1. 源埠和目的埠:各佔2位元組
  2. 序號:佔4位元組範圍是0~2的32次方-1,整個要傳送的位元組流的起始序號必須在連線建立時設定,每一個位元組都按順序編號
  3. 確認號:佔4位元組,是期望收到對方下一個報文段的第一個資料位元組的序號
  4. 資料偏移:佔4位,指出TCP報文段的資料起始處距離TCP報文段起始處的距離
  5. 保留:佔6位,目前置為0,為今後使用
  6. 緊急URG:當URG=1時表示緊急指標欄位有效,表示報文有緊急資料,應儘快傳送
  7. 確認ACK:僅當ACK=1時確認號欄位才有效
  8. 推送PSH:當PSH=1時,傳送方會立即將報文段發出,不必等快取填滿,接收方會立即接收交付
  9. 復位RST:當RST=1時表示TCP連線中出現嚴重錯誤,必須釋放連線
  10. 同步SYN:在建立連線時用來同步序號,當SYN=1,ACK=0時表明是一個連線請求報文段,若同意建立連線,則響應報文段中SYN=1,ACK=1
  11. 終止FIN:用來釋放一個連線
  12. 視窗:佔2位元組,傳送報文段的一方的接收視窗,告訴對方,從本報文段的確認號算起,允許對方傳送的資料量,視窗值是接收方讓傳送方設定其傳送視窗的依據
  13. 檢驗和:佔2位元組,檢驗首部和資料兩部分,計算方法與UDP一致,需要加上偽首部
  14. 緊急指標:佔2位元組,指出本報文中緊急資料的位元組數,緊急指標指出緊急資料的末尾在報文段中的位置
  15. 選項:長度可變,最長40位元組,
    a) 最大報文段長度MSS選項:是每一個TCP報文段中資料欄位的最大長度,
    b) 視窗擴大選項:佔3位元組,其中有一個位元組表示位移值S,擴大視窗值,最大值為14
    c) 時間戳選項:佔10位元組,主要欄位有時間戳值和時間戳回送回答,用來計算RTT,用來方式序號繞回PAWS
    d) 選擇確認選項

TCP可靠傳輸的實現
以位元組為單位的滑動視窗

這裡寫圖片描述
上圖是傳送方A構造傳送視窗例子:A收到了B的確認報文段,其中視窗值20,確認號31,則A構造自己的傳送視窗

這裡寫圖片描述
上圖是傳送方A傳送資料後窗口變化和接收方接收視窗的變化:B只能都按序收到的資料中的最高序號給出確認,因此B傳送的確認報文中的確認號是31,視窗值是20,A的傳送視窗向後滑動一個序號位置。

這裡寫圖片描述
上圖是傳送方A傳送過程中視窗值變化的過程:A收到了31到33的確認,視窗向後發動3個序號位置,B的接收視窗也向後滑動3個序號位置

我們應該注意三點:

  1. 雖然A的傳送視窗是根據B的接收視窗設定的,但同一時刻A的傳送視窗可能和B的接收視窗不一樣大
  2. 對於不按序到達的資料,TCP會臨時存放,等待缺少的位元組收到後再按序交付跟上層應用程序。
  3. TCP要求接收方必須有累積確認功能,也可已在傳送資料是捎帶確認資訊,但是不能過分推遲確認,過分推遲會導致傳送方不必要的重傳,推遲時間不能超過0.5秒
    這裡寫圖片描述

超時重傳時間選擇:TCP採用一種自適應演算法,記錄傳送的報文段的往返時間RTT,計算並保留RTT的一個加權平均往返時間RTTs(平滑往返時間)
這裡寫圖片描述
其中0≦α<1,若α很接近於0,表示新的RTTs值和舊的RTTs的值相比變化不大
超時重傳時間RTO應略大於RTTs,RTO=RTTs+4xRTTd
RTTd是RTT的偏差加權平均值
這裡寫圖片描述
這裡寫圖片描述
報文段每重傳一次,就把超時重傳時間RTO增大為2倍,當不再發生報文段重傳,才根據以上方法計算超時重傳時間

選擇確認SACK:選擇確認SACK中指明收到資料塊的邊界,來確定中間未收到的資料段,
SACK最多指明4個位元組塊的邊界資訊,每個位元組塊需要8個位元組描述,另需要兩個位元組,一個指明SACK選項,一個指明這個選項佔多少位元組,
這裡寫圖片描述

TCP流量控制
流量控制就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收
接收方傳送接收視窗,傳送方傳送視窗不能超過接收方給出的就收視窗的數值
這裡寫圖片描述

有一個問題,假設B向A傳送零視窗的報文段後不久,B的接收快取又有了一些空間,於是B向A傳送rwnd=400的報文段,但是這個報文段丟失了,那麼,A會一直等待B傳送非零視窗的通知,而B會一直等待A傳送資料,形成死局。為了解決這個問題,TCP為每一個連線設有一個持續計時器,只要TCP連線的一方收到了零視窗通知,就啟動計時器,拖計時器到期就傳送一個零視窗探測報文段,對方接收到探測報文後就傳送確認報文,確認報文中給出視窗值。

糊塗視窗綜合症:TCP接收方快取已滿了,而互動式的應用程序一次只從接收快取中讀取一個位元組,然後向傳送方傳送確認,並設定視窗值為1個位元組,傳送方又傳送一個位元組,接收方發回確認,視窗值仍是1。這樣網路傳輸的效率非常低。
解決辦法:可以讓接收方等待一段時間,有足夠空間後再發送確認報文

TCP擁塞控制

擁塞控制就是防止過多的資料注入到網路中
然而,流量控制往往只是點對點通訊量的控制,接收端控制傳送端
控制擁塞的方法可以分為開環控制和閉環控制
開環控制:在設計網路時事先將有關發生擁塞的因素考慮周到,力求網路在工作時不產生擁塞,一但系統執行起來,就不在中途進行改正
閉環控制:

  1. 檢測網路系統以便檢測到擁塞在合適、何處發生
  2. 把擁塞發生的資訊傳送到可採取行動的地方
  3. 調整網路系統的執行以解決出現的問題

幾種擁塞控制的方法:
RFC2581定義了進行擁塞控制的四種演算法:慢開始、擁塞避免、快重傳和快恢復
傳送方維持一個叫做擁塞視窗的狀態變數,大小取決於網路的擁塞程度,傳送方讓自己的傳送視窗等於擁塞視窗

慢開始:由小到大逐漸增大擁塞視窗的數值,每經過一次傳輸輪次,擁塞視窗cwnd就加倍,為了防止cwnd過大,需要設定一個慢開始門限ssthresh,用法如下
這裡寫圖片描述
這裡寫圖片描述

擁塞避免演算法:讓擁塞視窗cwnd緩慢地增大,即每次加1,而不是翻倍,只要傳送方判斷網路出現擁塞,就將ssthresh設定為出現擁塞是的傳送視窗值得一半,但不能小於2。
這裡寫圖片描述

快重傳:接收方每收到一個失序的報文段後就立即傳送重複確認(為的是使傳送方及早摘到有報文段沒有到達),而不是等待發送資料時捎帶。傳送方一連收到三個重複確認後,就立即傳送對方尚未收到的報文段。如下圖所示:
這裡寫圖片描述

快恢復:

  1. 傳送方連續收到三個重複確認時,執行“乘法減少”將ssthresh減半
  2. 與慢開始不同,擁塞視窗直接設定為ssthresh的值
    如下圖所示:
    這裡寫圖片描述

注意:傳送視窗的上限值=Min[接收方視窗rwnd,擁塞視窗cwnd]。
這裡寫圖片描述

隨機早期檢測RED
RED演算法使路由器維持兩個引數,佇列長度最小門限THmin和最大門限THmax
RED演算法:

  1. 若平均佇列長度小於最小門限THmin,新到分組加入佇列排隊
  2. 若平均佇列長度大於最大門限THmax,則新分組丟棄
  3. 若平均佇列長度在最小門限和最大門限之間,則按某一概率將新到分組丟棄
    這裡寫圖片描述

RED採用了和計算平均往返時間RTT類似的加權平均的方法計算平均佇列長度Lav
這裡寫圖片描述
這裡寫圖片描述

TCP的運輸連線管理
運輸連線的三個階段:連線建立、資料傳送和連線釋放
TCP連線時C/S模式,

TCP三次握手:
這裡寫圖片描述

  1. 首先B建立傳輸控制塊TCB,進入LISTEN(監聽)狀態
  2. A建立TCB,向B傳送請求連線報文段,SYN=1,初始序號seq=x,然後A進入SYN-SENT(同步已傳送)狀態
  3. B收到請求連線報文段,向A傳送確認報文段,SYN=1,ACK=1,ack=x+1,seq=y,B進入SYN-RCVD(同步收到)狀態
  4. A收到B的確認後,還要向B給出確認,ACK=1,ack=y+1,seq=x+1,A進入ESTABLISHED(連線已建立)狀態
  5. B收到A的確認後也進入ESTABLISHED狀態

TCP四次揮手:
這裡寫圖片描述

  1. A傳送連線釋放報文段,FIN=1,seq=u,u是前面傳送的最後一個位元組的序號加1,A進入FIN-WAIT-1(終止等待1)狀態
  2. B收到連線釋放報文段,傳送確認,確認號是ack=u+1,ack=v,B進入CLOSE-WAIT(關閉等待)狀態,這時TCP處於半關閉狀態,這時B到A方向的連線並未關閉,B向A傳送資料
  3. A收到B的確認後進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連線釋放報文段
  4. B已經沒有向A傳送的資料後,就傳送一個連線釋放報文段,FIN=1,ack=u+1,B進入LAST-ACK(最後確認)狀態,等待A確認
  5. A收到B的連線釋放報文段後,傳送確認ack=w+1,seq=u+1,然後進入TIME-WAIT(時間等待)狀態,這時TCP還沒有釋放掉,必須經過時間等待計時器設定的時間2MSL後A才進CLOSED狀態,MSL最長報文壽命
  6. B收到A的確認後,進入CLOSED狀態
    TCP還設有一個保活計時器,防止與伺服器已經建立了連線的客戶端突然宕機,伺服器白白等待客戶端的資料。若兩小時沒有收到客戶資料,伺服器傳送一個探測報文段,以後每隔75分鐘傳送一次,若傳送10個探測報文斷後仍無響應,則關閉連線。

TCP的有限狀態機圖:
這裡寫圖片描述