首頁>Club>
14
回覆列表
  • 1 # 使用者9128662948974

    kcp協議是傳輸層的一個具有可靠性的傳輸層ARQ協議。它的設計是為了解決在網路擁堵情況下tcp協議的網路速度慢的問題。kcp力求在保證可靠性的情況下提高傳輸速度。kcp協議的關注點主要在控制資料的可靠性和提高傳輸速度上面,因此kcp沒有規定下層傳輸協議,一般用udp作為下層傳輸協議,kcp層協議的資料包在udp資料報文的基礎上增加控制頭。當用戶資料很大,大於一個udp包能承擔的範圍時(大於mss),kcp會將使用者資料分片儲存在多個kcp包中。因此每個kcp包稱為一個分片。

      為了提供可靠性,kcp採用了重傳機制。為實現重傳機制,kcp為每個分片分配一個唯一標識,接收方收到一個包後告知傳送方接到的包的序號,傳送方接到確認後再繼續傳送。而如果傳送方在一定時間內(超時重傳時間)沒有接到確認,就說明資料包丟失了,傳送方需要重傳丟失的資料包,所以傳送方會把待確認的資料快取起來,方便重傳。

      停等的重傳機制傳送一個包後必須等待確認後再發下一個包,傳輸速度較慢,所以為了提高發送速度,傳送方可以不必再每傳送一個包後就進行等待確認,而是可以傳送多個包出去,然後等待接收方一一確認。又由於接收方不可能同時處理無限多的資料,因此需要限制傳送方往網路中傳送的資料數量。因此接收方限制傳送方在未收到確認之前只能傳送wnd大小的資料,這個機制叫做滑動視窗機制。kcp採用滑動視窗機制來提高發送速度。由於UDP在網路中的傳輸是不可靠的,因此會出現丟包和包的亂序。kcp是可靠的保證資料有序的協議,所以為了糾正包的亂序。接收方維護一個接收視窗。接收視窗有一個起始序號rcv_nxt以及尾序號rcv_nxt+rcv_wnd。如果接收視窗收到序號為rcv_nxt的分片那麼rcv_nxt就加一,形象一點的說法是滑動視窗右移,並把該資料放入接收佇列供應用層取用。如果收到的資料在視窗範圍內但不是rcv_nxt那麼就把資料儲存起來,等收到rcv_nxt序號的分片時再一併放入接收佇列供應用層取用。

      當網路擁堵嚴重時,會發生丟包,丟包發生時kcp為了保證可靠性需要重傳資料。而傳送方需要判斷什麼時候發生了丟包,以及丟了哪些包。為了解決這個問題,傳送方為快取佇列中的每個包設定了包序號和超時重傳時間。當檢測到當前時間超過了分片的超時重傳時間,該分片還沒有得到確認時就會觸發該分片的超時重傳。

  • 中秋節和大豐收的關聯?
  • DNF95版本大量玩家脫坑,原因無關普雷,而是策劃各種禮包騙氪,這說法你認可麼?