
你之所以不知道那套書在講什么,是因為你還沒有認識到網絡協議有什么用,怎么用,以什么形式在使用,網絡協議的概念很簡單,就幾句話,你只知道網絡協議的概念,只知道很多大神都推薦這套書,都強調網絡協議的重要性,于是你就去找了這本書,然后看著書上的每個字你認得,串在一起就不知道在講什么!那是因為網絡協議本來就很抽象,你要把抽象的網絡協議形象化才能更好的理解,最好是先理解具體的網絡協議是起什么作用,然后再學習它的工作過程。
你把網絡協議想象成人與人之間的禮儀行為,不同的場合有不同的禮儀行為,人是實施不同禮儀行為的主體。同樣,網絡設備是實施網絡協議的主體,網絡設備通過運行網絡協議與其他的網絡設備進行交流。同樣的道理,你的電腦想要與網絡設備交流,也要與網絡設備一樣運行網絡協議,網絡協議也是一個軟件,是以系統組件的方式安裝在你的電腦的操作系統里的。想象一下,你想在你的電腦上通過QQ與朋友聊天的前提是不是你的電腦和朋友的電腦上都安裝有QQ這個軟件?
我一直覺得對于計算機網絡初學者來說,知道“為什么這么做”比“知道怎么做”更重要,雖然經歷知道“為什么這么做?”的過程很痛苦,但一旦過了這個階段,“知道怎么做”也就水到渠成了。但是對于初學者來說,真沒必要那么深入地學習網絡協議的細節,你只需要理解常見協議(例如HTTP、FTP、DHCP、DNS、ARP等常見協議)的工作過程,你理解了這些協議,理解其他的協議就是依葫蘆畫瓢,雖然計算機網絡很講究知識的積累,但如果你一開始把太多的精力放在了解細節上就會陷進只見樹木不進森林的境地。
例如,數據包的結構,瀏覽一下各字段的作用就可以了,能記住就記住,記不住也沒關系,你只需要先重點理解ip頭部里的目的地址、源地址和tcp頭部里的目的端口號、源端口號。

在日常生活中,我們要傳遞信息,以前最常用的手段是郵寄信件,想象一下你寫信寄信的過程,寫信產生數據,寄信傳遞數據,標準的信件格式是要在信封上寫“收信人地址”和“寄信人地址”(由此引入IP地址),“收信人地址”對應數據包里IP頭部中的“目的ip地址”,“寄信人地址”對應數據包里IP頭部中的“源ip地址”,寫上寄信、收信兩個地址就可以保證信件可以郵寄到目的地了。

但信件郵寄到目的地址后由誰來收?從上面這封信的收件人地址檢索到這個地址是“沈陽大學”的,沈陽大學里可能住著幾萬人,那你這封信是郵寄給居住沈陽大學里的那個人的?收件人不明確,郵局就算幫你把信件送到這個地址,也沒辦法幫你投遞到具體的收信人。
因此,我們郵件信件需要填寫“收件人姓名”、“收件人地址”和“寄件人姓名”、“寄件人地址”的組合,這樣才能保證信件能準確投遞到具體的收件人手中。

所以我們要在信件上添加收信人姓名和寄信人姓名(由此引入端口號),這個時候收件人姓名就對應數據包里TCP協議頭部中的目的端口號,寄信人姓名對應數據包里TCP協議頭部中的源端口號。
我們再來對比傳遞信件與傳遞數據包的過程:
1.首先是位于南寧的李小明給沈陽的王小花通過QQ發送了一條消息,李小明的電腦將此消息打包成TCP數據包發送到計算機網絡中,計算機網絡通過數據包中的目的IP地址把該數據包準確傳遞到王小花的電腦。

2.王小花的電腦收到了李小明的電腦發送過來的數據包,但是王小花的電腦上同時運行有多個程序(例如圖中的QQ和微信),雖然王小花的電腦知道這個數據包是傳輸給它的,但是它不知道該把這個數據包中的數據交給那個程序(就像上面講的,信件雖然郵寄到了沈陽大學,但沈陽大學里住著那么多人,這封信上沒有標示說是郵寄給誰的)。

3.針對以上的問題。如果我們使用數據包結構中的源端口號和目的端口號,根據不同的程序使用不同的端口號來發送和接受數據,這樣數據包就能像郵寄信件一樣準確投遞到具體的電腦上指定的程序了。例如我們指定QQ和微信使用的端口號分別是8000和8080,那么只要你的電腦接收的數據包里目的端口號是8000,那這個數據包就是傳輸給QQ的。


由上面的例子我們還可以引申出數據包結構中的其他字段的作用,例如我們收到信后可以簡單地通過信封是否完整來檢查該信件是否被別人在傳輸途中拆開并篡改過信件內容,那么我們怎么保證我們收到的數據包里的數據有沒有在中途被別人拆開修改過呢?數據包結構中有一個字段叫TCP校驗和就是專門做這個工作的。由數據包的字段可以看出,很多字段都有其用處,只是我們一開始學的時候沒必要學的那么仔細而已。
一定要形象地理解數據包,簡單的想一下,計算機網絡不就是幫助我們傳遞信息的嗎?對于郵寄信件來說,信息的載體是信紙和信封,那計算機網絡中信息的載體是什么?就是各種類型的數據包啊! 數據包里有我們關心的信息,也有我們不關心的花銷,我們要學的就是如何使網絡按照我們的要求傳遞信息。例如,我們郵寄信件,有平信,有掛號信,根據不同的應用場景選擇不同的郵寄方式。計算機網絡里信息傳輸也是一樣,針對不同的場景使用不同的協議, 有些場景需要多種協議同時配合使用。
上面那個QQ的例子不太嚴謹,因為QQ和微信的信息都是通過騰訊服務器中轉的,但你是初學者沒必要一開始就深究這些細節,總之要學會把一切抽象的東西都對照生活中的一些場景使之形象化。這樣你的學習過程就不會那么枯燥乏味了。
再來看一下為什么需要網絡協議,我們看下圖的簡單類比

從上圖可以看出,我們郵寄信件只是想要把我們寫在信紙信息傳遞出去,對于我們來說,郵寄信件需要購買信封和郵票,這對于我們來說是沒有意義的,甚至我們會覺得連信紙都是多余的,因為還要購買信紙,我們只是想傳遞信息而已,信封、郵票和信紙對于我們來說是傳遞信息的額外花銷,但是沒有這些花銷,你的信息就無法通過郵局傳遞。同理,在計算機網絡里也是一樣的,我們的通過計算機網絡傳遞信息也需要額外的花銷,這些花銷體現在計算機網絡里就是TCP/IP的各種協議數據包的頭部(除去應用層數據之外的其他信息)。
你要知道計算機網絡里的數據交換都是像我們日常郵寄信件一樣通過各種的數據包來傳遞的,理解了數據包的作用之后你就應該開始學習計算機網絡是如何把數據包傳輸到目的地的?例如我們的電腦在生成數據包時是怎么知道對方電腦的ip地址的,(由此引入DNS)?我們的信件是最開始是通過郵局幫我們郵寄的,那么我們的電腦的數據包應該由誰來幫我們傳輸呢?(由此引入網關),網關又是如何幫我們把數據包傳輸到目的地的?(由此引入各種路由協議)。
所以,你想要學習網絡協議,就要先把一些基本的協議的作用和工作過程搞清楚,網絡設備還沒智能到人腦的程度,它是由人類創造出來的,它的工作過程肯定是符合人類的交流習慣,按照人類的交流習慣來設計的。所以要以人類的思維方式去理解這些協議。例如,你給別人打電話,不可能電話一接通你就啪啦啪啦地說一大通,萬一對方接通電話后因為有事還沒來得及傾聽呢?這不太符合正常人類的交流習慣。一般是電話接通后,雙方一般會有個交互的過程,一般是你說一聲“你好”,然后對方也回復一聲“你好”,雙方通過各自一句“你好”明確對方的注意力都放在了電話溝通上,然后你們雙方就可以開始交流了,這才是正常的人類交流方式,這個過程體現在計算機網絡里就是網絡協議!我們通過TCP協議在兩臺電腦建立網絡連接之前要先發數據包進行溝通,溝通后再建立連接,然后才是信息的傳輸。而UDP協議就類似于我們的校園廣播,廣播內容已經通過廣播站播放出去了,你能不能聽到,那就與廣播站無關了,正常情況下,不可能你說沒注意聽然后再讓廣播站再播放一次廣播內容。
同理,我們來看一下網絡廣播,對于某一個網絡的網絡廣播,只要發送一個網絡廣播包,這個子網里的所有電腦都能收到這些廣播包,這是一個很方便的通知機制,但是會增加對廣播數據不感興趣主機的處理負荷。類似我們的校園廣播,校園廣播一開啟播放,校園里的所有人都能聽到,但是不是所有人都對廣播內容感興趣,有些人選擇傾聽,有些人選擇忽略。但不管你是傾聽還是忽略,廣播的聲音都會傳到你的耳邊。例如,校園廣播一條失物招領通知,你根本沒丟東西,所以這個廣播內容與你無關,但是廣播的聲音還是會傳到你的耳邊。對比廣場舞音樂,對于跳廣場舞的大媽大嬸來說,這就是音樂,對于想睡覺的您來說,這就是噪音。
怎樣才能更好地理解常見的網絡協議?學習網絡協議就是要先學習它的工作過程,例如DHCP協議,協議大概是這樣講的:啟用了DHCP協議的電腦啟動后便會發送廣播數據包網絡中尋找DHCP服務器,如果網絡中有DHCP服務器,這臺DHCP服務器便會發送廣播數據包與你的電腦進行響應。
這個過程很簡單,就是我想要獲取ip地址,然后你給我提供一個。想象一下如果你是DHCP協議的設計者,你會考慮到在ip獲取和分配過程中會有哪些特殊情況呢?
第一種,如果在你啟動電腦的過程中網絡中的dhcp服務器剛好宕機了,這時怎么辦?讓你的電腦一直徒勞地發送尋找DHCP服務器的廣播包嗎?還是在發現沒有DHCP服務器與你響應后就再也不發了?還是每隔一段時間就再發送一次尋找DHCP服務器的廣播包?
第二種,如果DHCP服務器的可用ip地址剛好已經分配完了,那又怎么處理?
第三種,如果網絡中同時有兩臺以上的DHCP服務器,那又該怎么處理?
第四種,對于已經分配出去的ip地址就這么一直保持分配出去的狀態嗎?還是要回收?如果要回收?是我去問你還要不要使用這個ip地址?還是我設定一個回收的時間?只要你在這個時間段內你沒有再次聯系我重新獲取這個ip地址我就把它回收?
通過這樣的思考你可以發現,網絡協議其實也是按照人的思維方式在工作,但是網絡設備不會像人一樣思考,所以我們當初給它設計各種協議的時候就要盡可能地為它想到這些協議所要應對的場景。例如,你可以先學習ARP協議的工作過程,然后再百度搜索ARP攻擊是怎么回事?就是利用ARP協議設計的不嚴謹,偽造ARP數據包篡改網絡里其他電腦的ARP緩存列表。ARP協議采用廣播發送協議數據包,這就導致里網絡里的每一臺電腦都會收到ARP的協議數據包,而ARP協議規定即使你的電腦沒有發出arp請求,只要有ARP回應包到達你的主機,你就要對這些協議包進行處理,并將回應包中的mac和ip對應關系放入自己的arp緩存。如果ARP回應包里面的網關IP與ARP對應關系是正確的,這個問題不大,但如果有人在網絡中偽造了錯誤的網關IP與ARP對應關系并廣播到網絡里,那就出問題了,你可能也意識到你上不了網是因為網關IP對應的ARP對應關系出錯,但是沒有辦法,因為你的電腦上運行的ARP協議規定,你的電腦必須要接受這個錯誤的對應關系,這就是網絡協議設計的不嚴謹,設計和實現ARP協議的時候沒有想到居然會有人在網絡中偽造ARP回應包并廣播到網絡中。
如果你看《TCP/IP詳解》這套書覺得很吃力,那就建議暫時不要看了,強烈建議你先看《計算機網絡自頂向下方法與Internet特色》這本書,這本書對常見的網絡協議的工作過程進行了分析,可讀性很強,看起來比《TCP/IP詳解》輕松多了,了解了常見協議的工作過程你就可以動手做實驗來驗證這個協議的工作過程了,建議先使用模擬器來做實驗,像cisco packet tracer 就很好用,它有個模擬功能可以像看動畫一樣看到網絡數據包是如何在網絡拓撲結構中傳輸和交互的,對了解協議的工作過程非常有用,還有抓取數據包的功能,可以抓去指定協議的數據包進行查看。
使用真實設備通過在電腦上安裝抓包工具進行抓包也可以,只不過沒有模擬器上看得那么直觀,對于初學者還是建議先以模擬器做實驗為主,因為你可以很直觀地觀察你所設計的網絡的運行情況,更容易把心放在學習網絡協議的工作過程上。
你提問的是“TCP/IP協議到底在講什么?”,你可能不太了解,TCP/IP協議是一個協議族,是一大堆網絡協議的集合,你看的那套書有三卷,每一卷都是很厚的,就算其他大神能幫你用通俗易懂的文字表達出來,我估計這個帖子打印出來也不會比那本書薄很多,還是先從簡單的學起吧!
鏈接文章
https://www.zhihu.com/question/51074319/answer/124733136