TCP數(shù)據(jù)被封裝在一個IP數(shù)據(jù)報中如下圖:
顯示TCP首部的數(shù)據(jù)格式。如果不計任選字段,它通常是20個字節(jié)。
每個TCP段都包含源端和目的端的端口號,用于尋找發(fā)端和收端應(yīng)用進(jìn)程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接。
有時,一個IP地址和一個端口號也稱為一個插口(socket)。這個術(shù)語出現(xiàn)在最早的TCP規(guī)范(RFC793)?,后来它覝骥为表熟o死嫻謀喑探涌?。插吭溤(socketpair)(包含客戶IP地址、客戶端口號、服務(wù)器IP地址和服務(wù)器端口號的四元組)可唯一確定互聯(lián)網(wǎng)絡(luò)中每個TCP連接的雙方。
序號用來標(biāo)識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的的第一個數(shù)據(jù)字節(jié)。如果將字節(jié)流看作在兩個應(yīng)用程序間的單向流動,則TCP用序號對每個字節(jié)進(jìn)行計數(shù)。序號是32bit的無符號數(shù),序號到達(dá)232-1后又從0開始。
當(dāng)建立一個新的連接時,SYN標(biāo)志變1。序號字段包含由這個主機選擇的該連接的初始序號ISN(InitialSequenceNumber)。該主機要發(fā)送數(shù)據(jù)的第一個字節(jié)序號為這個ISN加1,因為SYN標(biāo)志消耗了一個序號(將在下章詳細(xì)介紹如何建立和終止連接,屆時我們將看到FIN標(biāo)志也要占用一個序號)。
既然每個傳輸?shù)淖止?jié)都被計數(shù),確認(rèn)序號包含發(fā)送確認(rèn)的一端所期望收到的下一個序號。因此,確認(rèn)序號應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號加1。只有ACK標(biāo)志(下面介紹)為1時確認(rèn)序號字段才有效。
發(fā)送ACK無需任何代價,因為32bit的確認(rèn)序號字段和ACK標(biāo)志一樣,總是TCP首部的一部分。因此,我們看到一旦一個連接建立起來,這個字段總是被設(shè)置,ACK標(biāo)志也總是被設(shè)置為1。
TCP為應(yīng)用層提供全雙工服務(wù)。這意味數(shù)據(jù)能在兩個方向上獨立地進(jìn)行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)序號。
TCP可以表述為一個沒有選擇確認(rèn)或否認(rèn)的滑動窗口協(xié)議(滑動窗口協(xié)議用于數(shù)據(jù)傳輸將在20.3節(jié)介紹)。我們說TCP缺少選擇確認(rèn)是因為TCP首部中的確認(rèn)序號表示發(fā)方已成功收到字節(jié),但還不包含確認(rèn)序號所指的字節(jié)。當(dāng)前還無法對數(shù)據(jù)流中選定的部分進(jìn)行確認(rèn)。例如,如果1~1024字節(jié)已經(jīng)成功收到,下一報文段中包含序號從2049~3072的字節(jié),收端并不能確認(rèn)這個新的報文段。它所能做的就是發(fā)回一個確認(rèn)序號為1025的ACK。它也無法對一個報文段進(jìn)行否認(rèn)。例如,如果收到包含1025~2048字節(jié)的報文段,但它的檢驗和錯,TCP接收端所能做的就是發(fā)回一個確認(rèn)序號為1025的ACK。
首部長度給出首部中32bit字的數(shù)目。需要這個值是因為任選字段的長度是可變的。這個字段占4bit,因此TCP最多有60字節(jié)的首部。然而,沒有任選字段,正常的長度是20字節(jié)。在TCP首部中有6個標(biāo)志比特。它們中的多個可同時被設(shè)置為1。我們在這兒簡單介紹它們的用法。
URG緊急指針(urgentpointer)有效
ACK確認(rèn)序號有效。
PSH接收方應(yīng)該盡快將這個報文段交給應(yīng)用層。
RST重建連接。
SYN同步序號用來發(fā)起一個連接。這個標(biāo)志和下一個標(biāo)志將在第18章介紹。
FIN發(fā)端完成發(fā)送任務(wù)。
TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為字節(jié)數(shù),起始于確認(rèn)序號字段指明的值,這個值是接收端正期望接收的字節(jié)。窗口大小是一個16bit字段,因而窗口大小最大為65535字節(jié)。在24.4節(jié)我們將看到新的窗口刻度選項,它允許這個值按比例變化以提供更大的窗口。
檢驗和覆蓋了整個的TCP報文段:TCP首部和TCP數(shù)據(jù)。這是一個強制性的字段,一定是由發(fā)端計算和存儲,并由收端進(jìn)行驗證。TCP檢驗和的計算和UDP檢驗和的計算相似。
只有當(dāng)URG標(biāo)志置1時緊急指針才有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
最常見的可選字段是最長報文大小,又稱為MSS(MaximumSegmentSize)。每個連接方通常都在通信的第一個報文段(為建立連接而設(shè)置SYN標(biāo)志的那個段)中指明這個選項。它指明本端所能接收的最大長度的報文段。
從上圖中我們注意到TCP報文段中的數(shù)據(jù)部分是可選的。我們將在18章中看到在一個連接建立和一個連接終止時,雙方交換的報文段僅有TCP首部。如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒有任何數(shù)據(jù)的首部來確認(rèn)收到的數(shù)據(jù)。在處理超時的許多情況中,也會發(fā)送不帶任何數(shù)據(jù)的報文段。
眾信咨詢:互聯(lián)網(wǎng)資質(zhì)代理誠信品牌