但信件郵寄到目的地址後由誰來收?從上面這封信的收件人地址檢索到這個地址是「瀋陽大學」的,瀋陽大學裏可能住着幾萬人,那你這封信是郵寄給居住瀋陽大學裏的那我的的?收件人不明確,郵局就算幫你把信件送到這個地址,也沒辦法幫你投遞到具體的收信人。緩存
所以,咱們郵件信件須要填寫「收件人姓名」、「收件人地址」和「寄件人姓名」、「寄件人地址」的組合,這樣才能保證信件能準確投遞到具體的收件人手中。服務器
因此咱們要在信件上添加收信人姓名和寄信人姓名(由此引入端口號),這個時候收件人姓名就對應數據包裏TCP協議頭部中的目的端口號,寄信人姓名對應數據包裏TCP協議頭部中的源端口號。微信
咱們再來對比傳遞信件與傳遞數據包的過程:網絡
1.首先是位於南寧的李小明給瀋陽的王小花經過QQ發送了一條消息,李小明的電腦將此消息打包成TCP數據包發送到計算機網絡中,計算機網絡經過數據包中的目的IP地址把該數據包準確傳遞到王小花的電腦。工具
由上面的例子咱們還能夠引伸出數據包結構中的其餘字段的做用,例如咱們收到信後能夠簡單地經過信封是否完整來檢查該信件是否被別人在傳輸途中拆開並篡改過信件內容,那麼咱們怎麼保證咱們收到的數據包裏的數據有沒有在中途被別人拆開修改過呢?數據包結構中有一個字段叫TCP校驗和就是專門作這個工做的。由數據包的字段能夠看出,不少字段都有其用處,只是咱們一開始學的時候不必學的那麼仔細而已。學習
必定要形象地理解數據包,簡單的想一下,計算機網絡不就是幫助咱們傳遞信息的嗎?對於郵寄信件來講,信息的載體是信紙和信封,那計算機網絡中信息的載體是什麼?就是各類類型的數據包啊! 數據包裏有咱們關心的信息,也有咱們不關心的花銷,咱們要學的就是如何使網絡按照咱們的要求傳遞信息。例如,咱們郵寄信件,有平信,有掛號信,根據不一樣的應用場景選擇不一樣的郵寄方式。計算機網絡裏信息傳輸也是同樣,針對不一樣的場景使用不一樣的協議, 有些場景須要多種協議同時配合使用。 動畫
上面那個QQ的例子不太嚴謹,由於QQ和微信的信息都是經過騰訊服務器中轉的,但你是初學者不必一開始就深究這些細節,總之要學會把一切抽象的東西都對照生活中的一些場景使之形象化。這樣你的學習過程就不會那麼枯燥乏味了。spa
再來看一下爲何須要網絡協議,咱們看下圖的簡單類比:計算機網絡
從上圖能夠看出,咱們郵寄信件只是想要把咱們寫在信紙信息傳遞出去,對於咱們來講,郵寄信件須要購買信封和郵票,這對於咱們來講是沒有意義的,甚至咱們會以爲連信紙都是多餘的,由於還要購買信紙,咱們只是想傳遞信息而已,信封、郵票和信紙對於咱們來講是傳遞信息的額外花銷,可是沒有這些花銷,你的信息就沒法經過郵局傳遞。同理,在計算機網絡裏也是同樣的,咱們的經過計算機網絡傳遞信息也須要額外的花銷,這些花銷體如今計算機網絡裏就是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 就很好用,它有個模擬功能能夠像看動畫同樣看到網絡數據包是如何在網絡拓撲結構中傳輸和交互的,對了解協議的工做過程很是有用,還有抓取數據包的功能,能夠抓去指定協議的數據包進行查看。
使用真實設備經過在電腦上安裝抓包工具進行抓包也能夠,只不過沒有模擬器上看得那麼直觀,對於初學者仍是建議先以模擬器作實驗爲主,由於你能夠很直觀地觀察你所設計的網絡的運行狀況,更容易把心放在學習網絡協議的工做過程上。