一. TCP提供可靠性的方式
1. 應用資料被分割成TCP認為最合適發送的資料區塊,由TCP傳遞給IP的資訊單位稱為報文段或段(segement)
2. 當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段,如果不能及時收到一個確認,將重發這個報文段
3. 當TCP收到發自TCP串連另一端的資料,它將發送一個確認,這個確認不是立即發送,通常是將延遲幾分之一秒
4. TCP將保持它首部和資料的檢驗和。這是一個端到端的檢驗和,目地是檢測資料在傳輸過程中的任何變化
5. TCP報文段的到達可能會失序,所以TCP可能對收到的資料進行重新排序,將收到的資料以正確的順序交給應用程式層
6. TCP的接收到會丟棄重複的資料
7. TCP提供流量控制。TCP串連的每一方都有固定大小的緩衝空間。TCP接收端之允許另一端發送接收端緩衝區所能接納的資料
另外,TCP對位元組流的內容不做任何解釋,TCP不知道傳輸的資料位元組流是二進資料,還是ASCII字元,還是其他字元,對位元組流的解釋由TCP串連雙方的應用程式層解釋。這與Unix對檔案的處理方式相似。對Unix核心來說,它無法區分一個二進位檔案與一個文字檔
二. TCP的首部
TCP資料被封裝在一個IP資料報中
20位元組 20位元組
IP首部 TCP首部 TCP資料
TCP首部的資料格式,不計任選部分,通常是20個位元組
16位源連接埠 16位目的連接埠
32位序號
32為確認序號
首部長度(4) 保留位(6) 標誌位 16位視窗大小
16位檢驗和 16位緊急指標
選項
資料
每個TCP段都包含源端和目的端的連接埠號碼,用於尋找發端和收端的應用進程,這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP串連
序號用來標識從TCP發端向TCP收端發送的資料位元組流,它表示在這個報文段中的第一個資料位元組。如果將位元組流看作在兩個應用程式的單項流動,則TCP用序號對每個位元組進行計數。序號是32bit的無符號數
當建立一個串連時,SYN標誌變1,序號欄位包含由這個主機選擇的該串連的初始序號ISN。該主機要發送的第一個位元組序號為這個ISN加1,因為SYN要消耗一個序號
確認序號應該是上次已成功收到的資料位元組號加1,只有ACK標誌為1時確認序號欄位才有效
TCP首部中的6個標誌位元
URG 緊急指標有效 ACK 確認序號有效
PUSH 接收方應該儘快將這個報文段交給應用程式層
RST 重建串連 SYN 同步序號用來發起一個串連
FIN 發端完成發送任務
問題:TCP首部有一個首部長度,而UDP為什麼沒有?因為TCP有可選擇的欄位
三. TCP串連的建立和終止
1. 串連的建立與終止 telnet www.name.com
可以用tcpdump輸出tcp報文資訊 (源 > 目的 : 標誌)
2. 建立連線協定:(三向交握)
1)請求端發送一個SYN段指明客戶打算已連線的服務器的連接埠,以及初始序號(ISN).
2)伺服器發回包含伺服器的初始序號的SYN報文段作為應答,同時,將確認序號設定為客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN佔用一個序號
3)客戶必須將確認序號設定為伺服器的ISN加1以對伺服器的SYN報文段進行確認
當一端為建立串連而發送它的SYN時,它為串連選擇一個初始序號。ISN隨時間而變化,因此每個串連都具有不同的ISN。
如何進行序號選擇?系統初始化時初始的發送序號被初始化為1.這個變數每0.5秒增加64000,並每隔9.5小時右回到0
3. 串連終止協議(四次握手):
首先進行關閉的一方(即發送第一個FIN)將執行主動關閉,而另一方(收到這個FIN)執行被動關閉。
發端發送一個報文段發起終止串連,當伺服器收到這個FIN,它發回一個ACK。確認序號為收到的序號加1,和SYN一樣,一個FIN將佔用一個序號。同時TCP伺服器還嚮應用程式傳送一個檔案結束符。接著這個伺服器程式就關閉它的串連,導致它的TCP段發送一個FIN。用戶端必鬚髮回一個確認,並將確認序號設定為收到序號加1
細節:
1> TCP選項:
選項表結束 1位元組 無操作 1位元組 最大報文長度 4位元組
視窗擴大因子 3位元組 時間戳記 10位元組
每個選項的開始是1位元組kind欄位,說明選項的類型,kind欄位為0和1選項僅佔1個位元組,其他的選項在kind位元組後還有len位元組,它說明的長度是指總長度
2> 最大報文段長度(MSS)
表示TCP傳往另一端的最大塊資料的長度,當一個串連建立時,串連的雙方都要通告各自的MSS。
3> 2MSL等待狀態
TIME_WAIT狀態也稱為2MSL等待狀態,每個具體TCP實現必須選擇一個報文段最大存留時間MSL,它是任何報文段被丟棄前在網路內的最長時間
四. TCP伺服器的設計
當一個新的串連請求到達伺服器時,伺服器接受這個請求,並調用一個新進程來處理這個新的客戶請求
呼入串連請求隊列:
1. 正等待串連請求的一端有一個固定長度的串連隊列,該隊列中的串連是將其從該隊列中移除
2. 應用程式層將指明該隊列的最大長度,這個值通常成為積壓值
3. 當一個串連請求到達時,TCP會跟據演算法來確定是否接收這個請求
五. 慢啟動
慢啟動演算法通過觀察到新分組進入網路的速率應該與另一端返回確認的速率相同而進行工作
慢啟動為發送方的TCP增加了另一個視窗:擁塞視窗,記為cwnd。當與另一個網路的主機建立TCP串連時,擁塞視窗被初始化為1個報文段(即另一端的報文段大小)。每收到一個ACK,擁塞視窗就增加一個報文段(cwnd以位元組為單位,但是慢啟動以報文段大小為單位進行增加)。發送方取擁塞視窗與通告視窗中的最小值為發送上限,擁塞視窗是發送方使用的流量控制,而通告視窗則是接收方使用的流量控制
發送方開始時發送一個報文段,然後等待ACK。當收到該ACK時,擁塞視窗從1增加到2,即可以發送兩個報文段。當收到這兩個報文段的ACK時,擁塞視窗就增加為4,這是一種指數增加的關係
在某些點上可能達到了互連網的容量,於是中間路由器開始丟棄分組。這就通知發送方它的擁塞視窗開得過大。