TCP保證可靠性的舉措


連接管理

TCP是面向連接的,三次握手和四次揮手都是爲了保證本次數據傳送的可靠性,這裏不做贅述
如果想了解具體的三次握手和四次揮手,請戳這裏->TCP三次握手四次揮手詳解


序號

保證數據段的按序到達

  • TCP是面向字節流的,它對每一個字節都進行了編號,比如發送端發送了一個1~80字節的數據,接收端拿到數據段以後,就會回覆一個ack爲81的確認,表明81字節之前的數據都成功接收到了。
  • 接收端也是根據序號來對收到的數據進行排序,如果中間有某個數據報丟了,則之後的數據報還是會接受,但是不會對發送端返回之後的確認,而是會重複發送對丟失處之前數據的確認,保證發送端會對丟失數據段進行重發
  • TCP規定,若確認號 = N,則表明:到序號 N - 1爲止的所有數據都已正確收到。
  • 建立連接時,雙方發送的SYN報文和ACK報文段都是不能攜帶數據的,但是會消耗一個序號,這個序號通常是隨機值。
  • 建立連接後,比如發送端發送1~80字節的數據,則它的序號就是1,之後所發的報文段是從80開始的,下一個報文段序號就是81.
  • TCP規定,首部中序號字段值是本報文段所發送數據的第一個字節的序號。

確認應答機制

TCP中對發送的每一個字節都進行了編號,也就是序列號,接收端收到一個數據段後,便會對該數據段進行確認,並回應一個ACK報文,每一個ACK報文中帶有對應的確認序號,意思就是告訴發送端,我成功接受了你發的哪些數據,下一次你應該從哪裏開始發


超時重傳機制

這裏寫圖片描述
主機A發送給主機B數據報後一段時間內如果沒有收到主機B對應的確認報文,就認爲這一個或者這幾個數據報都丟失了,即觸發重傳機制,重新發送沒有被確認的報文,

  • 放置片段到重傳隊列中,並啓動計時器:TCP在發送包含數據的片段後,片段的一份複製就會被放到重傳隊列中,然後啓動計時器,因此,在某些時間點,每一個片段都會被放到重傳隊列中,隊列按照計時器的剩餘時間來排序,因此TCP就可以追蹤到哪幾個計時器在最短時間內超時
  • 確認處理:如果在計時器超市之前收到了確認信息,就把該片段從重傳隊列中移除
  • 超時重傳:如果在計時器超時之前沒有收到確認信息,則相應片段被重新發送給對方,即重傳機制,但是TCP也不能保證重傳報文的可靠性,所以該報文依然會處於重傳隊列中,並重新計時,如果還是超時,則重複這一動作,而且超時時間會設置的較之前長,但是TCP只會重傳一定數量的次數,因此當超過這個次數時,TCP會檢查故障並斷開連接
  • 這個等待的時間被稱爲RTO,RTO也是根據RTT(傳輸往返時間)來確定的,也和當時網絡的狀態有關係,需要通過具體算法實現,不是確定值
    • 如果超時時間設置的太長,會影響整體的重傳效率
    • 如果超時時間設置的太短,會頻繁發送很多重複的包
  • 去重:不光是主機A的報文可能丟失,主機B的確認報文也可能丟失了,所以在主機A重傳以後,主機B會收到重複的報文,TCP會根據報文中的序列號來移除重複收到的報文
    這裏寫圖片描述

流量控制

接收端處理數據的速度是有限的,如果發送端發的太快,就會導致接收端的接收緩衝區被塞滿,這時發送端再持續發送數據的話就會引起丟包,繼而引發發送端的超時重傳等等一系列反應,導致資源浪費。
TCP中引入了流量控制機制,意思就是根據接收端處理數據的能力來控制發送端發送數據的速度。

  • 接收端將自己接收緩衝區的空閒空間的大小填充到TCP的報文頭部中的窗口大小的字段中,通過ACK確認應答發送給發送端
  • 如果接收端的接收緩衝區快滿了,接收端就會將窗口大小設置爲一個更小的值發送給發送端,這時發送端的發送速度就會減緩
  • 如果接收端接收緩衝區徹底滿了,接收端就會將窗口大小設置爲0,這時發送端便停止發送數據段,但是會定時的發送一個窗口探測報文,以此來獲取接收端的接收緩衝區狀態。

我們的TCP首部中有個16位窗口字段,但是實際的窗口大小最大值不一定是65535字節,TCP首部40字節選項中還有一個窗口擴大因子M,實際的窗口大小是窗口字段的值左移M位


擁塞控制

雖然TCP中有了滑動窗口機制,能夠高效可靠的發送大量的數據,但是也不可以從一開始就發送大量數據段,因爲網絡上有很多的計算機,可能此時的網絡就已經比較擁堵了,這就會嚴重影響TCP傳輸的效率和性能

TCP引入“慢啓動”機制,開始先發送少量數據,探清當前網絡狀態,再決定以多大的速度發送數據

這裏寫圖片描述

  • 引入擁塞窗口的概念,TCP開始傳輸數據的時候,擁塞窗口設置爲1
  • 當收到一個ACK後,擁塞窗口加1,當經過一個傳輸輪次(其實就是往返時間RTT)後,擁塞窗口就是加倍
  • 每次發送數據段的時候,拿着擁塞窗口和接收端反饋的窗口大小作比較,取較小的值作爲實際發送數據的大小
  • 擁塞窗口的增長是指數級別的,“慢啓動”只是開始時比較慢,後來發送速度會越來越快
  • 但是擁塞窗口也有一個閥值,到達或超過閥值後就變爲線性增長,也就是擁塞避免算法,而不是指數級別增長了
    這裏寫圖片描述

  • 慢啓動時,擁塞窗口的閾值是16個報文段,到達該閾值後執行擁塞避免算法,指數增長變爲線性增長

  • 網絡中出現阻塞(沒有收到確認)時,閾值被設置爲出現擁塞狀況時擁塞窗口的一半,並開始“慢啓動”算法
  • 但是當遇到快重傳(遇到三個同樣的重複確認)時,閾值依舊設爲一半,但是並不執行“慢啓動”算法,而是執行快恢復算法,擁塞直接從閾值開始線性增長
  • 少量的丟包,我們僅僅是觸發超時重傳或者快重傳,大量的丟包我們纔會認爲網絡擁塞了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章