計(jì)算機(jī)網(wǎng)絡(luò)——傳輸層-TCP

計(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限制。

TCP報文段.png

首部字段結(jié)構(gòu)

  1. 源端口號 用于多路復(fù)用/分解
  2. 目的端口號 用于多路復(fù)用/分解
  3. 序號字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
  4. 確認(rèn)號字段 32bit 用于實(shí)現(xiàn)可靠數(shù)據(jù)傳輸
  5. 接收窗口字段 16bit 用于流量控制
  6. 檢驗(yàn)和字段 16bit 用于差錯檢測
  7. 首部長度字段 4bit 指示TCP首部長度。(選項(xiàng)字段常為空,故TCP首部典型長度為20byte)
  8. 選項(xiàng)字段 可選的,變長的。 可用于協(xié)商MSS大小,傳輸窗口調(diào)節(jié)因子,時間戳等。
  9. 標(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的均值,每獲得一個新樣本就更新該均值。
EstimatedRTT = (1-a) * SampleRTT + a * SampleRTT
這是一種老化算法,或稱指數(shù)加權(quán)移動平均。新樣本權(quán)重大于老樣本權(quán)重。
a常取1/8

偏差RTT(DevRTT) 描述RTT的偏差
DevRTT = (1-b) * DevRTT + b * | SampleRTT - EstimatedRTT |
b常取1/4
RTT波動越大,DevRTT越大

超時間隔加倍

  • 每當(dāng)超時事件發(fā)生時,TCP會重置定時器,且新TimeoutInterval為原TimeoutInterval的兩倍。而在其它情況下,TimeoutInterval或根據(jù)EstimatedRTT和DevRTT計(jì)算,或使用初始值。
  • 超時間隔加倍潛在的提供了一定的擁塞控制功能。因?yàn)槌瑫r事件很可能是由網(wǎng)絡(luò)擁塞引起的,超時間隔加倍有助于緩解擁塞。

重傳超時間隔 TimeoutInterval

TimeoutInterval = TimeoutInterval_{(0)} (0) 初始值
TimeoutInterval = EstimatedRTT + 4*DevRTT (1) 正常事件
TimeoutInterval = 2*TimeoutInterval (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ā)送方事件

  1. 接收上層數(shù)據(jù)
  2. 定時器超時
  3. 收到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連接的建立與拆除。

連接建立

三次握手

  1. 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ā)送方初始序號;
  2. 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,將之置于序號字段;
  3. 確認(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ù)報。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容