可靠性TCP提供一種面向連接的、可靠的字節(jié)流服務。面向連接意味著兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數(shù)據包之前必須先建立一個TCP連接。這一過程與打電話很相似,先撥號振鈴,等待對方摘機說“喂”,然后才說明是誰。在一個TCP連接中,僅有兩方進行彼此通信。廣播和多播不能用于TCP。
TCP通過下列方式來提供可靠性:
1.應用數(shù)據被分割成TCP認為最適合發(fā)送的數(shù)據塊。這和UDP完全不同,應用程序產生的數(shù)據長度將保持不變。由TCP傳遞給IP的信息單位稱為報文段或段(segment)。2.當TCP發(fā)出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發(fā)這個報文段。當TCP收到發(fā)自TCP連接另一端的數(shù)據,它將發(fā)送一個確認。TCP有延遲確認的功能,在此功能沒有打開,則是立即確認。功能打開,則由定時器觸發(fā)確認時間點。3.TCP將保持它首部和數(shù)據的檢驗和。這是一個端到端的檢驗和,目的是檢測數(shù)據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發(fā)端超時并重發(fā))。4.既然TCP報文段作為IP數(shù)據報來傳輸,而IP數(shù)據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數(shù)據進行重新排序,將收到的數(shù)據以正確的順序交給應用層。5.既然IP數(shù)據報會發(fā)生重復,TCP的接收端必須丟棄重復的數(shù)據。6.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據。這將防止較快主機致使較慢主機的緩沖區(qū)溢出。兩個應用程序通過TCP連接交換8bit字節(jié)構成的字節(jié)流。TCP不在字節(jié)流中插入記錄標識符。我們將這稱為字節(jié)流服務(bytestreamservice)。如果一方的應用程序先傳10字節(jié),又傳20字節(jié),再傳50字節(jié),連接的另一方將無法了解發(fā)方每次發(fā)送了多少字節(jié)。只要自己的接收緩存沒有塞滿,TCP 接收方將有多少就收多少。一端將字節(jié)流放到TCP連接上,同樣的字節(jié)流將出現(xiàn)在TCP連接的另一端。另外,TCP對字節(jié)流的內容不作任何解釋。TCP不知道傳輸?shù)臄?shù)據字節(jié)流是二進制數(shù)據,還是ASCⅡ字符、EBCDIC字符或者其他類型數(shù)據。對字節(jié)流的解釋由TCP連接雙方的應用層解釋。
這種對字節(jié)流的處理方式與Unix操作系統(tǒng)對文件的處理方式很相似。Unix的內核對一個應用讀或寫的內容不作任何解釋,而是交給應用程序處理。對Unix的內核來說,它無法區(qū)分一個二進制文件與一個文本文件。
重傳策略TCP協(xié)議用于控制數(shù)據段是否需要重傳的依據是設立重發(fā)定時器。在發(fā)送一個數(shù)據段的同時啟動一個重傳,如果在重傳超時前收到確認(Acknowlegement)就關閉該重傳,如果重傳超時前沒有收到確認,則重傳該數(shù)據段。在選擇重發(fā)時間的過程中,TCP必須具有自適應性。它需要根據互聯(lián)網當時的通信情況,給出合適的重發(fā)時間。這種重傳策略的關鍵是對定時器初值的設定。采用較多的算法是Jacobson于1988年提出的一種不斷調整超時時間間隔的動態(tài)算法。其工作原理是:對每條連接TCP都保持一個變量RTT(Round Trip Time),用于存放當前到目的端往返所需要時間最接近的估計值。當發(fā)送一個數(shù)據段時,同時啟動連接的定時器,如果在定時器超時前確認到達,則記錄所需要的時間(M),并修正RTT的值,如果定時器超時前沒有收到確認,則將RTT的值增加1倍。通過測量一系列的RTT(往返時間)值,TCP協(xié)議可以估算數(shù)據包重發(fā)前需要等待的時間。在估計該連接所需的當前延遲時通常利用一些統(tǒng)計學的原理和算法(如Karn算法),從而得到TCP重發(fā)之前需要等待的時間值。