年輕人,你不會真的以為自己懂得電腦網路吧?

来源:https://www.cnblogs.com/xll1025/archive/2020/02/25/12364364.html
-Advertisement-
Play Games

原創聲明 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 思維導圖 簡介 上一期我講到了數據結構怎麼學,當時我的學習方法是先看視頻,再看書,然後刷一刷基礎演算法題做鞏固。 作為一個非科班考研黨,當時覺得這個學習路線還是比較平滑的,畢竟能讓我一個小白快速學會,這門課相對來說還是比較簡單的。 於是 ...


原創聲明

本文作者:黃小斜

轉載請務必在文章開頭註明出處和作者。

思維導圖

在這裡插入圖片描述

簡介

上一期我講到了數據結構怎麼學,當時我的學習方法是先看視頻,再看書,然後刷一刷基礎演算法題做鞏固。

作為一個非科班考研黨,當時覺得這個學習路線還是比較平滑的,畢竟能讓我一個小白快速學會,這門課相對來說還是比較簡單的。

於是,等我讀研的時候,打算以相同的學習方式來補一下其他幾門電腦基礎課程,首當其衝的就是電腦網路。

因為這門課實在重要,幾乎是面試必問的內容,什麼TCP/IP三次握手,四次揮手,TCP和UDP區別,HTTP協議的一堆面試題,在程式員面試時都是很常見的考題,你們應該也深有體會。

電腦網路中的複雜概念遠不止這些,那麼按照老規矩,我們先來看一下電腦網路到底是個啥。

根據百度百科的介紹,電腦網路是指將地理位置不同的具有獨立功能的多台電腦及其外部設備,通過通信線路連接起來,在網路操作系統,網路管理軟體及網路通信協議的管理和協調下,實現資源共用和信息傳遞的電腦系統。

相比於數據結構的介紹,百科上對於電腦網路的介紹更加好懂一些,簡單來說,電腦網路就是把電腦通過通信線路連接起來,實現網路互聯和信息傳遞。

為什麼要學電腦網路

在這個時代,離開了網路,簡直沒有辦法生存,而我們所學的編程知識,脫了網路去談也將毫無意義,畢竟沒有哪個編程語言是只支持單機運行的。

作為一個編程學習者,當你在學習一門語言時,比如Java,你可能會學到一些基本語法,面向對象的基礎、集合類的使用,甚至是多線程、IO流以及異常處理,這種時候你往往意識不到電腦網路的重要性,反正我寫代碼也不涉及網路傳輸,平時的工作也只是CRUD,學習電腦網路也沒有什麼用武之地。

曾幾何時我也是這麼想的,但是到後來,我開始接觸Tomcat,接觸Nginx,以及Java中的網路編程技術,比如BIO和NIO,甚至是網路編程框架netty,在沒有電腦網路基礎的情況下來看這些東西,絕對會讓你懷疑人生。

最早我開始意識到自己電腦網路基礎薄弱時,還是我在學習docker容器方面的知識時,接觸到了docker的網路原理,比如docker的網路模式有橋接和host兩種,然而我當時基本上看不懂這是什麼東西。

類似地,我在學習OpenStack的時候,也完全看不懂裡面的網路組件是做什麼用的。

就算你不學習網路編程、虛擬化和容器調度,你也得學學平時家裡的ip地址、DNS和子網掩碼怎麼配置吧,沒認真學習電腦網路之前,我對這些東西甚至都是一臉懵逼的。

不懂電腦網路的我,想要學編程,真的太難了!

如何學習電腦網路

第一次接觸

本科的時候,我們本有一門選修課就是電腦網路,但是當時我沒有選它(現在覺得選了可能也聽不大懂,但是多少有點印象)

讀研的時候,開始狂補電腦基礎,當時為自己選了第一本書《電腦網路(謝希仁)》作為入門教材,現在想想當時真是年幼無知,自己完全可以去某乎看一下推薦書單的。

這本書作為一本大學通用教材,年代之久遠,內容之枯燥,都是在這麼多電腦網路書籍里排的上號的,我已經快忘記當時是怎麼把這本書啃完的了。

雖然這本書還沒有到大部頭的級別,但是裡面的內容真的對新手不怎麼友好,通篇的都是概念的堆疊和並不容易理解的概念介紹。

教科書,大家都懂的,大部分都已經脫離時代,雖然電腦網路這幾年的變化不大,但是它裡面的一些教學方法確實是和時代脫節了。

我只記得這本書,當初看完一周就忘光了,後面不管是筆試面試,還是重新複習的時候,基本上也想不起來當初都學了啥,真是一本神奇的好書。

入門學習階段

吃過了教材的虧之後,我終於學會了上某乎找書單了,當時除了購買了一堆Java書籍之外,還特地買了一本《TCP/IP捲一》以及《圖解HTTP》準備開始第二輪對於電腦網路的死磕。

當時也投了一些簡歷,準備了一些面試,刷過一些面試題,其中面到電腦網路的概率很大,於是我每天都會花一些時間來看著兩本書。

不知道是不是我理解能力有問題,當我看《TCP/IP詳解捲一》這本備受推崇的電腦網路書籍時,我竟然有一種再看當初那本教材的感覺,這本大部頭,貌似也是在講一堆複雜的概念,並且用一些不好懂的講解去解釋這些概念。

當時我的自信心就有點受挫了,難道電腦網路真就這麼難麽,為什麼這本書我仍然看不懂?

現在看來,電腦網路確實是一門純理論的課程,除了一些網路抓包和用開發者工具查看網路請求之外,基本上沒有什麼需要實踐的內容,現在很多書從網路抓包入手講解電腦網路,其實也是一種不錯的新型學習方法。

一本書適不適合一個人,真的是因人而異,特別是這種專業技術書籍,不同水平的人看效果差距也會很多,所以網上的一些書單,你可以參考,但不要盲目推崇,等你自己看懂了再說它好也不遲。

於是我第二次進軍電腦網路也失敗了,看完了《TCP/IP捲一》之後,我用了一個月的時間又忘掉了它。

強化學習階段

俗話說,事不過三,兩次選書都讓我鎩羽而歸,我的內心是崩潰的,雖然面試的時候還可以靠著背一些常見的電腦網路面試題矇混過關,但是真遇到較複雜的問題時,我也只能是望洋興嘆,根本說不出個所以然。

學好電腦網路的關鍵是理解它,我在網上又搜索了一大堆的內容,看到一本名為《電腦網路:自頂向下》的書籍,也受到一些推崇,原因是這本書從應用層講起,一直往下講到物理層,似乎更符合人腦的學習和思考方式。

我買書一向勤快,當時我在百度實習,於是這本書成了我日常實習時必看的書目。

因為組裡的項目在做容器和私有雲,在不懂網電腦網路的情況下去看這倆,簡直是找死,更何況裡面還涉及了存儲、調度、微服務等技術。

這本書確實給了我全新的觀感,此書在開頭就說,將以全新的方式介紹電腦網路,先講應用層,再依次介紹傳輸層、網路層、鏈路層和物理層。

自頂向下和自頂向下的區別在哪呢?
根據自頂向下的思路,我們最先接觸的是應用層,也就是常見的HTTP、DNS、FTP、POP等協議,這層協議我們平時都在用,書中講的也比較接地氣,於是我對應用層的介紹也接受的很快。

按照這個思路,書中繼續講傳輸層,也就是我們常見的TCP和UDP,應用層使用功能變數名稱或者是IP+port的方式定位機器,而傳輸層(這裡指TCP)把應用層的數據切片,有序傳輸,並且保證可靠。

也就是說,TCP報文把應用層報文包裹了起來。接下來,就到了網路層了,網路層通過IP進行路由,目的就是找到對應的終端機器,所以網路層的數據報要包裹傳輸層的數據報。

接著往下,網路層雖然解決了路由問題,但是區域網內的網路交換是通過mac地址進行定址的,於是數據鏈路層發揮作用,因為它就是通過mac地址來定位目標機器的,於是數據鏈路層的數據報要包裹網路層的數據報。

再到最後物理層,數據傳輸的本質還是0和1的電信號,自然要通過物理介質進行傳輸,當然,物理介質除了常見的網線、光纖,還有電磁波(應用於無線區域網)

上面對整個電腦網路的脈絡做了一下梳理,所以,整體看來,按照自頂向下的思路去學習電腦網路,對於新手來說更加友好一些。

還差得遠呢

看完了《電腦網路:自頂向下》雖然已經大概瞭解了整個網路的結構和脈絡,但是對於很多實現的細節還是一知半解,比如HTTP和TCP報文的結構,還有一些比較不易理解的概念,比如路由演算法、IP廣播和多播、NAT技術、VPN技術等等,不理解這些,總覺得還是欠缺了不少東西。

到後來,開始嘗試面試一些大廠,更加發現了自己的差距還很大,比如百度、頭條、騰訊這類公司,特別是騰訊,對於電腦網路的考察是特別嚴格的。

比如三次握手,四次揮手這種常見問題,一般還會延伸考察,比如為什麼要三次握手、四次揮手,沒有第三次握手或者沒有第四次揮手會怎麼樣。

再比如TCP協議的作用是什麼,它是如何保證傳輸可靠的,這時候你就要瞭解TCP保證可靠傳輸的機制,比如滑動視窗,超時重傳,分組確認等原理,也是你需要能講清楚的。

再比如,還有一種常見的考察方式,就是讓你講清楚從功能變數名稱訪問到獲得返回結果的過程中都經歷了什麼,這麼開放的問題,要儘可能說出足夠多的東西,先是DNS解析,再到TCP三次握手,然後介紹IP數據報的網路路由,以及區域網內數據鏈路層的作用,甚至可以把物理層也帶進去講一下。

總之,你掌握的越多越詳細,對於這些問題才更有機會答好,我每次都會把整個過程講的比較詳細,這樣面試時才不會給自己留坑。

對了,在學習電腦網路的路上,還有一個很重要的學習資源幫助到了我,那就是劉欣老師的《碼農翻身》一書,當時我也是在網上偶爾看到。

一開始劉欣老師只是寫公眾號文章,後來把文章集結成書,對於電腦網路的部分,這本書用故事化的方法介紹了很多電腦網路的知識,同時解釋了一些較為複雜的電腦網路概念,比如NAT、網路隧道、VPN等等。

雖然這本書關於電腦網路的內容不是很多,但確實有助於加深對於電腦網路一些概念的理解。

思維導圖

寫了這麼多,最後用一張思維導圖告訴你電腦網路應該怎麼學,算是對本文的總結。

如果你是科班出身的同學,相信你對電腦網路的學習不用我操心,如果是非科班的同學,按照這個思路去學習,我覺得是還是可以的。

image

推薦資源

書籍

《電腦網路:自頂向下》
《圖解TCP/TP》
《圖解HTTP》

總結

關於電腦網路的學習,我們就講到這裡了,如果還有什麼疑問也可以到我公眾號里找我探討,作為一個Java工程師,必須要懂得Java網路編程,有了電腦網路的基礎之後,相信對後續學習網路編程會有幫助,之後也會有關於Java網路編程的文章推出,敬請期待。

對了,你想問我文章里提到的書籍去哪找?我已經給你準備好了

文中所提到的電子書都可以免費領取,在我的公眾號【程式員黃小斜】回覆“電腦網路”即可領取對應的下載地址。

寫在最後

如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支持啦,你們的支持是對我最大的鼓勵。

對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的反饋。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Request模塊 1.HTTP for Humans,更簡潔更友好 2.繼承了urllib所有的特征 3.底層使用的是urllib3 4.​開源地址:https://github.com/requests/requests 5.中文文檔​:https://requests.readthedoc ...
  • 在python中除了print函數之外,len函數和type函數應該算是使用最頻繁的API了,操作都比較簡單。 一.len函數簡介 返回對象的長度(項目數)參數可以是序列(例如字元串str、元組tuple、列表list)或集合(例如字典dict、集合set或凍結集合frozenset) 語法: le ...
  • C++常見編程 獲取當前系統時間 文章首發https://www.cppentry.com 本文主要使用time() 及strftime() 函數 C++系統和時間相關的函數基本上都是使用C語言提供的標準介面 在程式中獲取系統時間是常見的操作,很多情況下使用系統提供的time函數即可獲取。 time ...
  • 不知道你是否遇到過面試官讓你手寫生產者消費者代碼。別說,前段時間有小伙伴還真的遇到了這種情況。當時是一臉懵逼。 但是,俗話說,從哪裡跌倒就要從哪裡爬起來。既然這次被問到了,那就回去好好研究一下,爭取下一次不再被虐唄。 於是,今天我決定手敲一個生產者消費者模式壓壓驚。(因為我也不想以後被面試官血虐啊) ...
  • Golang中內置了對單元測試的支持,不需要像Java一樣引入第三方Jar才能進行測試,下麵將分別介紹Golang所支持的幾種測試; 一、測試類型 Golang中單元測試有功能測試、基準測試、示例測試或稱示例函數三種; 功能測試必須以TestXXX函數名出現,基準測試必須以BenchmarkXXX函 ...
  • python的sys模塊是與python解釋器交互的一個介面,提供對解釋器使用或維護的一些變數的訪問,即與解釋器強烈交互的函數。 sys模塊的常用函數: 1.sys.argv:命令行參數列表。第一個元素是腳本的名稱,後面是終端傳入的值;可以在執行整個程式前通過終端傳入參數,然後執行程式,實現從程式外 ...
  • 1.Golang中的數組 數組是一種具有固定長度的基本數據結構,在golang中與C語言一樣數組一旦創建了它的長度就不允許改變,數組的空餘位置用0填補,不允許數組越界。 數組的一些基本操作: 1.創建數組: func main() { var arr1 = [...]int{1,2,3,4} //[ ...
  • 原創聲明 本文首發於微信公眾號【程式員黃小斜】 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 本文思維導圖 簡介 學習編程,操作系統是你必須要掌握的基礎知識,那麼操作系統到底是什麼呢? 這還用說麽,操作系統不就是Windows、Linux、Mac、IOS、Android、IOS這類我們天天 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...