1. 程式人生 > 其它 >計算機網路自頂向下--第三章傳輸層筆記

計算機網路自頂向下--第三章傳輸層筆記

1.大綱

第三章傳輸層的內容主要是:

  • 運輸層概覽
    • 運輸層的基本概念
    • 運輸層和應用層以及網路層之間的關係
  • udp協議
  • 可靠傳輸原理
  • tcp協議
    • tcp的累計確認以及超時重傳機制
    • tcp的流量控制
    • tcp連線的建立和釋放
    • tcp的擁塞控制

2.基本概念

  • 網路分層結構:tcp/ip 網路體系中有五層,應用層、傳輸層、網路層、鏈路層、物理層。其中,在接收方,每一層需要解析底層傳來的資料,交付給上層。在傳送方,每一層需要接收上層的資料,封裝之後交給下層。
  • 套接字:套接字是應用層和傳輸層之間資料傳輸的程式設計介面。一個套接字由ip地址和埠號組成。
  • 埠號:埠號是套接字的組成部分,可以看作是一個數據的出入口。
  • 多路複用和多路分解:在接收方,傳輸層解析網路層的資料,將資料交給不同的套接字,這個過程叫做多路分解。相對的,在傳送方,傳輸層接收來自不同套接字的資料,封裝成資料報交付給網路層,這個過程叫做多路複用。也就是說,多個套接字共同使用傳輸層的服務。
  • 資料報:傳輸層的資料單元。
  • 可靠傳輸:傳輸層交付給應用層的資料是完整的,按序的,沒有差錯的資料。
  • 傳送視窗:流水線可靠傳輸協議中,一次最多傳送N個報文,這N個報文成為傳送視窗。如果把資料報按照發送時間順序排列在數軸上,傳送視窗將資料報分成三類。左邊是已經確認的報文,中間是已經發送未確認的報文和未傳送的報文,右邊是不可用的報文。

3.傳輸層概覽

傳輸層提供的是不同主機上程序和程序之間的通訊服務。這種服務也被稱作多路複用和多路分解服務。而網路層提供的服務是主機到主機之間的通訊服務。因此,傳輸層和應用層網路層之間的關係是,傳輸層通過套接字接收來自應用層的資料,封裝成資料報,交付給網路層。在實現上,我們使用源埠號和目的埠號來標識不同主機上的兩個程序。

4.udp協議

udp協議是無連線的,不可靠的網路協議。udp只實現了最基本的程序間資料傳輸,以及簡單的差錯校驗。
udp的報文格式如下:

首部欄位包括:源埠號、目的埠號、報文長度欄位、校驗和
udp協議的特點:

  • 無連線的(沒有連線建立的時延)
  • 簡單的(固定的首部,只提供了基本的資料傳輸和差錯校驗功能)
  • 沒有阻塞控制,如果使用udp協議,開發者可以按照他們想要的速率傳送資料,不會收到協議的限制

5.可靠傳輸原理

網路層提供的是盡力而為的服務,網路層並不保證資料的可靠傳輸。也就是說,在資料的傳輸過程中,可能會出現位元差錯,丟包,資料包亂序到達等現象。因為udp只實現了最基本的程序間資料傳輸,以及簡單的差錯校驗,所以udp是不可靠的。而在現實世界中,可靠傳輸的服務是人們需要的。tcp協議就是可靠傳輸的協議。書中在詳細介紹tcp協議之前,首先介紹瞭如何實現一個可靠傳輸協議,然後結合可靠傳輸原理再去分析tcp協議。
我們需要考慮三個問題:

  • 位元差錯
  • 丟包
  • 報文失序到達

5.1 rdt1.0 可靠通道傳輸

考慮最簡單的情況,運輸層下的通道是完全可靠的,不會出現上述三個問題。
我們做如下假設:

  • 通道是完全可靠的,資料傳輸沒有任何問題。
  • 我們一次只發送一個數據報。
    狀態圖如下:

    傳送方事件:
  • 接收應用層資料,封裝成資料報傳送
    接收方事件
  • 解析資料報,交付給指定套接字

5.2 rdt2.0 考慮位元差錯

如果考慮位元差錯的情況,協議需要提供檢驗差錯以及通知傳送方重新發送報文的能力。這裡引入了確認機制,對傳送方傳送的每個資料報,接收方都要相應的傳送一個確認報文。這裡使用ACK表示肯定確認,即報文沒有差錯,NAK表示否定確認,報文出現了差錯。
還要考慮到,傳送的確認報文也可能出現bit差錯,所以當傳送方收到一個否定確認或者出現差錯的確認報文,都會重傳資料報,接收方收到冗餘分組,依然傳送確認報文,但是將冗餘分組丟棄。
狀態圖:

傳送方事件:

  • 接收應用層資料:計算校驗和,生成資料報
  • 接收確認報文:
    • 收到肯定報文,什麼都不做
    • 收到否定或者錯誤報文,重傳資料報
      接收方事件:
  • 接收到錯誤報文:傳送否定確認
  • 接收到正常報文:傳送肯定確認

5.3 rdt3.0 考慮丟包情況

網路層的傳輸是有可能丟包的,比如當分組大於路由器的快取的時候,路由器會將分組丟棄。這裡需要考慮到資料報丟失和確認報文丟失,為了解決丟包問題,我們引入定時器。如果超出一定時間沒有收到確認報文,就重傳資料報並重啟定時器。
狀態圖:

傳送方事件:

  • 接收應用層資料:計算校驗和,生成資料報,啟動定時器
  • 接收確認報文:
    • 收到肯定報文,什麼都不做
    • 收到否定或者錯誤報文,什麼都不做,等待定時器超時重傳資料報
    • 定時器超時,重傳資料報,重啟定時器
      接收方事件:
  • 接收到錯誤報文:傳送否定確認
  • 接收到正常報文:傳送肯定確認

5.4 流水線可靠傳輸協議

上面實現的協議的資料報是一個接一個傳送的,這種協議稱為停等協議。他有一個明顯的缺點,就是通道利用率不高。為了提高通道利用率,我們考慮一次性發送多個分組,這樣的協議叫做流水線可靠傳輸協議。
一次傳送多個分組需要考慮:

  • 對資料報編號,不然我們不知道接收方的確認包是對哪一個報文的確認
  • 傳送方需要維護一個傳送視窗,視窗的大小N意味著一次最多同時傳送N個數據報
  • 需要考慮報文失序到達的情況

5.4.1GBN協議 回退N步

特點:

  • 一次最多傳送N個報文,並且整個視窗公用一個計時器,如果計時器超時,重傳所有未被確認的資料報
  • 接收方採用累計確認的方式,沒收到一個包,返回連續的最大序號X,這意味著x之前的報文接收方都已經收到了
  • 接收方不快取資料報,如果收到失序到達的資料報,直接丟棄
  • 傳送方每收到一個確認報,都需要更新視窗的baseSeq

5.4.2SR協議 選擇重傳

如果出現超時情況,GBN會一次重傳所有沒有確認的分組,這可能存在大量的冗餘分組。一種改進的方法是傳送方將收到的分組快取起來,並且,傳送方為視窗內每個分組設定定時器。

  • 傳送方為視窗內每個分組設定定時器,超時重傳
  • 接收方收到分組後,如果是視窗內的分組,快取下來,傳送一個確認報
  • 接收方收到確認報後,觀察確認分組需要,如果等於baseseq,更新視窗的baseSeq

6. tcp協議

6.1 tcp概述

tcp的特點:

  • 面向連線的
  • 可靠的
    面向連線指的是tcp協議有建立連線和釋放連線的過程,也就是一般說的三次握手和四次揮手。可靠指的是tcp協議保證傳輸層交付給應用層的資料是完整沒有差錯並且是有序的。tcp通過累計確認、快速重傳、流量控制、擁塞控制來實現可靠傳輸。

6.2tcp報文格式


重要欄位:

  • 序號:報文資料中第一個位元組的序號。用來標記報文序號,和前面使用序號標記資料報的作用是一樣的
  • 確認號:AB之間,A填寫的確認號是期望收到B的下一個資料報的序號欄位的值。如果為X,意味著A通知B:X之前的位元組都已經收到了
  • 接收視窗:可以傳送的最大位元組數,用於流量控制
  • 確認標誌
    • ACK:用於確認報文
    • SYN:用於連線建立
    • FIN:用於連線釋放

6.3 累計確認和快速重傳

序號用來標記報文,確認號是期望收到的下一個資料報的序號。如果資料報超時,會重傳發送視窗中所有未確認的資料報。如果連續收到三個一樣的確認號,可以認為出現了丟包情況,立刻重傳對應的資料報,避免出現超時情況引起大量重傳。

6.4 流量視窗

如果報文失序到達,接收方需要快取傳送方傳送的資料,等到資料都收到後一起上傳給應用層。但是快取的大小是有限制的,如果超過了快取上限,會出現資料溢位的情況。所以tcp使用接收視窗欄位告訴傳送方最大能夠傳送的位元組數,傳送方傳送的位元組數不能夠超過接收視窗。

6.5 tcp連線的建立和釋放

tcp通訊之前需要設定tcp相關變數,分配快取空間,通訊結束需要釋放快取,因此需要建立和釋放tcp連線。

6.5.1 建立過程

A B兩臺主機建立連線
A=》B,A向B傳送建立連線報文,SYN位設1,生成seq=x
B=》A,B收到建立連線報文,建立tcp連線,分配快取空間。B向A傳送確認報文,SYN位設1,ACK設1,生成seq=y,ack=x+1
A=》B,A收到確認報文,建立tcp連線,分配快取空間。A向B傳送確認報文,SYN位設0(連線已經建立),seq=x+1,ack=y+1。這個資料報可以攜帶資料

6.5.2 釋放過程

A B兩臺主機
A=>B, FIN=1
B=>A, ACK=1
B=>A, FIN=1
A=>B, ACK=1 等待2msl時間,關閉連線。

6.5.3一些問題

  • 為什麼要三次握手?
    一方面,如果兩次握手建立連線,如果存在延遲到達的建立請求包,收到後立刻建立連線會造成資源的浪費。另一方面,為了建立可靠連線,通訊雙方需要交換並確認各自的起始序號,