到底要不要走TCP隧道,要不要TCP over TCP?

還是這篇文章:
http://sites.inka.de/sites/bigred/devel/tcp-tcp.html

有100個理由說TCP在某種場景下不好,就有100個理由說TCP在同樣的場景了好的不得了,這就好像面對中醫或者傳統武術一樣, 古老陳舊的東西總是被拿來被吹捧或者被打壓。 TCP是個30年前陳舊的協議,在計算機網絡的編年史中,TCP是一個古代的協議。

  • TCP在長距離傳輸時窗口打開太慢;
  • TCP對丟包無法預測;
  • TCP對RTT測不準;
  • TCP對網絡擁塞事件反應遲鈍;

這是一個保守的協議。

數據要傳輸到另一個地方,中間要經過一個隧道,如何構建這個隧道是一個技術問題。

考慮TCP over TCP會怎樣?

TCP作爲一個按序接收的有狀態可靠的端到端傳輸協議,是因爲它對下層的鏈路做了一個假設:

  • 下層是不可靠的!!

TCP的很多特性都源自於這個 不可靠假設 。所以TCP屏蔽掉這個假設之後, TCP是可靠的!

TCP over TCP?TCP同時作爲鏈路協議和負載協議?是的!

那麼 在TCP over TCP中,不可靠假設就失效了! ,因爲 TCP是可靠的!

只要內層TCP的RTO超時時間小於外層TCP的RTO超時時間,悲劇就發生了,指數退避會讓連接崩潰。

但是,這很少發生,在支持FACK/SACK/RACK的 現代TCP 中,RTO很少被觸發,依靠各種xACK探測到需要重傳的場景,那便盡是TCP over TCP的優勢了。

爲了演示TCP是如何不適合長距離傳輸的,先看一個標準的丟包恢復:
在這裏插入圖片描述

爲什麼會丟包?

下層的鏈路不可靠唄,那麼如果在丟包的位置替換一條鏈路,使得它成爲可靠的鏈路,會不會更好呢?我們把這條鏈路換成一條TCP隧道,看看會發生什麼:
在這裏插入圖片描述

TCP有助於彌補鏈路不可靠,雖然以TCP來保證可靠也不是很完美,但至少這是一個POC:

  • 通過軟件協議來彌補底層鏈路的不可靠性!

其實,代理也可以達到類似的效果,只要縮短TCP端到端的距離即可:
在這裏插入圖片描述
這側面證明了TCP確實是一個長距離不友好的勒瑟協議。

在不可靠的鏈路上構建一個可靠的軟件協議來保證可靠性,確實是一個不錯的想法。TCP協議構建隧道確實也是一個辦法,但我們必須要用TCP構建隧道嗎?

NoNoNoNoNo!

可以用Quic?

NoNoNoNoNo!這些都太重了,都是是煩人的東西。

只需要構建隧道的協議有丟包重傳機制即可,TCP附加的按序接收,連接狀態機維護都是不必要的,甚至只需要並非100%的丟包探測重傳即可即可,即不需要保證一個丟失的數據包被100%重傳,只要能 減少 端到端的丟包重傳開銷,那這條隧道就是成功的。

所以說,隧道不一定非要用TCP構建,只要 能重傳丟包 即可咯。隧道還是有好處的。

於是,構建一個 像TCP但又不是TCP的傳輸協議 就是必要的,當然,這純粹是trick,爲了玩而已,任憑哪個公司都不敢怎麼玩。

  • 發送端的Netfilter掛HOOK,收到TCP write下來的數據時,直接ACK!
  • 接收端的Netfilter掛HOOK,收到數據後直接copy to user,不再處理OFO!

這個module實現起來非常簡單吧,只要借用TCP的一個殼即可,大家都待見TCP,那就按照你說的來唄…對了,還有Quic,依着你就是了。

都是錢,又TM是雞屎!


浙江溫州皮鞋溼,下雨進水不會胖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章