公眾號「古時的風箏」,專注於後端技術,尤其是 Java 及周邊生態。文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。
大家好,我是風箏。
重學計算機網路已經有一段時間了,終於在離開大學多年後又重新拾起了一部分,時至今日已略有小成,並且寫了一系列的文章了,會慢慢 發出來。
我反正在學習的過程中是畫了好多張圖,這些圖會放到後續的文章中,有興趣一起學習的同學記得關注加星標呀,這樣就能第一時間接到文章推送了。
上大學的時候就想好好學習網路,夢想著以後成為一名網管。後來發現計算機網路還真是不太好學,非常非常抽象,發現有很多概念好像怎麼學都學不明白。這才知道,原來更適合我的網咖管理員,而不是網路管理員。而寫程式碼就不一樣了,沒那麼抽象,而且寫出來東西馬上能看到成果,寫一個方法一執行,馬上能輸出結果;寫一個網頁、一段樣式,馬上就能看到介面的變化。人的大腦最喜歡這種快速反饋了,於是覺得寫程式碼比學網路有意思,這才走上了程式設計師這條路。
後來工作了,相信大家和我有同感,雖然寫的是程式碼,但是處處離不開網路:
- 普通介面用的是 HTTP\HTTPS,HTTP 處於整個網路的最頂層應用層;
- 有一些 RPC 使用的非 HTTP 協議,例如 Dubbo 的 Hessian 直接包裝的 TCP 協議;
- 還有一些場景要直接使用 TCP,例如支援前端的 websocket;
- 非常流行的高效能網路框架 Netty ;
- 使用 Dokcer 容器做開發測試的時候;
- 甚至於使用VmVare 虛擬機器的時候,也要了解橋接模式、NAT、僅主機模式的區別;
就算對網路和底層完全不瞭解,也可以正常寫程式碼,但是,當我們有一天發不滿足於只寫增刪改查,或者在一些外部力量的驅動下,如果不理解網路,那必將寸步難行。
只寫增刪改查做鹹魚有什麼區別,我們是那種甘心做鹹魚的人嗎?對於想在技術上更上一層,想要做架構師的同學,網路是我們必須拿下的陣地。
在做了一段時間的鹹魚之後,我還是決定要翻一下身。否則網路這東西總會像一團迷霧一樣,時不時飄來擋住視線,一直像一塊麵紗一樣,遮住了系統真正的面容。
為什麼要學習網路知識
可以出去吹牛啊
當碰到一個網路問題,別人都解決不了,你解決了,你說驕傲不,你說自豪不。
當然,就是說說而已,做人還是要低調,內心就算翻出了花兒,表面上也要淡定的表示這是基本操作。
加深對應用框架和架構的理解
現在還能找出哪個系統、哪個應用不依賴於網路嗎,好像還真的不太好找。
舉兩個例子:
Netty 框架
Netty 可以說是當前最火的網路程式設計框架,如果你們的專案需要高效能、高可靠的服務端和客戶端互動,最好的選擇就是 Netty。比如即時溝通功能、比如遊戲伺服器、比如websocket的伺服器端實現。
Netty 是基於TCP\UDP 實現的,其中有很大部分都是對這兩個協議的封裝,在理解網路(尤其是TCP)和不理解網路的情況下學習 Netty 是兩種完全不同的體驗,前者事半功倍,後者事倍功半。
而且現在很多框架都整合了 Netty,比如 Dubbo RPC、RocketMQ、Hadoop等,連 Spring Boot 也已經內建了 Netty 模式。更好的理解 Netty ,才能更好的理解這些框架,怎麼才能更好的理解 Netty 呢,當然是要對網路有很好的理解啦。
微服務框架
微服務是由多臺伺服器組成的,這麼多的伺服器要聯動起來,和穩定的網路結構是分不開的。一個複雜的微服務架構,有閘道器、服務、CDN、還有各種旁路的中介軟體。閘道器還分網路閘道器和應用閘道器,閘道器就涉及到負載均衡,負載均衡有4層負載均衡,還有7層負載均衡,各種各樣的概念,哪一個都離不開網路。
有可能還用了 docker、k8s,這就更復雜了,容器內部網路、叢集網路、外部網路,不瞭解這些怎麼能更好的理解架構。
最佳化系統
也許某一天你當上了架構師,當系統出現瓶頸的時候,需要做最佳化了。如果你不懂網路,那隻能從資料庫、中介軟體、程式碼層面最佳化, 缺失了網路層面的最佳化,而網路最佳化應該是成本最低的部分。
也許能解決一些疑難雜症
有時候,很多問題都是由網路問題引起的。
最簡單的相信大家都能處理,比如最常說的 ping
一下、telnet
一下。
就連阿里雲這麼大的平臺也經常發生網路問題。很早之前,專案中有一些整合了微信服務號的功能,服務部署在阿里雲,就出現過異常,現象就是無法正常呼叫產生臨時二維碼的介面。透過排查判斷應該是阿里雲伺服器的網路出現了問題,於是立刻提交工單,經過核實,確認是某些阿里雲伺服器的網路出現了問題,據客服回應是網路抖動,但也不保證當時阿里雲在進行某些配置更新,誰知道呢。
除了上面說的簡單、明顯的網路問題外,還有一些問題是隱藏在背後的,比如一些第三方框架或中介軟體,在某些情況下會出現非常莫名其妙的問題。我承認找到並解決這些問題確實很困難,必須要動用一些服務端工具、網路工具輔助排查,即使這樣,也不一定能順利的發現問題所在。
沒關係,至少理解了網路,就多一條路,也許這條路就能幫我們找到問題呢。但如果你不瞭解網路,不要說解決問題了,連問題產生的原因都不會知道,連如何排查問題都不知道。
為什麼看完書轉頭就忘
不是我不想學啊,看完了轉頭就忘了。這不就是說的我嗎?不瞞你說,我看了好幾遍《TCP-IP協議詳解》卷1了,到現在還只是掌握了一個大概,理論性的內容最不容易掌握了,因為很難從中得到樂趣,大腦不容易給出積極的反饋。但是有一個好處不得不說,就是助眠,看著看著就困了。
多看
上學的時候老師經常說的就是多看多讀,不得不說,這個方法確實好用,除非你有過目不忘的天才本領。不要妄想一口吃個胖子,普通的人大腦沒辦法一下接受那麼多陌生的東西。不知道各位有沒有過這樣的經歷,之前學過的一些知識感覺自己沒學好、沒學懂,學起來很吃力,最終可能糊弄過去或者直接放棄了。而過了一段時間又拿起來學了,發現之前一些沒理解的部分突然理解了。
作為一個普通鹹魚,經常有些概念第一次、第二次都不太理解,比如學習 TCP 的時候,前面不理解,導致後面更不容易理解,然後就不想看了,這時候強迫自己繼續看下去,當然了,最終的結果可能仍然是不理解,一次、兩次都是這樣。過些天,重新看的時候經常會有恍然大悟的感覺,奧,原來是這麼回事。
畫出來、寫出來
畫出來,可以幫助我們更直觀的理解。大腦不容易接收文字,但是容易接收視覺化的東西,為什麼短影片比公眾號更受歡迎,因為影片透過眼睛可以更直觀的傳遞給大腦,而公眾號上的文字要經過大腦的轉化,轉化的過程大腦就要工作,要工作就累啊。
比如我們學習網路模型的時候,有時候說7層,有時候說4層,因為4層是將7層中的某些層合併了,有一些網路協議工作在應用層、有一些工作在傳輸層。如果純靠文字,那簡直太抽象了,但是要是透過圖形的方式展示出來,一目瞭然,可以透過下面的圖感受一下。一下就知道,7層和4層的區別。
寫出來,可以檢驗我們自己是否真的理解了,大多數時候我們以為自己理解了,但是一旦要講給別人的時候,發現支支吾吾,有些地方模稜兩可。
相信各位寫過部落格的同學都特別有這種感覺,真正掌握的知識點可以很快的寫成文章出來,而那些其實沒掌握清楚的知識點,可能一篇文章寫出來要用好幾天。為什麼呢?寫著寫著發現一個細節說不清楚,如果不想糊弄,就要找相關的書籍、文章,這個過程仍然是學習的過程。
到最後,能把一個概念透過文字的形式講清楚了,說明自己至少掌握了大部分,也不敢保證100%掌握。
要實踐啊
紙上談兵最可怕,尤其是我們程式設計師這個行業。空談誤自己啊,同志們。寫程式碼就不用說了,不可能只看不實踐對吧,那樣的話早被公司開除了。
網路這東西都是概念性、抽象的,怎麼實踐啊。總不能掐個水晶頭、扯根網線吧。倒也不是不可以,但是也沒必要,畢竟我們不是真的要去網咖當網管的。
可以使用一些網路工具視覺化的觀察一下網路上的資料包,比如用 WireShark 看一下 ARP協議、IP協議、TCP 協議、HTTP協議的資料格式是怎麼樣的,客戶端和服務端的互動過程是怎樣的。
還可以用一些網路命令試驗一下,比如 ping 、telnet、route 等等。
最後可以迴歸老本行,寫一寫關於 Socket 的服務端和客戶端的互動程式,修改一下各個引數看一下有什麼變化。
我是怎麼學的呢
透過一段時間的不懈努力,我終於小有所成,從下面幾個方向上梳理出了學習網路的一些脈絡。
1、首先要從宏觀視角大致瞭解一下網路到底是怎麼樣的,重點是網路分層模型、傳輸過程。拋開網路不說,接觸任何一個新的知識都要先從宏觀上下手。比如學習一個第三方框架,要先看介紹和架構說明,知道這個框架是幹什麼用的,工作原理是什麼,架構設計是如何的。
2、然後就是理解各個層的主要協議了,主要就是協議的作用和協議格式,以及每種協議格子的功能特性。
3、一個資料包從傳送端到目的端要經過紛繁複雜的網路結構,經過各種中間裝置。從路由表、轉發表和 ARP 表這三張表,可以瞭解資料包傳輸的過程。
4、最後是 Ping
、Route
命令的工作原理。遇到網路問題,我們首先想到的是 ping 一下
,ping 的原理是什麼呢?其實就是對特定的網路協議特性的巧妙利用,也很好玩。
圖中的每一個點,我都輸出成了筆記,藉此加深理解。之後,會一篇一篇的發出來,歡迎大家跟著我一起學習。
如果覺得還不錯的話,給個推薦吧!
公眾號「古時的風箏」,Java 開發者,專注 Java 及周邊生態。堅持原創乾貨輸出,你可選擇現在就關注我,或者看看歷史文章再關注也不遲。長按二維碼關注,跟我一起變優秀!