計(jì)算機(jī)網(wǎng)絡(luò)系列博文——目錄
概述
TCP服務(wù)
-
多路復(fù)用與多路分解
將端系統(tǒng)間的IP交付服務(wù)擴(kuò)展為運(yùn)行在端系統(tǒng)上的兩進(jìn)程間的交付服務(wù),即運(yùn)輸層多路復(fù)用與多路分解。 -
可靠數(shù)據(jù)傳輸
即保證分組不錯不丟不亂 -
擁塞控制
防止任何一條TCP連接用過多的流量淹沒通信主機(jī)之間的鏈路和交換設(shè)備以優(yōu)化整個因特網(wǎng)環(huán)境
TCP特點(diǎn)
三次握手 兩進(jìn)程在通過TCP傳遞傳遞有效數(shù)據(jù)前,必須互相握手,即發(fā)送某些預(yù)備報文段以建立確保數(shù)據(jù)傳輸?shù)膮?shù)。
客戶首先發(fā)出一個特殊報文段,服務(wù)器用另一個特殊報文段響應(yīng),最后,客戶用第三個特殊報文段作為響應(yīng)。前兩個特殊報文段不承載有效載荷,第三個報文段可以承載有效載荷。面向連接
通信雙方在發(fā)送數(shù)據(jù)之前必須建立連接。
TCP協(xié)議僅在端系統(tǒng)中運(yùn)行,連接狀態(tài)在端系統(tǒng)中維護(hù),中間網(wǎng)絡(luò)元素不會維護(hù)TCP連接狀態(tài)。雙全工服務(wù) AB兩進(jìn)程間的TCP連接可以從A向B傳輸數(shù)據(jù)也可以從B向A傳輸數(shù)據(jù)。
TCP是雙全工的點(diǎn)對點(diǎn) TCP是點(diǎn)對點(diǎn)的,不支持多播
多播: 一次發(fā)送操作中,從一個發(fā)送方將數(shù)據(jù)傳輸給多個接收方緩存上層數(shù)據(jù) 發(fā)送方應(yīng)用層通過套接字向TCP傳遞數(shù)據(jù),TCP將數(shù)據(jù)引導(dǎo)至該連接的發(fā)送緩存中,發(fā)送緩存在三次握手期間設(shè)置。
最大報文段(有效載荷)長度(Maximun Segment Size,MSS) TCP可以從緩存中取出并放入報文段中的最大數(shù)據(jù)數(shù)量。 MSS通常根據(jù)最大鏈路層幀長度設(shè)置。該設(shè)置保證一個TCP報文段封裝在IP數(shù)據(jù)報中后,再加上TCP/IP的首部,其總長度將適合單個鏈路層幀。
流水線機(jī)制 TCP使用流水線機(jī)制,但結(jié)合了GBN和SR的特點(diǎn),在收發(fā)雙方都設(shè)置有緩存
TCP連接的組成
- 兩個端系統(tǒng)中,各自的TCP緩存,變量,與進(jìn)程連接的套接字。
- 兩端系統(tǒng)之間的網(wǎng)絡(luò)元素沒有為該連接分配任何緩存和變量。
TCP報文段
TCP報文段由首部字段和數(shù)據(jù)字段組成。數(shù)據(jù)字段最大長度由MSS限制。

首部字段結(jié)構(gòu)
- 源端口號 用于多路復(fù)用/分解
- 目的端口號 用于多路復(fù)用/分解
- 序號字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
- 確認(rèn)號字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
- 接收窗口字段 16bit 用于流量控制
- 檢驗(yàn)和字段 16bit 用于差錯檢測
- 首部長度字段 4bit 指示TCP首部長度。(選項(xiàng)字段常為空,故TCP首部典型長度為20byte)
- 選項(xiàng)字段 可選的,變長的。 可用于協(xié)商MSS大小,傳輸窗口調(diào)節(jié)因子,時間戳等。
-
標(biāo)志字段 6bit
ACK位用于指示該報文段包括對一個已被成功接收的報文段的確認(rèn)。
RST,SYN,FIN位用于連接的建立與拆除。
PSH位指示接收方應(yīng)立即將數(shù)據(jù)交付上層。
URG位指示報文段中存在被發(fā)送端上層實(shí)體設(shè)置為緊急的數(shù)據(jù)。
在實(shí)踐中,PSH,URG未被使用。 (然鵝可以監(jiān)測到一些報文的PSH位被置位)
TCP可靠數(shù)據(jù)傳輸
序號和確認(rèn)號
TCP將數(shù)據(jù)視為無結(jié)構(gòu)的有序字節(jié)流。
報文段序號 序號建立在傳送的字節(jié)流上而非建立在傳送的報文段序列上。報文段序號是該報文段首字節(jié)的字節(jié)流編號。發(fā)送方TCP隱式地對字節(jié)流中的每一個字節(jié)編號,將一個報文段中首字節(jié)的字節(jié)編號作為該報文段的序號。
確認(rèn)號 主機(jī)A填充進(jìn)報文段的確認(rèn)號是主機(jī)A期望從主機(jī)B收到的下一字節(jié)的序號。
累計(jì)確認(rèn) TCP只確認(rèn)流中至第一個丟失字節(jié)為止的字節(jié)。即確認(rèn)號之前的所有字節(jié)都已正確接收。
失序報文段 TCP RFC 中未規(guī)定如何處理收到的失序報文段。實(shí)現(xiàn)者可以令接收方直接丟棄失序報文段,也可以令接收方緩存失序的字節(jié)。實(shí)踐中一般緩存失序的字節(jié)。
初始序號 一條TCP連接雙方可以隨機(jī)地選擇初始序號,以減小將網(wǎng)絡(luò)中的其它報文段(先前建立,現(xiàn)已關(guān)閉的連接)誤認(rèn)為本連接報文段的可能。
確認(rèn)信號 確認(rèn)報文段可以在一個獨(dú)立的報文段中傳輸(數(shù)據(jù)字段為空),也可以被一個含有效數(shù)據(jù)的報文段捎帶。
丟包檢測與恢復(fù)
- TCP提供定時器超時和冗余ACK兩種丟包檢測機(jī)制(冗余ACK也可表征包錯誤)
- 相應(yīng)地,TCP提供超時重傳和快速重傳兩種丟包恢復(fù)機(jī)制(快速重傳也可恢復(fù)包錯誤)
TCP超時機(jī)制
- TCP需要超時重傳機(jī)制以處理報文段的丟失。
一個重要的問題是如何設(shè)置超時間隔的長度。
RTT可以作為超時間隔長度設(shè)置的一個重要參考。
往返時間估計(jì)
往返時延(Round-Trip Time,RTT) 從發(fā)送端發(fā)送一段數(shù)據(jù)開始,到發(fā)送端收到來自接收端的確認(rèn)總共經(jīng)歷的時延。
RTT由三個部分決定:鏈路的傳播時間,端系統(tǒng)的處理時間,路由器的緩存中的排隊(duì)和處理時間。
樣本RTT(SampleRTT) 報文段的樣本RTT是 從某報文段交付IP到對該報文段的確認(rèn)被收到之間的時間量。TCP根據(jù)具體實(shí)現(xiàn)在某些時刻作樣本RTT測量。只可能為已發(fā)送未確認(rèn)報文段做測量,不會為已重傳報文段做測量
報文段的樣本RTT會隨著路由器擁塞和端系統(tǒng)負(fù)載情況變化,任一給定樣本RTT都是非典型的。
平均RTT(EstimatedRTT) TCP維護(hù)樣本RTT的均值,每獲得一個新樣本就更新該均值。
這是一種老化算法,或稱指數(shù)加權(quán)移動平均。新樣本權(quán)重大于老樣本權(quán)重。
a常取1/8
偏差RTT(DevRTT) 描述RTT的偏差
b常取1/4
RTT波動越大,DevRTT越大
超時間隔加倍
- 每當(dāng)超時事件發(fā)生時,TCP會重置定時器,且新TimeoutInterval為原TimeoutInterval的兩倍。而在其它情況下,TimeoutInterval或根據(jù)EstimatedRTT和DevRTT計(jì)算,或使用初始值。
- 超時間隔加倍潛在的提供了一定的擁塞控制功能。因?yàn)槌瑫r事件很可能是由網(wǎng)絡(luò)擁塞引起的,超時間隔加倍有助于緩解擁塞。
重傳超時間隔 TimeoutInterval
(0) 初始值
(1) 正常事件
(2) 超時事件
即通常情況下超時間隔大于平均往返時間,RTT波動越大,超時間隔的余量也應(yīng)越大。
初始TimeoutInterval常設(shè)為1秒,出現(xiàn)超時后TimeoutInterval翻倍
快速重傳
報文丟失時,因超時周期可能較長,通過超時機(jī)制觸發(fā)的重傳可能導(dǎo)致端到端時延過長。
冗余ACK 是發(fā)送方檢測丟包的另一手段。冗余ACK即對同一個報文段的多個ACK。
快速重傳
發(fā)送方收到三個冗余ACK,即收到同一個報文的四個ACK時,執(zhí)行快速重傳,即在超時事件發(fā)生之前重傳丟失的報文段。
為什么是三次冗余ACK?因?yàn)榉纸M重排(亂序)也會導(dǎo)致冗余ACK,三次冗余ACK從概率上或者說從實(shí)踐經(jīng)驗(yàn)上強(qiáng)烈地指示發(fā)送方很可能發(fā)生了丟包而非亂序。
收發(fā)雙方行為
發(fā)送方事件
- 接收上層數(shù)據(jù)
- 定時器超時
- 收到ACK
接收方ACK產(chǎn)生策略 [RFC 5681]
假定接收方期望下一個到達(dá)的報文段為i
- 若 報文段i到達(dá),且i之前的所有報文都已被確認(rèn)(發(fā)送了i-1的ACK) 則 延遲ACK。等待報文段i+1 500ms,若500ms后i+1未到達(dá),發(fā)送i的ACK
- 若 報文段i到達(dá),且i之前有報文未被確認(rèn)(i-1的ACK未被發(fā)送) 則 立即發(fā)送單個累積ACK(i的ACK),以確認(rèn)兩個按序報文段
- 若 報文段j到達(dá),j>i,即檢測出失序 則 立即發(fā)送一個冗余ACK(即發(fā)送i-1的ACK)以指示下一個期待的報文段為i
- 若 報文段i到達(dá),且i能部分或完全填充之前失序接收的報文序列間的間隔, 則 立即發(fā)送i的ACK
TCP差錯恢復(fù)機(jī)制——回退N步與選擇重傳
TCP使用累積確認(rèn)技術(shù),正確接收但失序的報文段不會被接收方逐個確認(rèn),對報文段i的確認(rèn)代表i之前的所有報文都已正確接收。
基于累積確認(rèn),TCP發(fā)送方僅需維護(hù)已發(fā)送但未被確認(rèn)的最小序號和下一個待發(fā)送字節(jié)的序號即可。
大多數(shù)TCP實(shí)現(xiàn)會將正確接收但失序的報文段緩存起來。當(dāng)報文i的ACK超時后,TCP不會依照回退N步的策略將報文段i,i+1.....N都重傳,而是只重傳報文段i。
TCP的差錯恢復(fù)機(jī)制是回退N步與選擇重傳的結(jié)合。
流量控制
速度匹配服務(wù),即匹配發(fā)送方的發(fā)送速率與接收方的接收速率。
TCP連接的兩側(cè)有各自的緩沖區(qū),若發(fā)送/接收速率不匹配,易造成緩沖區(qū)溢出。流量控制與擁塞控制 兩者的措施都是抑制發(fā)送方,但兩者目的不同。流量控制在接收方速率低于發(fā)送方速率時抑制發(fā)送方,擁塞控制在網(wǎng)絡(luò)擁塞時抑制發(fā)送方。
接收窗口 發(fā)送方維護(hù)的一個狀態(tài)變量,用以實(shí)現(xiàn)流量控制。接收窗口給發(fā)送方關(guān)于接收方還有多少可用緩存空間的指示。
接收方在給發(fā)送方的報文中,包含關(guān)于自身剩余緩存大小的字段,即接收窗口字段。
發(fā)送方應(yīng)當(dāng)保證所有已發(fā)送未確認(rèn)分組的總數(shù)據(jù)量不會超出接收窗口。
零接收窗口 在接收窗口為0時,若完全抑制發(fā)送方,則即使將來接收方的緩存有空余,也無法通知發(fā)送方。故即使在接收窗口為0時,發(fā)送方也會發(fā)生帶一個字節(jié)數(shù)據(jù)的報文段,以備接收方確認(rèn)。
TCP連接管理
本節(jié)考察TCP連接的建立與拆除。
連接建立
三次握手
-
SYN報文段m1
客戶端TCP向服務(wù)端TCP發(fā)送一個特殊TCP報文段m1,m1被稱為SYN報文段;
m1不含應(yīng)用層數(shù)據(jù);
m1的首部中標(biāo)志位SYN置為1;
客戶端還會選擇一個隨機(jī)序號client_isn,置于m1的序號字段中,作為發(fā)送方初始序號; -
SYNACK報文段m2
當(dāng)m1到達(dá)服務(wù)端后,服務(wù)器為服務(wù)器側(cè)的該TCP連接分配緩存和變量,并向客戶TCP發(fā)送允許連接的報文段m2;
m2不含應(yīng)用層數(shù)據(jù);
m2的SYN位被置位1;
m2首部的確認(rèn)號字段被置為client_isn+1;
服務(wù)器選擇自己的初始序號server_isn,將之置于序號字段; -
確認(rèn)與數(shù)據(jù)報文段m3
客戶端收到m2后,為該TCP分配緩存和變量;
客戶向服務(wù)端發(fā)送報文段m3;
m3對服務(wù)器的允許連接報文段m2進(jìn)行了確認(rèn),即將server_isn+1置于確認(rèn)字段;
此時連接已經(jīng)建立,故m3的SYN比特置為0;
報文段m3中可攜帶有效負(fù)載;
三次握手之后,TCP連接上可用發(fā)送數(shù)據(jù)報文段。數(shù)據(jù)報文段的SYN比特都被置為0。
SYN洪泛
注意在三次握手中,第一次握手發(fā)起方不會為TCP分配資源,第二次握手接收方會為TCP分配資源,第三次握手發(fā)起方會為TCP分配資源。
故而,發(fā)起方若只發(fā)送第一次握手,就可以在很少的代價下(發(fā)起方不必為TCP維護(hù)資源)讓接收方付出較大的代價(接收方為TCP分配資源直至等待第三次握手超時)。
SYN cookie
SYN cookie技術(shù)可以很好地應(yīng)對SYN洪泛攻擊。對于部署了SYN cookie的操作系統(tǒng),接收方在第二次握手時不會分配資源,而是把狀態(tài)信息,TCP標(biāo)識(雙方IP,port),接收方秘密值一起hash加密后作為初始序號,放置到第二次握手的序號字段中。接收方只有在收到第三次握手信號并驗(yàn)證后才會為TCP分配資源。
在這種情況下,要施時SYN洪泛的發(fā)起方必須消耗較多資源維護(hù)連接信息。
連接拆除
參與TCP連接的兩者之任一都可以終止該連接。連接結(jié)束后,端系統(tǒng)中的相關(guān)資源將被釋放。
終止連接時,終止發(fā)起方發(fā)送一個特殊的TCP報文段,該報文段首部行中的FIN標(biāo)志位被置為1;
另一方接收到該報文段后,向發(fā)送方回送一個確認(rèn)報文段,并向終止發(fā)起方發(fā)送自己的終止報文段,該報文段中FIN標(biāo)志位為1;
最后,終止發(fā)起方對另一方的終止報文段進(jìn)行確認(rèn);
套接字不匹配
考察端系統(tǒng)收到一個TCP報文段,而該報文段沒有匹配套接字的情況,即沒有服務(wù)端進(jìn)程在監(jiān)聽相應(yīng)端口的情況。
此時,主機(jī)向源發(fā)送一個特殊的重置報文段,該報文段將RST位置為1。
UDP套接字不匹配時,主機(jī)向源發(fā)送一個特殊的ICMP數(shù)據(jù)報。