計(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ù)傳輸
即保證分組不錯(cuò)不丟不亂 -
擁塞控制
防止任何一條TCP連接用過(guò)多的流量淹沒(méi)通信主機(jī)之間的鏈路和交換設(shè)備以優(yōu)化整個(gè)因特網(wǎng)環(huán)境
TCP特點(diǎn)
三次握手 兩進(jìn)程在通過(guò)TCP傳遞傳遞有效數(shù)據(jù)前,必須互相握手柒瓣,即發(fā)送某些預(yù)備報(bào)文段以建立確保數(shù)據(jù)傳輸?shù)膮?shù)儒搭。
客戶首先發(fā)出一個(gè)特殊報(bào)文段,服務(wù)器用另一個(gè)特殊報(bào)文段響應(yīng)芙贫,最后搂鲫,客戶用第三個(gè)特殊報(bào)文段作為響應(yīng)。前兩個(gè)特殊報(bào)文段不承載有效載荷磺平,第三個(gè)報(bào)文段可以承載有效載荷魂仍。面向連接
通信雙方在發(fā)送數(shù)據(jù)之前必須建立連接。
TCP協(xié)議僅在端系統(tǒng)中運(yùn)行拣挪,連接狀態(tài)在端系統(tǒng)中維護(hù)擦酌,中間網(wǎng)絡(luò)元素不會(huì)維護(hù)TCP連接狀態(tài)。雙全工服務(wù) AB兩進(jìn)程間的TCP連接可以從A向B傳輸數(shù)據(jù)也可以從B向A傳輸數(shù)據(jù)菠劝。
TCP是雙全工的點(diǎn)對(duì)點(diǎn) TCP是點(diǎn)對(duì)點(diǎn)的赊舶,不支持多播
多播: 一次發(fā)送操作中,從一個(gè)發(fā)送方將數(shù)據(jù)傳輸給多個(gè)接收方緩存上層數(shù)據(jù) 發(fā)送方應(yīng)用層通過(guò)套接字向TCP傳遞數(shù)據(jù)闸英,TCP將數(shù)據(jù)引導(dǎo)至該連接的發(fā)送緩存中锯岖,發(fā)送緩存在三次握手期間設(shè)置。
最大報(bào)文段(有效載荷)長(zhǎng)度(Maximun Segment Size,MSS) TCP可以從緩存中取出并放入報(bào)文段中的最大數(shù)據(jù)數(shù)量甫何。 MSS通常根據(jù)最大鏈路層幀長(zhǎng)度設(shè)置出吹。該設(shè)置保證一個(gè)TCP報(bào)文段封裝在IP數(shù)據(jù)報(bào)中后,再加上TCP/IP的首部辙喂,其總長(zhǎng)度將適合單個(gè)鏈路層幀捶牢。
流水線機(jī)制 TCP使用流水線機(jī)制鸠珠,但結(jié)合了GBN和SR的特點(diǎn),在收發(fā)雙方都設(shè)置有緩存
TCP連接的組成
- 兩個(gè)端系統(tǒng)中秋麸,各自的TCP緩存渐排,變量,與進(jìn)程連接的套接字灸蟆。
- 兩端系統(tǒng)之間的網(wǎng)絡(luò)元素沒(méi)有為該連接分配任何緩存和變量驯耻。
TCP報(bào)文段
TCP報(bào)文段由首部字段和數(shù)據(jù)字段組成。數(shù)據(jù)字段最大長(zhǎng)度由MSS限制炒考。
首部字段結(jié)構(gòu)
- 源端口號(hào) 用于多路復(fù)用/分解
- 目的端口號(hào) 用于多路復(fù)用/分解
- 序號(hào)字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
- 確認(rèn)號(hào)字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
- 接收窗口字段 16bit 用于流量控制
- 檢驗(yàn)和字段 16bit 用于差錯(cuò)檢測(cè)
- 首部長(zhǎng)度字段 4bit 指示TCP首部長(zhǎng)度可缚。(選項(xiàng)字段常為空,故TCP首部典型長(zhǎng)度為20byte)
- 選項(xiàng)字段 可選的斋枢,變長(zhǎng)的帘靡。 可用于協(xié)商MSS大小,傳輸窗口調(diào)節(jié)因子瓤帚,時(shí)間戳等描姚。
-
標(biāo)志字段 6bit
ACK位用于指示該報(bào)文段包括對(duì)一個(gè)已被成功接收的報(bào)文段的確認(rèn)。
RST戈次,SYN,FIN位用于連接的建立與拆除轩勘。
PSH位指示接收方應(yīng)立即將數(shù)據(jù)交付上層。
URG位指示報(bào)文段中存在被發(fā)送端上層實(shí)體設(shè)置為緊急的數(shù)據(jù)朝扼。
在實(shí)踐中赃阀,PSH,URG未被使用擎颖。 (然鵝可以監(jiān)測(cè)到一些報(bào)文的PSH位被置位)
TCP可靠數(shù)據(jù)傳輸
序號(hào)和確認(rèn)號(hào)
TCP將數(shù)據(jù)視為無(wú)結(jié)構(gòu)的有序字節(jié)流榛斯。
報(bào)文段序號(hào) 序號(hào)建立在傳送的字節(jié)流上而非建立在傳送的報(bào)文段序列上。報(bào)文段序號(hào)是該報(bào)文段首字節(jié)的字節(jié)流編號(hào)搂捧。發(fā)送方TCP隱式地對(duì)字節(jié)流中的每一個(gè)字節(jié)編號(hào)驮俗,將一個(gè)報(bào)文段中首字節(jié)的字節(jié)編號(hào)作為該報(bào)文段的序號(hào)。
確認(rèn)號(hào) 主機(jī)A填充進(jìn)報(bào)文段的確認(rèn)號(hào)是主機(jī)A期望從主機(jī)B收到的下一字節(jié)的序號(hào)允跑。
累計(jì)確認(rèn) TCP只確認(rèn)流中至第一個(gè)丟失字節(jié)為止的字節(jié)王凑。即確認(rèn)號(hào)之前的所有字節(jié)都已正確接收。
失序報(bào)文段 TCP RFC 中未規(guī)定如何處理收到的失序報(bào)文段聋丝。實(shí)現(xiàn)者可以令接收方直接丟棄失序報(bào)文段索烹,也可以令接收方緩存失序的字節(jié)。實(shí)踐中一般緩存失序的字節(jié)弱睦。
初始序號(hào) 一條TCP連接雙方可以隨機(jī)地選擇初始序號(hào)百姓,以減小將網(wǎng)絡(luò)中的其它報(bào)文段(先前建立,現(xiàn)已關(guān)閉的連接)誤認(rèn)為本連接報(bào)文段的可能况木。
確認(rèn)信號(hào) 確認(rèn)報(bào)文段可以在一個(gè)獨(dú)立的報(bào)文段中傳輸(數(shù)據(jù)字段為空)垒拢,也可以被一個(gè)含有效數(shù)據(jù)的報(bào)文段捎帶旬迹。
丟包檢測(cè)與恢復(fù)
- TCP提供定時(shí)器超時(shí)和冗余ACK兩種丟包檢測(cè)機(jī)制(冗余ACK也可表征包錯(cuò)誤)
- 相應(yīng)地,TCP提供超時(shí)重傳和快速重傳兩種丟包恢復(fù)機(jī)制(快速重傳也可恢復(fù)包錯(cuò)誤)
TCP超時(shí)機(jī)制
- TCP需要超時(shí)重傳機(jī)制以處理報(bào)文段的丟失求类。
一個(gè)重要的問(wèn)題是如何設(shè)置超時(shí)間隔的長(zhǎng)度奔垦。
RTT可以作為超時(shí)間隔長(zhǎng)度設(shè)置的一個(gè)重要參考。
往返時(shí)間估計(jì)
往返時(shí)延(Round-Trip Time,RTT) 從發(fā)送端發(fā)送一段數(shù)據(jù)開(kāi)始尸疆,到發(fā)送端收到來(lái)自接收端的確認(rèn)總共經(jīng)歷的時(shí)延椿猎。
RTT由三個(gè)部分決定:鏈路的傳播時(shí)間,端系統(tǒng)的處理時(shí)間仓技,路由器的緩存中的排隊(duì)和處理時(shí)間鸵贬。
樣本RTT(SampleRTT) 報(bào)文段的樣本RTT是 從某報(bào)文段交付IP到對(duì)該報(bào)文段的確認(rèn)被收到之間的時(shí)間量。TCP根據(jù)具體實(shí)現(xiàn)在某些時(shí)刻作樣本RTT測(cè)量脖捻。只可能為已發(fā)送未確認(rèn)報(bào)文段做測(cè)量,不會(huì)為已重傳報(bào)文段做測(cè)量
報(bào)文段的樣本RTT會(huì)隨著路由器擁塞和端系統(tǒng)負(fù)載情況變化兆衅,任一給定樣本RTT都是非典型的地沮。
平均RTT(EstimatedRTT) TCP維護(hù)樣本RTT的均值,每獲得一個(gè)新樣本就更新該均值羡亩。
這是一種老化算法摩疑,或稱指數(shù)加權(quán)移動(dòng)平均。新樣本權(quán)重大于老樣本權(quán)重畏铆。
a常取1/8
偏差RTT(DevRTT) 描述RTT的偏差
b常取1/4
RTT波動(dòng)越大雷袋,DevRTT越大
超時(shí)間隔加倍
- 每當(dāng)超時(shí)事件發(fā)生時(shí),TCP會(huì)重置定時(shí)器辞居,且新TimeoutInterval為原TimeoutInterval的兩倍楷怒。而在其它情況下,TimeoutInterval或根據(jù)EstimatedRTT和DevRTT計(jì)算瓦灶,或使用初始值鸠删。
- 超時(shí)間隔加倍潛在的提供了一定的擁塞控制功能。因?yàn)槌瑫r(shí)事件很可能是由網(wǎng)絡(luò)擁塞引起的贼陶,超時(shí)間隔加倍有助于緩解擁塞刃泡。
重傳超時(shí)間隔 TimeoutInterval
(0) 初始值
(1) 正常事件
(2) 超時(shí)事件
即通常情況下超時(shí)間隔大于平均往返時(shí)間,RTT波動(dòng)越大碉怔,超時(shí)間隔的余量也應(yīng)越大烘贴。
初始TimeoutInterval常設(shè)為1秒,出現(xiàn)超時(shí)后TimeoutInterval翻倍
快速重傳
報(bào)文丟失時(shí)撮胧,因超時(shí)周期可能較長(zhǎng)桨踪,通過(guò)超時(shí)機(jī)制觸發(fā)的重傳可能導(dǎo)致端到端時(shí)延過(guò)長(zhǎng)。
冗余ACK 是發(fā)送方檢測(cè)丟包的另一手段趴樱。冗余ACK即對(duì)同一個(gè)報(bào)文段的多個(gè)ACK馒闷。
快速重傳
發(fā)送方收到三個(gè)冗余ACK酪捡,即收到同一個(gè)報(bào)文的四個(gè)ACK時(shí),執(zhí)行快速重傳纳账,即在超時(shí)事件發(fā)生之前重傳丟失的報(bào)文段逛薇。
為什么是三次冗余ACK?因?yàn)榉纸M重排(亂序)也會(huì)導(dǎo)致冗余ACK疏虫,三次冗余ACK從概率上或者說(shuō)從實(shí)踐經(jīng)驗(yàn)上強(qiáng)烈地指示發(fā)送方很可能發(fā)生了丟包而非亂序永罚。
收發(fā)雙方行為
發(fā)送方事件
- 接收上層數(shù)據(jù)
- 定時(shí)器超時(shí)
- 收到ACK
接收方ACK產(chǎn)生策略 [RFC 5681]
假定接收方期望下一個(gè)到達(dá)的報(bào)文段為i
- 若 報(bào)文段i到達(dá),且i之前的所有報(bào)文都已被確認(rèn)(發(fā)送了i-1的ACK) 則 延遲ACK卧秘。等待報(bào)文段i+1 500ms呢袱,若500ms后i+1未到達(dá),發(fā)送i的ACK
- 若 報(bào)文段i到達(dá)翅敌,且i之前有報(bào)文未被確認(rèn)(i-1的ACK未被發(fā)送) 則 立即發(fā)送單個(gè)累積ACK(i的ACK),以確認(rèn)兩個(gè)按序報(bào)文段
- 若 報(bào)文段j到達(dá)羞福,j>i,即檢測(cè)出失序 則 立即發(fā)送一個(gè)冗余ACK(即發(fā)送i-1的ACK)以指示下一個(gè)期待的報(bào)文段為i
- 若 報(bào)文段i到達(dá),且i能部分或完全填充之前失序接收的報(bào)文序列間的間隔蚯涮, 則 立即發(fā)送i的ACK
TCP差錯(cuò)恢復(fù)機(jī)制——回退N步與選擇重傳
TCP使用累積確認(rèn)技術(shù)治专,正確接收但失序的報(bào)文段不會(huì)被接收方逐個(gè)確認(rèn),對(duì)報(bào)文段i的確認(rèn)代表i之前的所有報(bào)文都已正確接收遭顶。
基于累積確認(rèn)张峰,TCP發(fā)送方僅需維護(hù)已發(fā)送但未被確認(rèn)的最小序號(hào)和下一個(gè)待發(fā)送字節(jié)的序號(hào)即可。
大多數(shù)TCP實(shí)現(xiàn)會(huì)將正確接收但失序的報(bào)文段緩存起來(lái)棒旗。當(dāng)報(bào)文i的ACK超時(shí)后喘批,TCP不會(huì)依照回退N步的策略將報(bào)文段i,i+1.....N都重傳铣揉,而是只重傳報(bào)文段i饶深。
TCP的差錯(cuò)恢復(fù)機(jī)制是回退N步與選擇重傳的結(jié)合。
流量控制
速度匹配服務(wù)老速,即匹配發(fā)送方的發(fā)送速率與接收方的接收速率粥喜。
TCP連接的兩側(cè)有各自的緩沖區(qū),若發(fā)送/接收速率不匹配橘券,易造成緩沖區(qū)溢出额湘。流量控制與擁塞控制 兩者的措施都是抑制發(fā)送方,但兩者目的不同旁舰。流量控制在接收方速率低于發(fā)送方速率時(shí)抑制發(fā)送方锋华,擁塞控制在網(wǎng)絡(luò)擁塞時(shí)抑制發(fā)送方。
接收窗口 發(fā)送方維護(hù)的一個(gè)狀態(tài)變量箭窜,用以實(shí)現(xiàn)流量控制毯焕。接收窗口給發(fā)送方關(guān)于接收方還有多少可用緩存空間的指示。
接收方在給發(fā)送方的報(bào)文中,包含關(guān)于自身剩余緩存大小的字段纳猫,即接收窗口字段婆咸。
發(fā)送方應(yīng)當(dāng)保證所有已發(fā)送未確認(rèn)分組的總數(shù)據(jù)量不會(huì)超出接收窗口。
零接收窗口 在接收窗口為0時(shí)芜辕,若完全抑制發(fā)送方尚骄,則即使將來(lái)接收方的緩存有空余,也無(wú)法通知發(fā)送方侵续。故即使在接收窗口為0時(shí)倔丈,發(fā)送方也會(huì)發(fā)生帶一個(gè)字節(jié)數(shù)據(jù)的報(bào)文段,以備接收方確認(rèn)状蜗。
TCP連接管理
本節(jié)考察TCP連接的建立與拆除需五。
連接建立
三次握手
-
SYN報(bào)文段m1
客戶端TCP向服務(wù)端TCP發(fā)送一個(gè)特殊TCP報(bào)文段m1,m1被稱為SYN報(bào)文段轧坎;
m1不含應(yīng)用層數(shù)據(jù)宏邮;
m1的首部中標(biāo)志位SYN置為1;
客戶端還會(huì)選擇一個(gè)隨機(jī)序號(hào)client_isn缸血,置于m1的序號(hào)字段中蜀铲,作為發(fā)送方初始序號(hào); -
SYNACK報(bào)文段m2
當(dāng)m1到達(dá)服務(wù)端后属百,服務(wù)器為服務(wù)器側(cè)的該TCP連接分配緩存和變量,并向客戶TCP發(fā)送允許連接的報(bào)文段m2;
m2不含應(yīng)用層數(shù)據(jù)变姨;
m2的SYN位被置位1族扰;
m2首部的確認(rèn)號(hào)字段被置為client_isn+1;
服務(wù)器選擇自己的初始序號(hào)server_isn,將之置于序號(hào)字段; -
確認(rèn)與數(shù)據(jù)報(bào)文段m3
客戶端收到m2后定欧,為該TCP分配緩存和變量;
客戶向服務(wù)端發(fā)送報(bào)文段m3渔呵;
m3對(duì)服務(wù)器的允許連接報(bào)文段m2進(jìn)行了確認(rèn),即將server_isn+1置于確認(rèn)字段;
此時(shí)連接已經(jīng)建立砍鸠,故m3的SYN比特置為0;
報(bào)文段m3中可攜帶有效負(fù)載;
三次握手之后扩氢,TCP連接上可用發(fā)送數(shù)據(jù)報(bào)文段。數(shù)據(jù)報(bào)文段的SYN比特都被置為0爷辱。
SYN洪泛
注意在三次握手中录豺,第一次握手發(fā)起方不會(huì)為TCP分配資源,第二次握手接收方會(huì)為TCP分配資源饭弓,第三次握手發(fā)起方會(huì)為TCP分配資源双饥。
故而,發(fā)起方若只發(fā)送第一次握手弟断,就可以在很少的代價(jià)下(發(fā)起方不必為TCP維護(hù)資源)讓接收方付出較大的代價(jià)(接收方為TCP分配資源直至等待第三次握手超時(shí))咏花。
SYN cookie
SYN cookie技術(shù)可以很好地應(yīng)對(duì)SYN洪泛攻擊。對(duì)于部署了SYN cookie的操作系統(tǒng)阀趴,接收方在第二次握手時(shí)不會(huì)分配資源昏翰,而是把狀態(tài)信息苍匆,TCP標(biāo)識(shí)(雙方IP,port)棚菊,接收方秘密值一起hash加密后作為初始序號(hào)浸踩,放置到第二次握手的序號(hào)字段中。接收方只有在收到第三次握手信號(hào)并驗(yàn)證后才會(huì)為TCP分配資源窍株。
在這種情況下民轴,要施時(shí)SYN洪泛的發(fā)起方必須消耗較多資源維護(hù)連接信息。
連接拆除
參與TCP連接的兩者之任一都可以終止該連接球订。連接結(jié)束后后裸,端系統(tǒng)中的相關(guān)資源將被釋放。
終止連接時(shí)冒滩,終止發(fā)起方發(fā)送一個(gè)特殊的TCP報(bào)文段微驶,該報(bào)文段首部行中的FIN標(biāo)志位被置為1;
另一方接收到該報(bào)文段后开睡,向發(fā)送方回送一個(gè)確認(rèn)報(bào)文段因苹,并向終止發(fā)起方發(fā)送自己的終止報(bào)文段,該報(bào)文段中FIN標(biāo)志位為1篇恒;
最后扶檐,終止發(fā)起方對(duì)另一方的終止報(bào)文段進(jìn)行確認(rèn);
套接字不匹配
考察端系統(tǒng)收到一個(gè)TCP報(bào)文段胁艰,而該報(bào)文段沒(méi)有匹配套接字的情況款筑,即沒(méi)有服務(wù)端進(jìn)程在監(jiān)聽(tīng)相應(yīng)端口的情況。
此時(shí)腾么,主機(jī)向源發(fā)送一個(gè)特殊的重置報(bào)文段奈梳,該報(bào)文段將RST位置為1。
UDP套接字不匹配時(shí)解虱,主機(jī)向源發(fā)送一個(gè)特殊的ICMP數(shù)據(jù)報(bào)攘须。