資料通訊與網路 第五版第24章 傳輸層協議-TCP協議部分要點

jun發表於2019-05-19

  上一部落格記錄了UDP協議的關鍵要點,這部分記錄TCP協議的關鍵要點。

24.3 傳輸控制協議(TRANSMISSION CONTROL PROTOCOL)

  TCP(Transmission Control Procotol )協議是一個面向連線,可靠的協議。TCP為了提供面向連線的服務,專門定義了連線建立,資料傳輸、連線斷開階段。TCP使用GBN和SR協議來提供可靠性。為了實現可靠性這個目標,TCP使用檢驗和來進行誤差控制、重傳來處理資料包丟失和衝突、同時還利用了應答和計數機制。在本節,首先討論TCP提供的服務,然後討論TCP的詳細特徵。

24.3.1 TCP服務

程式到程式的通訊(Process-to-Process Communication)

  像UDP一樣,TCP使用埠號提供基於程式到程式的通訊。

流分發服務(Stream Delivery Service)

  和UDP不同,TCP是面向流的,允許傳送程式以位元組流的方式傳送,然後接收方以位元組流的方式接受資料,TCP建立了虛擬的管道環境,從而使得傳送程式和接收程式連線起來。圖24.4表示了雙方資料流的傳輸。

傳送和接收緩衝區(Sending and Receving Buffers)

  因為接收方和傳送方的讀寫資料的速度不一樣,TCP需要緩衝區進行資料儲存。存在兩個緩衝區,傳送緩衝區和接收緩衝區。緩衝區在TCP的流量控制和誤差控制發揮作用,這點稍後將會介紹。一種  實現緩衝區的方式是使用迴圈的位元組陣列,如圖24.5所示。

  

  圖中展示了資料在緩衝區的流動方向,對於傳送方,緩衝區可以分成三個部分。白色的部分表示還沒裝載資料的緩衝區部分,由傳送程式來填充,橙色部分儲存的是已經傳送但還沒被接收方應答的位元組資料,TCP傳送者會保留該區域的資料直到接收到了接收方的應答。黑色部分表示將要傳送的資料。橙色部分的資料被應答之後,可以重新由傳送程式來填充。

  接收方的接收緩衝區的操作會簡單一些,環形的緩衝區分為兩個部分。白色部分表示還沒裝載資料的緩衝區部分,橙色部分表示已經接收,可供接收程式進行資料讀取的緩衝區部分。當一個位元組被接收程式讀取之後,整個緩衝區將會迴圈,同時更新白色緩衝區部分。

片段(Segment)

  儘管緩衝區可以處理髮送方和接收方處理資料不一致的問題,但是在進行資料傳送之前,還需要做一步。向TCP服務的網路層是以資料包的形式傳送資料,而不是資料流。在傳輸層,TCP會封裝一定位元組的資料成一個資料包,叫片段。TCP將會在每個資料片段加一個頭部,然後將資料提交給網路層進行資料傳輸。資料片段在網路層封裝成IP資料包然後傳輸,對於接收程式,整個過程是透明的。等會還會介紹接收方接收到無序、存在丟失和衝突資料以及重新傳輸的情況,這些都是由TCP接收方接收程式來處理的。圖24.6展示了資料片段是如何由傳送緩衝區的位元組生成的。需要注意的一點是,片段的長度不是恆定的。

 

全雙工通訊(Full-Duplex Communication)

  TCP提供全雙工通訊,也就是資料流能同時在兩個方向進行傳輸,每個TCP終端都有一個傳送緩衝區和一個接收緩衝區。

面向連線的服務(Connection-Oriented Service)

  和UDP不同,TCP是面向連線的的協議,當A端的一個程式想傳送資料或者接收資料到另一個程式時,以下三個階段將會出現:

  a.兩個TCP建立一條邏輯上連通的傳輸通道

  b.資料在雙方雙向傳輸

  c.終止連線

可靠的服務(Reliable Service)

  TCP是一種可靠的傳輸協議,使用應答機制來檢查資料的傳輸安全。

24.3.2 TCP特徵(TCP Feature) 

計數系統(Numbering System)

  儘管TCP軟體能夠追蹤片段的傳輸和傳送,但它不是用片段數來記錄資料的傳送,而是用序列號和應答號兩個欄位來記錄傳輸位元組數。

位元組數(Byte Number)

  TCP在資料傳輸過程中記錄所有傳輸的位元組數。計數在接收方和傳送方是獨立的,當TCP接收位元組從一個程式時,TCP儲存資料在緩衝區,並且記錄位元組數,計數並不是從0開始的,而是隨機選擇一個0到(2^23-1)之間的資料。例如,如果初始資料是1057,要傳送的資料總長度為6000位元組,位元組的編號就是1057到7056。位元組計數主要用來進行流量控制和誤差控制。

序列號(Sequence Number)

  位元組編號之後,TCP將會分配一個系列號到每一個將要傳送的片段,片段號,在每一個方向,根據以下規則定義:

  1.第一個欄位的序列號是初始序列號ISN(Initial sequence number),也就是一個隨機生成的數。

  2.其他片段的序列號是上一個片段序列號加上上一個片段傳輸的位元組數。

  當一個片段攜帶使用者資料和控制資訊時,它需要加上序列號,當一個片段沒有攜帶資料時,不需要定義序列號,序列號欄位還是存在的,只是是無效的。需要注意的是,有些片段,雖然只是攜帶了控制資訊,卻需要序列號來允許接收方來進行資料應答,這些欄位用來進行連線建立,終止,中斷。每個這類片段預設是一個資料長度,但是實際中是沒有資料的。

應答號(Acknowledgment Number)

  在通訊過程總,通訊雙方都用序列號記錄了每個片段攜帶的第一個資料的編號。同時,接收方和傳送方還會用應答號來應答接收的資料。應答號定義了對方下一個要傳送的位元組的序列號。

24.3.3 片段(Segment)

   TCP中一個資料包叫片段。

格式(Format)

  片段的格式如圖24.7所示,片段包括一個20-60位元組的頭部,然後就是資料部分。如果沒有其他選項,頭部20位元組長度,否則,頭部是60位元組長度。

  source port address:定義傳送方的埠號。

  destination port address: 接收方的埠號。

  sequence number :序列號,初始序列號(ISN)隨機產生。

  acknowledgment number:應答號,定義接收方下一個期望接收的位元組資料起始編號,如果接收方已經成功位元組編號為X的資料,應答號就是X+1。

  header length: 頭部長度。

  control:該欄位包括6個不同的控制位或者控制標誌,如圖24.8所示。這些位可以用來流量控制,連線建立,連線中斷,連線斷開。圖24.8給出了這些位的含義。

  window size:該欄位定義了傳送資料的視窗大小,長度為16位,最大資料是65535位元組。該值一般用於指接收方的接收視窗大小,傳送方必須考慮接收方的接收窗大小。

  checknum:校驗和,16位。

 

封裝(Encapsulation)

  TCP片段封裝從應用從提交過來的資料,然後TCP片段封裝成IP資料包,然後再資料鏈路層封裝成幀。

24.3.4 TCP連線過程(A TCP Connection)

  TCP連線包括三個階段:連線建立、資料傳輸、連線終止。

連線建立(Connection Establishment)

  三次握手(Three-Way Handshaking)

  TCP建立連線的過程叫做三次握手,試圖建立連線的應用程式,一般稱為客戶端,等待連線的程式,一般稱作伺服器。圖24.10給出了使用三次握手進行連線建立過程以及建立連線過程中資料的關鍵欄位。連線建立過程的三次握手如下:

  1.客戶端傳送第一個片段,稱作SYN片段,片段中設定了SYN位為1。該片段用於序列號的同步。客戶端隨機生成一個數作為初始序列號(ISN),然後傳送到伺服器。需要注意的是,該片段沒有包括應答號,也沒有定義視窗大小,當片段中的應答號存在是,視窗大小定義才有效。SYN片段為控制片段,沒有攜帶資料,但是,它還是會消耗一個一個序列號,因為它需要被伺服器應答,實際中可以認為SYN片段攜帶一個虛擬的位元組。

  2.伺服器傳送第二個片段,SYN+ACK片段,同時該片段中SYN和ACK位都設為1。該片段有兩個目的,第一是初始化從服務端到客戶端的通訊,該片段初始化了一個序列號,來記錄由服務端發向客戶端的的位元組號。第二個目的是應答了客戶端傳送的SYN片段,同時向客戶端說明了下一個要接受的片段的序列號。因為資料包需要被應答,所以需要定義接收接收窗體的大小(rwnd)。該片段也需要消耗一個序列號。

  3.客戶端傳送第三個片段,ACK片段,這個僅僅是應答片段,應答第二個片段的接收。該欄位設定ACK位為1。需要注意的是,該片段如果沒有攜帶資料時,不需要消耗序列號。該欄位允許攜帶從客戶端傳送服務端的資料資訊,當攜帶資料時,需要消耗序列號。

資料傳輸(data transfer)

  連線建立之後,就可以進行資料傳輸了。需要注意的問題是,資料傳輸過程中,如果傳送方設定了PUSH位,意味著接收方要儘快的把資料提交到應用層,而不需要等待緩衝區滿或者更多資料到來。

連線終止(Connection Termination)

  交換資料的雙方都可以關閉連線,雖然關閉連線請求往往由客戶端初始化。如今很多TCP實現允許兩種終止連線方式:三次握手(圖24.12)和半關閉的四次握手(圖24.13)。

  三次握手(Three-Way Handshaking)

  1.客戶端TCP在接收到客戶端應用的斷開連線命令後,向伺服器傳送第一個片段,稱作FIN片段,該片段中FIN標誌位設為1,FIN片段可以攜帶最後傳送給伺服器的資料資訊,也可以不攜帶任務資訊,僅僅作為一個控制片段。如果是控制片段,就需要消耗一個序列號。

  2.伺服器TCP接收到FIN片段後,向上層應用通知連線斷開,然後傳送第二個資料片段,FIN+ACK片段,一方面是中斷伺服器向客戶端傳送資料的連線,另一方面是告知客戶端已接收到FIN片段。FIN+ACK片段可以攜帶最後傳送給客戶端的資料資訊,也可以不攜帶任務資訊,僅僅作為一個控制片段。如果是控制片段,就需要消耗一個序列號。

  3.客戶端TCP傳送最後一個片段,ACK片段,證實接收到了FIN+ACK片段,該片段包括應答號,但不攜帶資料,不消耗序列號。

 

半關閉(Half-Close)

  TCP中,一方可以停止傳送資料的同時仍然接收對方傳送的資料,這種方式稱作半關閉。服務端和客戶端都可以發出半關閉請求。半關閉發生在接收方需要接受所有資料之後,交給上層處理,然後再把資料傳送給傳送方,傳送方發完資料之後就可以請求半關閉了。一個比較容易理解的例子就是排序,客戶端向伺服器傳送要排序的陣列,伺服器把要排序的資料全部接收後,交給上層應用排序好之後,再把排序好的資料傳送給客戶端,客戶端傳送完資料之後,就可以傳送半關閉的請求了。圖24.13就表示了半關閉過程。

 

相關文章