(兩百六十六) TCP/IP詳解筆記-第17章 TCP:傳輸控制協議

第17章 TCP:傳輸控制協議

17.1 引言

本章將介紹TCP爲應用層提供的服務,以及TCP首部中的各個字段。隨後的幾章我們在瞭解TCP的工作過程中將對這些字段作詳細介紹。

對TCP的介紹將由本章開始,並一直包括隨後的7章。第18章描述如何建立和終止一個TCP連接,第19和第20章將瞭解正常的數據傳輸過程,包括交互使用(遠程登錄)和批量數據傳送(文件傳輸)。第21章提供TCP超時及重傳的技術細節,第22和第23章將介紹兩種其他的定時器。最後,第24章概述TCP新的特性以及TCP的性能。

 

17.2 TCP的服務

儘管TCP和UDP都使用相同的網絡層(IP),TCP卻嚮應用層提供與UDP完全不同的服務。TCP提供一種面向連接的、可靠的字節流服務。

面向連接意味着兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立一個TCP連接。這一過程與打電話很相似,先撥號振鈴,等待對方摘機說“喂”,然後才說明是誰。在第18章我們將看到一個TCP連接是如何建立的,以及當一方通信結束後如何斷開連接。

在一個TCP連接中,僅有兩方進行彼此通信。在第12章介紹的廣播和多播不能用於TCP。

TCP通過下列方式來提供可靠性:

  1. 應用數據被分割成TCP認爲最適合發送的數據塊。這和UDP完全不同,應用程序產生的數據報長度將保持不變。由TCP傳遞給IP的信息單位稱爲報文段或段(segment)(參見圖1-7)。在18.4節我們將看到TCP如何確定報文段的長度。
  2. 當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。在第21章我們將瞭解TCP協議中自適應的超時及重傳策略。
  3. 當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒,這將在19.3節討論。
  4. TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。
  5. 既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。
  6. 既然IP數據報會發生重複,TCP的接收端必須丟棄重複的數據。
  7. TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝區溢出。

分段傳輸+超時重傳+ack+校驗和+重新排序+丟棄重複+流量控制

 

兩個應用程序通過TCP連接交換8bit字節構成的字節流。TCP不在字節流中插入記錄標識符。我們將這稱爲字節流服務(byte stream service)。如果一方的應用程序先傳10字節,又傳20字節,再傳50字節,連接的另一方將無法瞭解發方每次發送了多少字節。收方可以分4次接收這80個字節,每次接收20字節。一端將字節流放到TCP連接上,同樣的字節流將出現在TCP連接的另一端。

另外,TCP對字節流的內容不作任何解釋。TCP不知道傳輸的數據字節流是二進制數據,還是ASCII字符、EBCDIC字符或者其他類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。

這種對字節流的處理方式與Unix操作系統對文件的處理方式很相似。Unix的內核對一個應用讀或寫的內容不作任何解釋,而是交給應用程序處理。對Unix的內核來說,它無法區分一個二進制文件與一個文本文件。

 

17.3 TCP的首部

TCP數據被封裝在一個IP數據報中,如圖17-1所示。

圖17-1 TCP數據在IP數據報中的封裝

圖17-2顯示TCP首部的數據格式。如果不計任選字段,它通常是20個字節。

圖17-2 TCP包首部

 

每個TCP段都包含源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接。

有時,一個IP地址和一個端口號也稱爲一個插口(socket)。這個術語出現在最早的TCP規範(RFC793)中,後來它也作爲表示伯克利版的編程接口(參見1.15節)。插口對(socketpair)(包含客戶IP地址、客戶端口號、服務器IP地址和服務器端口號的四元組)可唯一確定互聯網絡中每個TCP連接的雙方。

序號用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節。如果將字節流看作在兩個應用程序間的單向流動,則TCP用序號對每個字節進行計數。序號是32 bit的無符號數,序號到達232-1後又從0開始。

當建立一個新的連接時,SYN標誌變1。序號字段包含由這個主機選擇的該連接的初始序號ISN(Initial Sequence Number)。該主機要發送數據的第一個字節序號爲這個ISN加1,因爲SYN標誌消耗了一個序號(將在下章詳細介紹如何建立和終止連接,屆時我們將看到FIN標誌也要佔用一個序號)。

既然每個傳輸的字節都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加1。只有ACK標誌(下面介紹)爲1時確認序號字段纔有效。

發送ACK無需任何代價,因爲32 bit的確認序號字段和ACK標誌一樣,總是TCP首部的一部分。因此,我們看到一旦一個連接建立起來,這個字段總是被設置,ACK標誌也總是被設置爲1。

TCP爲應用層提供全雙工服務。這意味數據能在兩個方向上獨立地進行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數據序號。

TCP可以表述爲一個沒有選擇確認或否認的滑動窗口協議(滑動窗口協議用於數據傳輸將在20.3節介紹)。我們說TCP缺少選擇確認是因爲TCP首部中的確認序號表示發方已成功收到字節,但還不包含確認序號所指的字節。當前還無法對數據流中選定的部分進行確認。例如,如果1~1024字節已經成功收到,下一報文段中包含序號從2049~3072的字節,收端並不能確認這個新的報文段。它所能做的就是發回一個確認序號爲1025的ACK。它也無法對一個報文段進行否認。例如,如果收到包含1025~2048字節的報文段,但它的檢驗和錯,TCP接收端所能做的就是發回一個確認序號爲1025的ACK。在21.7節我們將看到重複的確認如何幫助確定分組已經丟失。

首部長度給出首部中32 bit字的數目。需要這個值是因爲任選字段的長度是可變的。這個字段佔4bit,因此TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節。在TCP首部中有6個標誌比特。它們中的多個可同時被設置爲1。我們在這兒簡單介紹它們的用法,在隨後的章節中有更詳細的介紹。

第17章 TCP:傳輸控制協議_即時通訊網(52im.net)

 

TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小爲字節數,起始於確認序號字段指明的值,這個值是接收端正期望接收的字節。窗口大小是一個16 bit字段,因而窗口大小最大爲65535字節。在24.4節我們將看到新的窗口刻度選項,它允許這個值按比例變化以提供更大的窗口。

檢驗和覆蓋了整個的TCP報文段:TCP首部和TCP數據。這是一個強制性的字段,一定是由發端計算和存儲,並由收端進行驗證。TCP檢驗和的計算和UDP檢驗和的計算相似,使用如11.3節所述的一個僞首部。

只有當URG標誌置1時緊急指針纔有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。我們將在20.8節介紹它。

最常見的可選字段是最長報文大小,又稱爲MSS(Maximum Segment Size)。每個連接方通常都在通信的第一個報文段(爲建立連接而設置SYN標誌的那個段)中指明這個選項。它指明本端所能接收的最大長度的報文段。我們將在18.4節更詳細地介紹MSS選項,TCP的其他選項中的一些將在第24章中介紹。

從圖17-2中我們注意到TCP報文段中的數據部分是可選的。我們將在18章中看到在一個連接建立和一個連接終止時,雙方交換的報文段僅有TCP首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。

 

17.4 小結

TCP提供了一種可靠的面向連接的字節流運輸層服務。我們簡單地介紹了TCP首部中的各個字段,並在隨後的幾章裏詳細討論它們。

TCP將用戶數據打包構成報文段;它發送數據後啓動一個定時器;另一端對收到的數據進行確認,對失序的數據重新排序,丟棄重複數據;TCP提供端到端的流量控制,並計算和驗證一個強制性的端到端檢驗和。

許多流行的應用程序如Telnet、Rlogin、FTP和SMTP都使用TCP。

 

習題

  1. 我們已經介紹了以下幾種分組格式:IP、ICMP、IGMP、UDP和TCP。每一種格式的首部中均包含一個檢驗和。對每種分組,說明檢驗和包括IP數據報中的哪些部分,以及該檢驗和是強制的還是可選的。

除了UDP的檢驗和,其他都是必需的。IP檢驗和只覆蓋了IP首部,而其他字段都緊接着IP首部開始。

  1. 爲什麼我們已經討論的所有Internet協議(IP,ICMP,IGMP,UDP,TCP)收到有檢驗和錯的分組都僅作丟棄處理?

源IP地址、源端口號或者協議字段可能被破壞了

  1. TCP提供了一種字節流服務,而收發雙方都不保持記錄的邊界。應用程序如何提供它們自己的記錄標識?

很多Internet應用使用一個回車和換行來標記每個應用記錄的結束。這是NVT ASCII採用的編碼(26.4節)。另外一種技術是在每個記錄之前加上一個記錄的字節計數,DNS(習題14.4)和Sun RPC(29.2節)採用了這種技術。

  1. 爲什麼在TCP首部的開始便是源和目的的端口號?

就像我們在6.5節所看到的,一個ICMP差錯報文必須至少返回引起差錯的IP數據報中除了IP首部的前8個字節。當TCP收到一個ICMP差錯報文時,它需要檢查兩個端口號以決定差錯對應於哪個連接。因此,端口號必須包含在TCP首部的前8個字節裏。

  1. 爲什麼TCP首部有一個首部長度字段而UDP首部(圖11-2)中卻沒有?

TCP首部的最後有一些選項,但UDP首部中沒有選項。(tcp首部長度給出首部中32 bit字的數目。)

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