計算機網路該怎麼學?計科學生問?

現在已經學到數據鏈路層了,目前有以下困惑

1:對計算機網路的概念很模糊,就是知道是把許多計算機連起來的一個系統

2:裡面的概念太多、太抽象,平常生活中接觸不到。所以感覺這些概念很難記、很難理解

3:計算機網路這本教材到底講計算機網路的聯結方式?還是講計算機之間的通訊協議?

希望前輩解答我的問題,並告訴我一些學習計算機網路的方法和路線


更新:底下的評論里有人指出例子舉的不好,概念混淆比較嚴重,這個確實是我的錯誤,所以大家看看玩就好了,千萬不要當真。get到我想表達的意思就好。

———————————我是分割線————————————

學計算機網路的話,死記硬背其實是沒啥前途的,因為畢業後天天擼碼搬磚時一般不會有人問你乙太網里最大幀長是多少。所以掌握網路的基本設計思想其實才是最重要的。

2個不成熟的小建議:

1. 牢記網路是分層的,分層的,分層的(重要的事情說三遍。。。)。把每一層負責幹什麼搞清楚了後就會簡單很多。舉個不是很恰當的例子

1)拉根導線來互相傳0101吧。於是有了物理層。

2)0101到底是什麼意思啊?要不我們搞個規則出來,這樣大家都能理解?於是就有了數據鏈路層。

3)各種各樣的數據鏈路層協議太多了,怎麼才能互相聯起來呢?上面再加一層好了,把底層細節全部蓋住。於是IP協議出來了。

4)這份數據是從電腦上哪個程序發出來的啊?應該發到對方的哪個程序上?搞不定了,那就再加一層吧。於是TCP協議出來了。

5)一次只能發1000來個byte,好麻煩啊。可不可以一次性發一堆?當然可以啦,再加一層,於是HTTP出來了。

(再次強調,這個例子看著玩就行了,不要當真,重要的是要學會網路是分層的這個概念。具體每一層是幹什麼的請看書。。。)

大概就是這樣o(╯□╰)o。是不是發現每一層其實都是把下層細節給屏蔽掉了而專註自己這層的問題?換而言之,下面每一層的協議都可以隨便亂換,只要當前這一層大家能互相理解就好。比如網路層底下既可以是802.3也可以是802.11~

另外Wireshark是個好東西,抓包可以有效深入理解數據是怎樣一層一層被封裝起來的。

2. 網路的本質是通信,而通信里很重要的一個部分是協議。協議是幹什麼的呢,就是兩個人之間的一套怎麼建立聯繫然後怎麼溝通的機制。你可以想一下跟別人交流的時候是怎麼樣的,然後類比協議是怎麼做的。再次舉一個不太恰當的例子:

屌絲:女神,聽說你電腦壞了,我來幫你修吧?

女神:好呀。那你明天來吧。

屌絲:ok。

這樣屌絲就和女神建立起聯繫了。如果屌絲不回復ok的話後面的故事是不是就沒法進行了?是不是很像TCP的三次握手?

後來屌絲聽說女神跟別人在一起了。

屌絲:我不想再當備胎了。我把你的聯繫方式刪了。以後還是別聯繫了。

女神:好的。不過稍等我一下。

女神搬出了屌絲之前送的所有東西,然後統統還了回去。

女神:東西都還給你了。你的聯繫方式我也刪了。祝你以後好運。

屌絲:好的。祝你幸福。88。

是不是很像TCP的4次揮手?

(我是不會到處說當年大二學完計算機網路後大三又把每一層都單獨拉出來學了一邊,我校開課風格真是奇葩。。。)


應評論里某個言辭激烈的人的要求,我聲明我回答里的「沒半毛錢關係」應該改為「只有半毛錢關係」,這樣也許更準確點

-----------------------------

我回答的是「計算機網路該怎麼學」這個問題,不是「網路編程該怎麼學」。那些自我感覺良好,抬高自己貶低別人的還是歇了吧,誰都可以指出我的不對,但是得有理有據。

-----------------------------

看到知乎上總是有人對計算機網路和網路編程傻傻的搞不清楚,我覺得我有必要說一下,計算機網路和socket編程沒半毛錢關係

我想可能是知乎上碼農太多了,於是所有和IT有關的東西都和編程扯不清的關係,除了把計算機網路和網路編程混一塊外,居然還有人認為計算機網路是做網頁的。我可以很負責任的說,很多的網工是從來沒編過程的,而搞socket編程的碼農們也根本不需要對網路協議有多深的理解。

socket這個東西本來就是對網路協議和系統IO的一個封裝,程序員可以不用關心數據在網路中是如何傳輸的,只需要調用recv()/send()就夠了,可以讓程序員專註於交互和數據本身。而網工是要了解數據在網路中傳輸的每個細節,從而規劃和控制數據傳輸的過程。這兩者有根本的區別。

精通協議又搞編程的有么?當然有,這些人應該是研究網路協議,或者在網路設備廠商搞底層開發。或者是網工工作中遇到瓶頸和麻煩,半路學了點編程語言來解決實際問題。

簡單列一下計算機網路的相關知識點,畢業很久了,可能不全面。

  1. 區域網發展歷程、幾種拓撲,英特網的發展歷程,OSI模型;
  2. 傳輸介質,衝突域廣播域;
  3. 乙太網幀結構、mac地址,網橋和交換機,vlan和802.1Q,STP;
  4. IP協議和包結構,IP地址、子網掩碼,地址類別,VLSM和CIDR,ARP,ICMP,DHCP;
  5. vrrp,各種路由協議:rip、eigrp、ospf、isis、bgp;
  6. TCP/UDP,NAT;
  7. QoS
  8. 各種隧道;
  9. 組播;
  10. 無線;
  11. IPv6;

課本上基本都是從這些知識點開始,除了這些外,網工還常常要了解的:dns、http、ssl。

對比一下socket編程,以上內容估計99.9%都不涉及,所以說通過練習編程來學習網路這門課,真是想多了

正面回答一下題主的幾個疑問:

  1. 計算機網路技術可以總結為兩類:讓它通、讓它不通。讓它通就,是搭建新的網路,或者解決網路不通、丟包、緩慢等問題,或讓兩個現有的網路連接起來;讓它不通就是制定接入、訪問策略,建立加密和認證體系。所有的協議都是圍繞著兩類需求創造的,不同的協議適用不同的實際情況。
  2. 概念多,是真的,的確是很繁雜而且細節很多,現有的網路協議都是由不同的機構在不同時期一點一點增加和改進來的,所以繁雜瑣碎很正常。但是生活接觸不到、難理解我就不認同了,你想過你從插上網線到打開一個網頁要經歷那些過程嗎?是怎麼實現的?你有時候上網慢是什麼原因?怎麼去解決?人最可貴的就是好奇心和探索精神了,這些協議每一個的產生都是有實際確切的目的的,我覺得研究一件事物的機理是件很有意思的事。相對來說,工科的這些學科比起理科學科,根本不存在什麼抽象難理解。
  3. 方式就是協議。網路工程這門學科其實是需求主導的,是一個很實用主義的東西,什麼樣的需求就對應了採用什麼方式,採用某種方式就決定了要遵照哪些協議

對於一門實用技術來說,學習的關鍵當然是多動手、多做實驗,模擬器,抓包,有利於對協議和報文的理解。


網路這門課,講真確實有點複雜,但是學起來其實還是有點套路的。

1.重原理:要把各種原理深入理解後了解為什麼要這麼干

2.建體系:計算機所有的知識都是體系化的,網路也不例外,所以要把體系建起來

3.勤動手:網路中的各種協議要通過編程來實現其數據結構和機制(如果你認為這個沒必要,我認為你適合去配交換機和路由器,或者去搬),並且要通過數據包分析去了解裡面的內容

4.看對書:推薦Andrew S的計算機網路和TCP/IP詳解的卷1和卷2,至於學校的教材嗎,拿來科普不錯。


興趣是最好的老師 不要太著急。

我一開始特別喜歡網路 總是想搞明白什麼是網關 什麼是子網掩碼 什麼是ip地址

一開始碰到這些不明白的總喜歡百度, 但是很多想法我卻無法去驗證,比如兩台電腦直連用不同地址段的ip會有啥後果?子網掩碼不同能通信嗎?不加網關能通信嗎?直到我有一天知道了虛擬機這種東西 通過不斷驗證 我才真正明白了同網段乙太網通信的原理。之後又偶然知道了思科和gns3模擬器 從此一發不可收拾。各種稀奇古怪的網路拓撲,各種實驗,你根本沒法理解那種菜鳥第一次組網ping通了的那種成就感!!舒服啊!!

入門我不建議直接看網路原理的書,旁支末節太多,讓你從信道帶寬信號編碼時分復用之類的開始學你會崩潰的!也根本用不到!我建議就是先通過模擬器練習組網,當你怎麼都ping不通你組的網路的時候再去翻書找答案。

好像有本書是專門講gns3的用法的你可以搜一下,還可以找幾本實驗手冊,把裡面的實驗做完,多去思考,慢慢水平就上來了。


我當年學的時候是自底向上的順序,學鏈路層的時候也是一臉懵逼,不過不要緊,相信我,等題主學到網路層就會豁然開朗的。

如果實在是覺得痛苦,像上面那些答主一樣用那本TCP/IP自頂向下的書也不錯。

此外,題主說網路那些概念生活中用不到,所以比較抽象,這個我的感受不同,,我覺得對於網路協議而言,,學的時候可以想像是一堆人在對話。

首先,必須保證所有人的語言相通,這樣才能互相聽懂理解。(比方說差分曼徹斯特編碼)

然後,要建立一個說話順序的規則,不然所有人都嘰嘰喳喳,誰都聽不清別人在說什麼。(比方說csma)

有時候你想和別人說一件重要的事情,,會需要一個面向連接的可靠的協議來表達。

也可能你就是突然想講個段子,你想儘快表達清意思,這時候無連接不可靠也無所謂。

有時候你想說悄悄話,不想讓其它人聽到,你需要加密。(比方說https)

你還可以考慮這麼一些問題:在ARQ中,如果我不用確認幀來確認收到信息,而是用否認幀來向對方表示我沒有收到某些信息,會怎麼樣?在一個不穩定的網路里,如何保證協議有效性?相比於確認有什麼優點和缺點?

再比如說,如果不用在CSMA裡面不用1-堅持或者是p-堅持,而是直接延時固定的一段時間,設定網路里的各個終端延時時間不同,是否可行?

假如網路非常不穩定,由套接字聯繫起來的終端隨時有可能突然宕掉,從這個角度考慮一下,為什麼TCP握手一定得是三次而不能是兩次?為什麼釋放一定得是四次而不是三次?

你還可以自己用matlab或者Python跑一個模擬程序,模擬若干個終端,隨機時間發送TCP報,大家都按照慢開始有個閾值三次重傳協議這樣子,看看整個網路的流量情況。

網路還是蠻有意思的東西呢。


計算機類的很多課程開始學第一遍甚至第一門的時候吃力是很正常的,計算機網路開始學是這樣的,先學會每一節的內容,然後學完後回過頭在看幾遍,這時候結合其他章節甚至其他科目來學習,有能力的甚至可以自己用c/c++或者java來寫個聊天工具,用抓包工具抓網路幀分析端到端的各層協議的工作內容。還可以模擬給學校劃分子網啥的,計科屬於理工科,甚至如果不是研究型人才估計都偏工科教育,不動手是不可能學好的。想學好至少把課後習題都給做了吧,想融匯理解show code吧。


最近也在複習網路。

你說學到鏈路層了,如果你用傳統網路教程,到鏈路層估計還是一臉懵逼,因為太不直觀了,路由器交換機這些東西離普通網民太遠,一點感性認識都沒有。所以推薦《計算機網路:自頂向下方法》,中文有第六版,英文到到第7版了,不過差不多。它從上層講到下層,應用層和傳輸層講完的時候,結合你上網的經驗,估計你有很多體會。後面的就水到渠成了。

然後還有TCPIP 詳解的卷一,可以搭配著看,重合度高,但是細節很多。

最後無恥推薦本人的筆記。

https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES

書每章後面有一些編程作業等其他東西,但詳細文檔是在官網上的,鄙人翻譯了英文文檔,給出了一些筆記。

大概是這樣,還在更新中,有需要的可以關注一下。


網路的話我覺得一開始還是比較無聊的,以記憶為主,我們用的是自頂向下第七版,講了前半本書。我真正對網路有所理解是上完第二門做各種 project 的課之後(其實我們這一學期才10周,所以兩門課也就跟國內一門課時間差不多)。做了這麼幾個小 project:第一個是重寫 netcat,理解了 TCP UDP 的各種收發操作。第二個是 MPTCP 協議的實現,這個資料比較少,基本上就是對著 RFC 一直擼,不過對 TCP 的理解更深入了。第三個是 man-in-the-middle HTTP/HTTPS proxy。難度不大,但是要針對 HTTP 報文的各種細節有些了解。同時也掌握了 SSL/TLS 和一些安全方面的概念,比如偽造 cert 截取通信內容什麼的。

總之手動寫寫各種 project 是蠻好的,處理各種 corner case 的時候會被逼著去讀 RFC,去手動模擬各種協議細節,一定要每個細節都掌握了才能正確的實現。至於 project 的話,動手搜搜北美各個學校的 computer networking 的課吧,課程主頁一般都是公開的,一般也都會有很多 project 和配套的文檔。搜的時候也可以搜比較新的學期,比如(課程名 學校 Spring 2017 / Winter 2016 / Fall 2016)。


其實我覺得這門課是計算機基礎課里最簡單的了。

可能我看的那本書和邢大本差不多厚吧。


網路學到鏈路層,就相當於高數還沒學完極限,

又不理解原理,也不知道幹嘛用的,想想大一第一次翻開高數的懵逼,是不是好像和現在一樣?

有兩條路,一是硬著頭皮學,看的懂得看,看不懂的,等看到後面頓悟了,返回來看

二是直接跳到應用層,愉快的這一個下載器,瀏覽器,爬蟲等,一邊寫一邊查,還沒寫完就懂了


不請自來

計算機科學與技術專業大三在校生

僅僅是通過期末考試的話:

·老師期末會劃重點

·複印店有往年的期末考試題

考研的話:

·買複習資料

·報班

純粹興趣的話:

有興趣你還怕啥,

一本書根本就不夠看啊,

各種百度各種資料應有盡有啊,

每天自學到深夜完全無法自拔啊有木有。

多說幾句:個人認為,本科階段學的大部分科目,都只是在帶你進行了解,很少有能深入學習的。

比如計算機網路,幾十年的發現,幾代人的心血,單憑那一本書,也就是入個門。

我很多同學,上了三年大學後,去外面花幾萬塊錢上編程的培訓班,上完後再去找工作。

有人問:不上大學直接上培訓班不是一樣嗎?

其實是不一樣的,舉兩個個例子:

很多人認為「軟體工程」就是敲代碼的,

「資料庫」就是增刪改查。

在上這些專業課前我也是這樣認為的,然而事實並不是這樣。

你讓一個高中畢業生去上培訓班學java,學兩三個月也能去敲代碼了,然而他能做的,也僅僅是敲代碼,你問他數據結構是啥,他會一臉蒙逼,更別提什麼java虛擬機工作原理(當然,這個大學裡也不一定教)。

在我看來,大學的作用是開闊一個人在某一專業上的眼界,告訴你這個專業都學些什麼,研究些什麼,而真正想要深入學習,還得。。。


唯一的捷徑是 實踐+看高手開源代碼 啊, 脫離實踐看理論,理論就是天書,完全不能理解,你自己實踐下,馬上就明白了。可以用虛擬機或者很便宜的設備比如樹莓派之類模擬組網,自己實現各種協議,模擬各種實際情況,比如斷線重連等等,再就是看高手代碼,github上找各種網路代碼,看看高手是怎麼做的,最後才是看書,實踐中發現不明白的,再回頭去學習理論。堅持下來估計1,2年時間你已是網路高手了。。。。


彷彿看到曾經的自己在課堂上看著老師唾沫星飛舞的手舞足蹈的,彷彿老師自己就是一台路由器化身一樣的講解七層模型的樣子,而我還是一臉懵逼的心裡搗鼓著,你特么到底再講什麼?一直到畢業也沒學明白,後來花了800塊上了一個一個星期的ccna培訓班,老司機直接帶著搭拓撲,抓包包,看封裝,看包頭,看協議,一星期以後,我心裡搗鼓著,卧槽,原來這麼簡單。。。。以上是我的入門過程。我想說,學網路,先理解框架,就是所謂的分層概念,然後再去填補每一層的東西,再去細化協議,後期有興趣再去研究協議的實現方式。多動手,

最後說一句,

wireshark是個好東西。

eve-ng也是個好東西。


wireshark抓包


謝希仁的計算機網路,一遍下來,基礎知識就有了,到這兒其實就夠了,後續自由發揮


不請自來,網路工程本科,相關行業三年工作經驗,大概回答一下!

1.計算機網路,說的很明確,是一個由計算機組成的網路,主體是網路,計算機是形容詞。在這張網路里有大量計算機!

這裡的計算機不要拘泥於電腦,可能還有交換機,路由器,防火牆,伺服器等!

類似的概念有人體大腦神經網路,這也是一張網路,有大量神經元組成!

2.根據名稱確定了主體是網路,所以它描述的一定是這張網路里的事!那麼計算機網路的歷史,組成方式,通信方式等等也都是課程相關的!只是這本書但當涉獵而已,深入學習了解還需要通過更專業的書籍!

3.你現在理解困難,是因為你對這一個知識板塊的框架還沒建立起來。就相當於建樓房,你現在鋼筋架子還沒搭起來,所以混凝土根本填充不進去!你現在要做的,一方面是大量的理論知識儲備,另一方面就是大量的動手實踐。

4.動手實踐這一塊,我因為最終走了網工這條路,所以開始學習的是思科那套東西。你是計科專業,我建議通過編程形式來理解更合適,具體可參加上面的回答。

以上,可隨時溝通!


為什麼我越學越興奮?

我還是上個學期學的。


不請自來,網路是啥樣的。我想說,他和編程有區別,可以在到達一定程度後用編程去模擬,以及融匯貫通。但是簡單的把計算機網路說做編程,我想說「是知乎的碼農太多,還是小白太多呢?」

回歸正題,想學習試著去考證,證書不重要,重要的是能快速入門。就和小時候背古詩詞一樣覺得沒用,但是總有某一天你會在生活中遇見詩中說的某景。突然發現,原來詩句這麼美。

多玩模擬器,多看報文結構,重原理,講思維。推薦華為和思科的那一套。不要在初期把編程思想帶進來,因為一個簡單的協議都是很多年的積累,不是新手能快速實現的。以上主要反對那些只要有計算機三個字的人就推薦xxx語言的人。

順便說下我的工作方式。

如下上來就是刷腳本,不通就再刷一次。如果還不行就回退。一回退老闆就扣工資。一扣工資就辭職!一套流程走的相當求教!!!完美!perfact


用wireshark抓包,然後分析每個包的每個欄位


要考試了吧!嘿嘿嘿。

自己要有體系的去理解。


推薦閱讀:

IT行業有哪些證書含金量高?
在紐西蘭當程序員是一種怎樣的體驗?
如何評價李彥宏所說的移動互聯網時代已經結束?
你所做過最有效提高編程技能的事情是什麼?
windows為什麼不添加圖形界面的定時關機功能?

TAG:計算機 | 信息技術IT | 計算機網路 | 計算機科學 | IT行業 |