閒談IPv6-IPv4的TCP和NAT讓網際網路變得畸形
下班的路上讀了一篇比較有意思的百家號文章:
IPV6和5G來到後,我們會體驗到《鏡花緣》裡的景象嘛?: https://baijiahao.baidu.com/s?id=1590883265841566472
這篇文章可以引起一些思考。文章很短,兩分鐘可以看完,我並不就著這篇短文做評論,而是想說,為什麼這些在IPv4時代不可能發展起來。
我將其歸咎於NAT!NAT是IPv4的遺毒!
NAT已經成了IPv4時代的一種與生俱來的性質,所以,一旦在IPv6時代丟了它,很多人非常不適應。很多人會覺得丟了一個寶貝。
我們總是會為丟失已經擁有的糟粕而感到惋惜,而不會覺得還沒有得到但是將要得到的東西才是希望。這就是人的惰性,得到和失去並不對等,過去和未來並不等價。如果能不失去,那麼人們寧可不得到。
沒有了NAT後,人們會失去已經擁有的 躲在NAT後的感覺 ,而不會關心取消NAT後將會得到什麼,畢竟UDP也好,P2P也罷,都沒能得到過大規模部署。但現在是時候擁抱這些了,可人們依然不想要。人們想要TCP持續下去,因為人們早就習慣它了。
不是IPv4助長了TCP,而是IPv4的問題帶來了NAT,而NAT阻滯了P2P(嚴格來講,P2P並不是一種4層協議,但是按照程式設計模型來講,它是比UDP更加激進的對等互聯協議!),UDP等其它協議,讓我們認為TCP的C/S程式設計模型是理所當然的。
是NAT的TCP友好性阻滯了其它非TCP協議,才讓我們認為TCP是理所當然的,反過來,TCP的爆發也讓人們覺得NAT是理所當然的。
別說萬物互聯了,就是因為NAT,讓你無法在高鐵上接入自己家的空調,你會覺得這不重要,因為你想象不到當人們覺得它重要時世界會變成什麼樣子。
如果NAT是理所當然的,那麼它絕對是萬物互聯的障礙,而IPv6正是它的掘墓人!
IPv6帶來了改變,它取消了NAT(你依然可以讓IPv6做NAT,就像馬依然可以跑在公路上那樣不合時宜 ),IPv6解放了5G所需的資源,這就是二者的關係。
當真的實現萬物聯網時,人與人,物與物,人與物之間,正如《鏡花緣》裡那般,便不會有謊言了。問題是如何實現萬物聯網,需要什麼樣的基礎設施來支撐萬物聯網。答案是一個列表,這個列表中當然包括IPv6和5G:
- 龐大的地址空間支援海量的接入點;
- 點對點對等互聯使得任意節點在任意時間均可以收發資料;
- 低功耗,移動性支援;
- 高頻寬,低時延…
這些宣傳都聽膩了的…
現在的問題是,IPv6對IPv4到底是一次簡單對升級,還是說一次前所未有的顛覆?我認為是顛覆。
一切源自於IPv4的NAT。讓我們從頭說起。
IPv4的初衷是構建一個 ***分散式的(意味著無中心)***,***點對點的(意味著無偏見)***, ***逐跳的(意味著無邏輯連線)***, 分組交換的(意味著無物理連線) 網路,這樣它便可以構建一個無中心的體系,方可承受冷戰對手的任意精確打擊。
然而,最終這張網進化成了我們現如今的網際網路Internet。當初構建IPv4時,可能壓根就沒有想著每一個普通人都會擁有一個IPv4地址,如果僅僅用於軍事目的或者一些國家戰略級的目的,那麼IPv4地址是足足的。
為了在無物理連線,無邏輯連線的盡力而為的網路上實現 有連線 的語義,必須在IP層之上實現,且這種實現 不能是逐跳的,必須是端到端的。
事實上,TCP只是IP可以承載的傳輸協議之一,並不是全部,TCP只是加強了IP,UDP才是複製了IP。
但是TCP除了連線性,還有一個更加有益的性質,這就是 流式傳輸! 這才是讓其壓倒UDP的那把寶劍。流式傳輸相比資料報傳輸要方便得多,它可以自適應當時比較小的頻寬,主機發送,接收快取,自帶的滑動視窗可以輕鬆搞定這些事情,如果是資料報協議,就會面臨 如果放不下,就只能丟掉 的尷尬,因為資料報不能切割!
不是連線,不是重傳,不是保序讓TCP在初期勝過了UDP,而是流式傳輸!連線,重傳,保序只是輔助。
隨著資訊科技的發展,當初必須使用TCP的理由不存在了,流式不必基於位元組而可以基於報文了,這樣看來使用UDP會更加靈活,但是這個時候,推廣UDP卻受到了一種阻礙,從而又一次讓TCP更加彭勃起來。
這個阻力就是NAT!NAT對其它協議太不友好,因為它的方向性!然而,NAT同時也阻滯著TCP的反向連線,但是人們貌似並不care,於是發明出了uPnP,打洞這些垃圾技術,就是為了支援TCP的反向向內的連線。遺憾的是,這時,人們已經接受了TCP,各大網站,伺服器均已經全面部署了TCP,別的協議就徹底沒戲了。
人們常說網際網路是一個資源共享的平臺,我說不!
網際網路是一個資源壟斷在幾個巨頭的金字塔等級世界,完全不對等!這背後的原因就是大規模部署TCP,而TCP的衛道者就是NAT!
我們看看幾十年前的TCP程式設計模型,非常清晰的一個資源壟斷程式設計模型,我們稱之為 C/S模型 ,一個例子就是,Apache伺服器專門設計了幾種MPM(Multi-Processing Module),來支援這種 C/S模型 。
這預示著伺服器往往是強大的,而客戶端往往只是展示一下結果而已。伺服器越來越強大,客戶機越來越瘦,這是這種C/S模型發展的必然趨勢!這種模型最終發展到了我們現在的所謂 雲端計算 。伺服器越來越強大,強大到可以用一朵雲來表示了,因為沒有任何人可以刻畫這朵雲裡面的細節!
非常具有諷刺意義的是,雲端計算,一切在雲端,這恰恰就是現如今我們自嗨的網際網路Internet的唯一形式,人們紛紛撲向雲端計算,人們以為這將是網際網路世界的最後一塊蛋糕。但是…
但這是不正確的,這不是真正的網際網路應該呈現的樣子,這不是真正的萬物對等互聯。
IPv6/IPv8,5G/6G的出現可能會徹底推翻這種模型!
由於NAT的存在以及TCP的侷限,網際網路變成了一個純粹的 被動式的拉(pull)網 ,很少有 主動推(push) 的動作。
拉模型是一個典型的我們熟悉的Request/Response模型,我們目前熟知的HTTP協議就是這種模型,這意味著每次請求到資源,至少要經過兩個RTT的時延。TCP需要握手,然後還要發一個Request報文,接下來才是Response。TCP意識到這樣做是一種錯誤,於是FastOpen這個trick就出來了…
為何遲遲沒有符合推模型的的App呢?因為在NAT和TCP的環境里根本就做不到!
首先,推模型需要知道目標地址,在IPv4網路中,這意味著NAT會成為障礙,此外,小型裝置支撐不住太大的能耗,因此不適合做TCP的偵聽端,此外,小型裝置不適合處理MPM。這難道不是進一步助長將C和S超兩個極端分化嗎?
看看我們當前的TCP/IP網路的上層已經發達到了什麼程度,隨便一個訊息系統都可以吊打TCP/IP網路上現有的傳輸協議模型:
- 點對點模型。IPv4的初衷,但是NAT使得其只實現了一個方向,助長了兩極分化。
- 訂閱/釋出模型。IP協議的組播增強,但是組播和NAT一起面臨著更多的現實問題。
只要打通了底層網路,世界任意兩點或者多點的訊息系統將可以任意 或推或拉 資料,傳輸本身將極大豐富。
但恰恰IP層本身卻不支援推拉雙向傳輸。這都怪NAT,而NAT本來只是解決IPv4地址不夠用的一個Trick。
好了,讓我來總結一下我上面都說了些什麼:
- TCP是一種C/S模型的端到端協議。
- NAT讓TCP的S端趨向于越來越強大,C端越來越瘦。
- NAT和TCP合力讓網際網路變得中心化,不對等。
- NAT和TCP違背了網際網路的設計初衷。
有破要有立,IPv6將會帶來什麼?
如果徹底地掃除了NAT,如果5G/6G讓更多的東西接入了網際網路,那麼什麼才是正確的?
無疑,計算能力將變得分佈化而不是越來越集中。在商業巨頭內部,他們早就意識到了廉價的分佈計算能力要遠遠強於昂貴的集中式計算,看看無論是谷歌,Facebook,還是阿里巴巴,騰訊,都不再採購專業昂貴的的裝置,而是採購超級廉價的簡易裝置來自研軟體,這種趨勢將擴充套件到整個網際網路!
集中進行雲計算的那幾朵雲終將煙消雲散!!
區塊鏈技術只是一個想法,但是去中心化則是必然!無論採用哪種技術實現去中心化並不重要,重要的是把雲驅散,網際網路才能真正對等互聯互通。
現在的網際網路不是阿帕網最初希望成為的那個抗核打擊的分散式去中心的網際網路,現在的網際網路更像是上世紀60年代登入大型機終端進行作業操作的 遠端多使用者登入終端系統! ,一群人拿著手機,Pad 登入 到 雲端 做各種有意義或者無聊的事情…
讓我們來看另一些概念,即 分組交換,儲存轉發,統計複用! 是的,這些就是我們的網際網路的根基中的根基,IP協議可以改變,這三點性質不可撼動。
基於這些,我們能把網際網路實現成什麼樣子?那肯定不是現在這個鳥樣子。
去年的時候,做過一段時間Kafka,我對Kafka的設計理念是非常喜歡的。它真的是 集儲存和轉發為一身! 而我們知道,儲存和轉發分別代表資料庫和網路,它們在某些方面是矛盾的:
- 資料庫: 儲存資料,資料的終點,越持久化儲存越好。
- 網路: 轉發資料,資料的經由路徑,需要儘快離開,一方面為了儘快到達目的地,另一方面儘快離開可以出讓資源。
但是Kafka巧妙地將二者融合在了一起,以資料儲存,雜湊,釋出訂閱實現了儲存轉發和統計複用以及負載均衡。具體可以參見我去年的總結:
初試kafka後的一點感性的想法: https://blog.csdn.net/dog250/article/details/79512708
Kafka設計思想的脈絡整理: https://blog.csdn.net/dog250/article/details/79588437
TCP/IP網路也要吸取其中的一些精華了。
所以說不要總被TCP和NAT限制住。動不動就說TCP好,說NAT好的是需要看看新的東西了,拿新東西沒有的和老舊東西擁有的比,任何新東西都會被扼殺:
- IPv6地址太長根本記不住,推廣不起來!
- 沒有NAT不安全,時刻可能被攻擊!
- QUIC效能太差,且不穩定,程序總是crash!
- 可穿戴裝置能耗問題太多!
- 無人駕駛車必須保留駕駛位!
- 電子墨水書不能折角,不便批註!
- 我是明朝人,我寧可不留頭也要留髮!
- 我是那個明朝人的後代,我是清朝人,我死也不會剪掉辮子,太難看了!
最後,如果覺得這一切都太難,那麼好吧,IPv4繼續留給人用來在NAT後發起TCP連線自嗨吧,我早就覺得,IPv4和IPv6將長時間共存,IPv4作為一個區域網繼續留給人用,IPv6將構建真正的網際網路!二者通過NAT64來介面,也挺好!
浙江溫州皮鞋溼,下雨進水不會胖!