tcp/nc 是指 “tcp with network coding”,是一種結合了網絡編碼技術的 tcp 變種,網上資源很少,我也不準備多介紹,只介紹它的核心。
傳統 tcp 在演進過程中一直搞不定效率問題,網絡帶寬在增長,cpu 卻沒有變得更快,為保持可靠語義,tcp 丟包判斷和重傳邏輯的時間占比越來越大。
從 3 次 dupack,3 個 sacked segs 到 rack,甚至跌入 rto,邏輯復雜的核心在于,你必須用某種啟發式算法判定丟包,然后擇機重傳標記為 lost 的報文,丟包判斷必須盡快,而重傳卻不得不謹慎,慌亂中很難把握分寸,則要么不足,要么激進。tcp 沒有提供一種內在的方式,讓丟包判斷和重傳在松弛的氛圍中進行。
tcp/nc 依然是我那 “橫豎一顛倒,世界變了樣” 方法論的體現:
通過編碼系數提供冗余,receiver 解碼過程就是一個解 n 元一次方程組的過程,每一個包就是一個方程,丟一個包意味著 n 個方程少了一個,需要補一個方程,就是重傳。
判斷丟包非常簡單,receiver 保存兩個變量:
- H1 表示一個 tcp/nc 報文表示的一個方程中序號最高的包,比如上圖中 receiver 收到 c2,H1 就是 p2;
- H2 表示 receiver 當前收到的連續的序號最高的包,上圖中如果 c 丟失,收到 c2 時,H2 就是 p1;
如果沒有丟包,H1 - H2 = 0,理論上 sender 只要發現 H1 - H2 > 0 即可補充一個冗余報文,但 sender 可以將這件事延遲,這就是給了亂序以松弛感。
比如 c1 丟失,sender 收到 c2 即可發送一個冗余報文,比如 c3 = p0 + 3p1 + p2,但它可以繼續等到收到 c3,發現 H1 - H2 > 0 依舊,就可以發送一個冗余了,比如 c4 = p0 + 2p1 + p2 + p3,4 個未知數 4 個方程,p0 到 p3 解碼成功。
只是一個簡單例子,想說的是,這種冗余編碼(可以支撐延遲一個編碼窗口)提供的松弛感可以讓 sender 采集足夠多的數據,進行更加理性的擁塞判斷,而不是像傳統 tcp 那樣頻繁跌入 ssthresh = cwnd / 2 甚至 rto。
至于冗余度,既然不準備多介紹 tcp/nc 也就不多說,確實,相比傳統 tcp,有效傳輸的數據更少了,但這本身就是 trade off,旨在解除 tcp 的抱怨 “花太多精力在丟包判斷和重傳中”,就夠了。
規整化,本身就要付出代價,要看收益有多大。
浙江溫州皮鞋濕,下雨進水不會胖。