TCP是為流量設計的(每秒內可以傳輸多少KB的數據),講究的是充分利用帶寬。而 KCP是為流速設計的(單個數據包從一端發送到一端需要多少時間),以10%-20%帶寬浪費的代價換取了比 TCP快30%-40%的傳輸速度。TCP信道是一條流速很慢,但每秒流量很大的大運河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式兩種,通過以下策略達到提高流速的結果:
RTO翻倍vs不翻倍:
TCP超時計算是RTOx2,這樣連續丟三次包就變成RTOx8了,十分恐怖,而KCP啟動快速模式后不x2,只是x1.5(實驗證明1.5這個值相對比較好),提高了傳輸速度。
選擇性重傳 vs 全部重傳:
TCP丟包時會全部重傳從丟的那個包開始以后的數據,KCP是選擇性重傳,只重傳真正丟失的數據包。
SACK機制,每次ACK時還返回一組標記,告知發送方哪些Segment已經發送了
快速重傳:
發送端發送了1,2,3,4,5幾個包,然后收到遠端的ACK: 1, 3, 4, 5,當收到ACK3時,KCP知道2被跳過1次,收到ACK4時,知道2被跳過了2次,此時可以認為2號丟失,不用等超時,直接重傳2號包,大大改善了丟包時的傳輸速度。
延遲ACK vs 非延遲ACK:
TCP為了充分利用帶寬,延遲發送ACK(NODELAY都沒用),這樣超時計算會算出較大 RTT時間,延長了丟包時的判斷過程。KCP的ACK是否延遲發送可以調節。
延遲ACK:TCP為了充分利用帶寬,在一些情況下,接收方可能會收到多個數據段。在延遲發送ACK的情況下,接收方可以在一定的小時間窗口內等待或聚合多個數據段的接收,從而一次性發送一個ACK確認多個數據段。這可以減少網絡中ACK報文的數量,從而降低網絡擁塞。
UNA vs ACK+UNA:
ARQ模型響應有兩種,UNA(此編號前所有包已收到,如TCP)和ACK(該編號包已收到),光用UNA將導致全部重傳,光用ACK則丟失成本太高,以往協議都是二選其一,而 KCP協議中,除去單獨的 ACK包外,所有包都有UNA信息。
非退讓流控:
KCP正常模式同TCP一樣使用公平退讓法則,即發送窗口大小由:發送緩存大小、接收端剩余接收緩存大小、丟包退讓及慢啟動這四要素決定。但傳送及時性要求很高的小數據時,可選擇通過配置跳過后兩步,僅用前兩項來控制發送頻率。以犧牲部分公平性及帶寬利用率之代價,換取了開著BT都能流暢傳輸的效果。
拋棄擁塞控制,追求極致速度
TCP的擁塞控制機制(如慢啟動、擁塞避免、快速重傳等)是為了保證網絡公平性和穩定性,但這也讓TCP在丟包時表現得過于“慫”。KCP直接拋棄了這些機制,采用更激進的策略,允許用戶自定義流控和擁塞控制,甚至可以不控制。這種“莽夫”式的方式讓KCP在丟包時依然能快速重傳,保持高吞吐量。
更小的協議頭開銷:
KCP的協議頭比TCP更精簡,減少了額外的開銷。雖然這點對性能提升有限,但在高頻率、小數據包場景下,積少成多也能帶來一定的優勢。
無連接狀態,輕量級:
KCP是無連接的,不需要像TCP那樣維護復雜的連接狀態(如三次握手、四次揮手、滑動窗口等)。這種輕量級的設計讓它更適合高頻、短連接場景。