tcp重傳機制,流量控制,擁塞控制

tcp

重傳機制

方式

  • 超時重傳linux

    • 概念算法

      • 發送數據時設定一個定時器,若在指定時間內沒有收到應答報文,就會重發數據
    • 發生超時重傳的時機緩存

      • 數據包丟失
      • 確認應答丟失
    • 超時時間RTO選擇網絡

      • 略大於RTT
      • 重傳超時策略:超時時間間隔加倍
  • 快速重傳socket

    • 概念tcp

      • 發送方能夠一次發送多個數據包,若中間的某個數據包丟失了,接收方會一直回覆這個丟失的數據包應答報文,接收方若收到三次這個數據包的應答報文,就知道該報文尚未被接收方收到,能夠重傳這個數據包
    • 問題ip

      • 由於接收方對後續的數據包也返回了丟失的那個應答報文,因此發送方不知道後續的數據包是否丟失,也就不知道應該重傳丟失的數據包仍是把後續的數據包都重傳
  • SACK效率

    • 概念擴展

      • 選擇性重傳,解決快速重傳不知道重傳哪些報文的缺點
    • 實現方式循環

      • 在tcp頭部「選項」字段里加一個SACK,將緩存的地圖發送給發送方,這樣發送方就知道哪些數據接收方收到了,哪些數據接收方沒有收到,以便重傳接收方沒有收到的數據
    • 參數

      • 要開啓SACK,須要發送方和接收方都支持:net.ipv4.tcp_sack,linux2.4之後默認打開
  • D-SACK

    • 概念

      • 對SACK的擴展,經過SACK告訴發送方哪些數據被重複接收了
    • 實現方式

      • 如有發送方有重複發送數據包,會經過SACK告訴發送方這這個數據包已被髮送過
    • 好處

      • 發送方可以知道是發出去的包丟了仍是接收方發送的ACK丟了

        • SACK若告知這個包已被髮送過,那麼說明是接收方發送的ACK丟了
      • 發送方能夠知道發出去的數據包是否被網絡延遲了

        • 發送方在延遲以後會重發數據包,以前的數據包若一段時間後到達了接收方,接收方返回的應答報文中能看到該數據包已經被接收了,是個重複的報文,說明被網絡延遲了,而重發的數據包已被收到

序列號與確認應答(ACK)保證了tcp的可靠傳輸

滑動窗口

引入緣由

  • 每發送一個數據都須要進行確認應答,收到了再發送下一個,效率比較低。在窗口大小限制範圍內,能夠無需等待上一個數據包應答,就能夠繼續發送下一個數據包

錯誤處理

  • 累計應答

    • 發送數據包丟失

      • 若發送方發送了一批數據包,中間的某個數據包丟失,那麼接收方回覆應答時ACK會回覆丟失的那個數據包,這樣接收方就知道丟失的數據包是哪個,所以能夠從新發送;
    • 應答報文丟失

      • 若接收方返回的這一組數據包中,某一個應答報文丟失了,只要最後一個應答報文發送成功了,接收方就知道這個數據包的實際上是收到了的

窗口大小

  • tcp頭裏的字段window

    • 接收方經過這個字段告訴接收方本身還有多少緩衝區能夠接收數據,發送方就能夠根據接收方的處理來發送數據,以避免致使接收方處理不過來,所以窗口的大小是由接收方決定的
  • 接收方和發送方的窗口

    • 接收方和發送方的窗口大小基本相等,由於發送方的窗口大小取決於接收方,當接收方處理能力快,窗口變大,經過tcp報文中的window字段告訴接收方,若傳輸過程當中出現了延遲,因此這時兩個窗口大小不一致

擁塞控制

概念

  • 流量控制是避免發送方填滿接收方的緩存,但若由於其餘主機之間的通訊形成網絡擁堵,會有超時和丟包發生,這樣會致使重傳 ,網絡負擔會更大,進入惡性循環,因此tcp不能忽略網絡上發生的事,當網絡發生擁堵時,它會下降數據的發送量。擁塞控制的目的就是避免發送方的數據填滿整個網絡

擁塞窗口cwnd

  • 發送窗口swnd和接收窗口rwnd是約等於的關係,有了擁塞窗口的概念後,發送窗口swnd=min(cwnd, rwnd)

    • 網絡中沒有出現擁塞,cwnd會增大,反之會減少
  • 判斷網絡擁塞的方法

    • 發生超時重傳
  • 相關算法

    • 慢啓動

      • tcp剛創建鏈接完成,會有個慢啓動的過程,一點一點提升發送數據包的數量
      • 每接收到一個ack,cwnd大小就會加1,初始化時,cwnd大小爲1,即cwnd大小按指數級增加
      • ssthreshold,slow start thresold,慢啓動門限

        • 當cwnd < ssthreshold時,會採用慢啓動算法
        • 當cwnd >= ssthreshold時,會使用擁塞避免算法
    • 擁塞避免

      • 每收到一個ack,cwnd增長1/cwnd。即囤積了cwnd這麼多個包後,一次性發送過去。以後都會這樣發送,cwnd按線性增加
      • 當一直這麼增加,會慢慢進入擁塞情況,因而開始出現丟包現象,這時須要對丟失的數據進行重傳,當觸發了重傳機制也就進入了擁塞發生算法
    • 擁塞發生

      • 超時重傳

        • ssthreshold設爲cwnd/2
        • cwnd設爲1
        • 即一旦發生超時重傳就從新進入慢啓動
      • 快速重傳

        • 當接收方發現丟了一箇中間包時,會發送三次丟失包的ack,發送方收到後就會快速重傳丟失的包
        • tcp認爲這時候擁塞並不嚴重,只丟了一小部分包,因而

          • cwnd = cwnd/2
          • ssthreshold變爲cwnd
        • 而後進入快速恢復算法
    • 快速恢復

      • cwnd = ssthresold+3
      • 重傳丟失的數據包
      • 若是再收到重複的ack,那麼cwnd+1
      • 收到新的ack後,cwnd變爲ssthreshold,而後進入擁塞避免算法

流量控制

概念

  • 流量控制是基於滑動窗口實現的,tcp經過讓接收方指明但願從發送方接收的數據大小(窗口大小)來進行流量控制

問題

  • 描述

    • 接收方收到了太多數據,暫時不能接收數據了,因而返回了window大小爲0
    • 發送方發現window大小爲0,因而暫時再也不發送數據包了
    • 接收方處理完數據,能夠繼續處理了,因而在以前已處理完的數據包的應答報文中更新窗口大小,可是該應答報文丟失了,致使接收方沒能收到,因而就一直不發送新的數據包了,出現了死鎖
  • 解決方法

    • tcp爲每一個鏈接設定一個持續計時器,只有發起鏈接的一方從對方收到零窗口通知,就啓動計時器;若是持續計時器超時,就會發送窗口探測報文,對方會給出本身如今接收窗口的大小
    • 窗口探測次數通常爲3次,每次大約30-60秒,若是三次後窗口仍是0,有的tcp實現會發起RST報文來中斷鏈接

糊塗窗口綜合症

  • 發送方

    • 發送方雖然知道窗口很大,可是每次都只發送不多的數據
  • 接收方

    • 接收方太忙,每次都只能從window中取出不多的數據,而後通知發送方,這樣發送方每次也只發送不多的數據
  • 問題

    • 每次都只傳輸小包,效率低
  • 解決方法

    • 讓接收方不通知小窗口給發送方

      • 當窗口大小小於min(mss,(緩存空間/2))時,就會向發送方通知窗口爲0,阻止發送方後續發送數據過來

        • 注mss,Maximum Segment Size,最大報文長度,MSS是TCP報文段中的數據字段的最大長度,不包括TCP首部的長度
    • 讓發送方不發送小包

      • Nagel算法

        • 發送條件

          • 等到窗口大小>=mss或數據大小>=mss
          • 收到以前發送數據的ack應答
        • 知足發送條件的兩點纔會發送
        • 設置關閉

          • Nagel算法默認開啓,若想要關閉,須要在socket設置TCP_NODELAY來關閉。沒有全局參數,須要每一個應用根據本身的特色來關閉
相關文章
相關標籤/搜索