TCP/IP 協議到底在講什麼?
看了很久的Richard Steven著的TCP/IP協議卷一: 詳解 感覺自己讀起來十分吃力 該怎麼學這個 TCP/IP協議到底是在講些什麼 了解了TCP/IP協議能做些什麼 還請各位指教。
先來談談汽車行業,隨著家庭轎車的普及,越來越多的人開始使用汽車,其中99%人可能只會開車,不會修理汽車,也不了解汽車內部構造(細節),但這並不影響我們使用汽車。
而對於汽車維修工程師,很顯然要精通汽車的內部構造,非常資深的工程師可以通過汽車的聲音來定位故障點,這依靠的是多年的經驗。而對於初入行的年輕工程師,如果只是看汽車的維修手冊,即使看千遍也不一定會維修汽車。經常去4S店看到維修工將受損嚴重的汽車大卸八塊,有時還會有老師傅在邊上指導,通過這些動手操作,加上師傅的指導,再去參考維修手冊,要不了多久就會很熟練地維修汽車,這樣的模式:動手 + 理論 + 師傅指導 同樣也適用於計算機網路的學習。
對於99%用戶也不需要懂計算機網路,電腦、手機可以自動上網,即使有什麼問題,通過插拔線、重啟電腦、重啟無線路由器基本上可以解決90%以上的問題。但是做為一位網路專業人士,則需要精通計算機網路的工作原理,精通原理可以幫助非專業人士提供專業的服務。
TCP/IP協議不是計算機網路的全部,但TCP/IP協議涵蓋了OSI參考模型的第三層、第四層,即網路層、傳輸層。TCP/IP也不是只有TCP + IP這兩種協議,它是協議棧的統稱,至少它還包括 ARP,ICMP,IGMP,UDP,以及讓域名訪問成為可能的DNS,以及電腦/手機可以自動獲取IP地址的DHCP。當然還有形形色色的應用層的協議如 HTTP / SMTP / FTP 等。
回到問題本身,《TCP/IP協議》詳解卷一,是一本很好的教材,但是光看書有用嗎?效果很差,因為這本書有點難度的。不動手不會有感性認識,然後讀者會被抽象的概念弄的越來越迷糊,覺得越來越無聊,最終扔掉書,因為我干過好多次,然後過段時間又撿起來…
既然光看書很無聊,那就動動手吧。那時工作在國企,公司網路和互聯網隔絕,QQ也無法使用,於是我就按照 Visual C++教程編寫了聊天小程序(基於TCP socket ),把這個小程序給樓下的同事,無聊的時候就聊聊天,比如什麼時候去吃午飯,下班什麼時候撤?在程序啟動的時候我就開始抓包,想看看究竟聊天內容怎麼封裝?究竟幾個包完成發送任務?
封裝倒很簡單,讓我驚訝的是,一條消息竟然雙向耗費9個包,百撕不得其解,不就是調用一次 connect()建立連接,調用一次 send(),然後程序退出。
TCP建立連接
於是就去翻書,這次有針對性,直接翻到TCP協議部分,只看TCP如何建立連接,發現建立連接需要三個包的交互,這個應該是connect()完成的。
TCP發送數據
然後看到自己的消息內容是一個包,對方沒有數據,只有確認ACK,這是兩個包,這個由 send () 觸發。
TCP釋放連接
然後系統自動退出,雖然我的程序沒有調用什麼函數,但是系統自動幫我調用了 close () 函數,於是又觸發了TCP 關閉連接,這是四個包。
於是把這三個階段包的交換加在一起:3 + 2 + 4 = 9 ,哦原來是這樣啊,通過這個小程序,再有針對性地看書,覺得很有趣。
後來我又試試用UDP socket 編寫聊天程序,直接調用一個函數Sendto() 就可以了(用IP訪問),抓包一看,一個消息就是一個包,對方也沒有確認,UDP就是加上一個封裝頭就出去了,不需要建立連接,自然也無需關閉連接。
後來工作需要編寫一個模擬程序,模仿GPS接收設備給導航設備周期(100ms 一次)發送GPS經緯度信息。介面為乙太網介面,導航設備有嵌入式操作系統,支持TCP/IP協議棧,有了以前的動手經驗,我很快就編寫出基於TCP socket 的模擬軟體,工作也很正常,但是有時發送數據會有卡頓的現象,時快時慢,有時還會停止發送。於是開始分析網路,辦公室網路是交換機口到牆壁,然後用HUB再分出更多的埠,讓大家共享帶寬。於是想到了 CSMA/CD機制,電腦工作在半雙工模式,發送數據前需要監聽網路,當網路繁忙時,大家一起競爭,所以會有很大的延遲。
於是又用UDP socket 編寫了相同的軟體,卡頓現象好多了,後來我分析因為UDP包沒有自我約束機制,調用一次sendto() 函數就把數據給IP,IP給網卡,網卡有CSMA/CD機制,會等待,也許會有延遲,也許會因為衝突而丟棄重發、或線路質量差出現CRC錯而丟棄,但我的程序不 care,依然會按照100 毫秒發送一組數據,所以我最終選擇UDP來做傳輸機制,丟一組、或幾組數據沒有多少關係,只要能把經緯度數據傳送過去就可以了。
寫了這些故事想表達的是:學習協議一定要動手,最好是結合項目來實踐,然後需要補充哪些理論,有針對性地去翻書,對於每一個陌生的協議,需要抓包分析,不要偷懶,一份耕耘,一份收穫。
更多的關於TCP/IP協議,可以參考以下鏈接:
http://zhuanlan.zhihu.com/p/22516664
題主,你之所以不知道那套書在講什麼,是因為你還沒有認識到網路協議有什麼用,怎麼用,以什麼形式在使用,網路協議的概念很簡單,就幾句話,你只知道網路協議的概念,只知道很多大神都推薦這套書,都強調網路協議的重要性,於是你就去找了這本書,然後看著書上的每個字你認得,串在一起就不知道在講什麼!那是因為網路協議本來就很抽象,你要把抽象的網路協議形象化才能更好的理解,最好是先理解具體的網路協議是起什麼作用,然後再學習它的工作過程。
你把網路協議想像成人與人之間的禮儀行為,不同的場合有不同的禮儀行為,人是實施不同禮儀行為的主體。同樣,網路設備是實施網路協議的主體,網路設備通過運行網路協議與其他的網路設備進行交流。同樣的道理,你的電腦想要與網路設備交流,也要與網路設備一樣運行網路協議,網路協議也是一個軟體,是以系統組件的方式安裝在你的電腦的操作系統里的。想像一下,你想在你的電腦上通過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協議是一個協議族,是一大堆網路協議的集合,你看的那套書有三卷,每一卷都是很厚的,就算其他大神能幫你用通俗易懂的文字表達出來,我估計這個帖子列印出來也不會比那本書薄很多,還是先從簡單的學起吧!
樓主你好,我試著回答下你的問題。
樓上的各位說的都很清楚了,想要學好它,就一個字:「整」,因為大家都是這麼過來的。
想學好一個東西要麼有壓力,你不得不做(比如樓上好幾位被老闆逼的);要麼有動力,你特別想做(比如前兩天 @餘弦 發的用Python爬美女圖片)。如果沒有,那麼去找一個讓你學下去的理由。
《TCP/IP協議卷一: 詳解》確實是一本神書,但是它不是一本適合入門的書。這句話的意思是如果你讀著它還會覺得枯燥、不爽,那麼可能你還需要再入入門。
TCP/IP要怎麼學?
先會開車,再去考慮它是怎麼跑起來的
首先,請你試著回答一下下面的幾個問題:
1、你會劃分子網掩碼嗎,會算主機數嗎、了解CIDR、VLSM嗎?
2、單播、組播、廣播有什麼區別?
3、交換機、路由器有什麼區別?三層交換機和路由器的區別呢?
4、有哪些動態路由協議,他們分別是由哪些協議承載的?
5、說說RIP和OSPF的區別
6、簡單說說你敲下回車,到對端收到消息,中間發生了什麼?從輸入 URL 到頁面載入完成的過程中都發生了什麼事情?
……
如果上面的問題你感覺答得很不錯了,那麼相信你讀詳解會讀的很爽的。如果答得不太流暢,可能你需要這樣的一個學習過程:謝希仁的《計算機網路》→思科的CCNA教材或者H3C的路由交換基礎都不錯。網上資源很多,找找視頻看,比自己瞎學效率會高很多,下個模擬器,搭建網路環境試一試,多做,做熟了自然就懂了。
接下來我們就可以開始品嘗《TCP/IP協議卷一: 詳解》了。
這裡用tracert程序作為例子來講解,它和ping都是非常常用的測試網路連通性的程序。(你可以用同樣的方法去看看ping程序,很多人都把它當做一個協議)。
首先,你需要安裝wireshark,關於安裝和使用的教程網上很多。
接下來打開DOS,tracert一下百度看看:
這就是Windows上tracert的實現過程,你翻開書,它裡面是不是有講?首先主機發送一個TTL值為1的IP報文,中間第一台設備收到以後發現目的不是自己,所以丟棄,同時回復給源主機一個TTL超時報文;然後源主機就知道自己的第一跳是誰了,接下來發送一個TTL為2的IP數據報……直到到達目的主機,目的主機回復一個reply報文,源主機就知道,到達目的地了。等等這好像跟書上寫的不一樣啊,書上說,到目的地的時候目的主機發現源主機訪問的是一個數值很大的UDP埠,所以回復一個目的埠不可達報文,這樣源主機就知道到達目的地了。
Windows上發出的是ICMP請求報文,最後一條收到回復報文,你覺得這樣做可不可以,為什麼?你可以抓一下Linux主機的tracert程序看看這個程序的報文又是什麼樣的?
你有沒有注意到上面的圖中有的請求報文既沒有收到超時報文,也沒有收到回復報文,你知道為什麼嗎? 接下來我們解開一個請求包看一看都有些什麼?
你看它的ICMP內容type欄位是8,code欄位是0,然後你可以翻一翻前面介紹ICMP的那一章看一看,是不是這樣
上面的圖中,你知道它的校驗和是怎麼計算的嗎?
你再看標識欄位和序列號,為什麼分為LE和BE?
然後我們看看回復的超時報文:
它的type和code欄位和上面相比有什麼不同?
為什麼ICMP差錯報文里還有一個ICMP報文?書上有寫嗎?
進一步,ICMP要過有埠轉換的NAT怎麼辦?
每一章都這樣來,肯定能學紮實了,我最近也在這樣做。一起加油!
你指尖輕舞,承載你意志的比特流以光速呼嘯而出,瞬間到達世界各個角落,再也沒有比這更美好的時代了。
拋磚引玉,希望大家多多指教
TCP/IP講的就是你訪問一個網站,收發郵件,從FTP伺服器下載上傳文件,QQ聊天是怎麼通過計算機和電信網路實現的。
在TCP/IP模型中,HTTP,SMTP,FTP和QQ內部協議都是應用層協議。
底下是TCP/IP協議
再底下是各種鏈路層(比如乙太網)和物理層協議(比如雙絞線)和設備。
TCP/IP協議對下可以跑在各種鏈路層協議上,對上支持各種各樣的應用層協議,實現計算機和程序間的通信。
TCP/IP本身又分層兩層:網路層,IP協議,和傳輸層,TCP協議(先忽略UDP)。
先說IP協議,要通信首先有地址吧,無論是郵政通信地址,手機號,還是電子郵箱,都是地址。要在成千上萬,上億的設備中通信,首先要有IP地址,有了IP地址,怎麼將一個IP地址的信息發送給另外的IP地址呢?首先一個問題是將IP地址翻譯成鏈路層的地址。其次,IP地址直接可能不是直接連通的,所以要通過一系列中間設備,通過這些設備轉發,要找出來哪些通過中間設備能夠到達目的IP地址,一路轉發過去,這個過程叫路由。然後還要將IP消息放到鏈路層的消息里才能發送,在鏈路層消息里要標明源IP地址和目標IP地址。最後還要有一些網路健康與否的檢查,和錯誤處理。
由於鏈路層消息大小的限制,IP消息大小是有限制的,而且IP消息是不可靠的,如果要可靠地傳遞大的消息,就需要傳輸層協議TCP。
一個計算機一個IP地址,可是如果想同時下載文件和QQ聊天怎麼辦呢,因此引入的埠的概念,一個IP地址可以有許很多個埠,TCP層的地址就變成IP地址+埠。
由於需要保證可靠,所以需要接收方給發送方發確認消息,如果超過一段時間發送方沒有接收到確認消息,就會重新發送,為了避免一下發送太多,都得重發,於是需要進行流控。當然,確認消息也可能丟失,那麼接收方就得處理重複的消息。由於不同的IP消息可能走不同的路徑,由於時延不同,可能後面的消息比前面的消息先到了。接收方還要等收到前面的消息後再交給接收程序。
所以,TCP就引入了連接的概念,連接保持通信的狀態。於是就要在開始通訊時建立連接,在通信完成後關閉連接。
TCP還引入了一些其他機制如擁塞控制等。
《TCP/IP詳解》這本書就是詳細講述IP和TCP的通信機制,以及一些演算法。當然要理解裡面的細節需要做實驗,然後通過抓包工具tcpdump將IP消息和TCP消息以及交互扒出來給你看。沒有總體描述,看局部細節就容易迷失
答主看不懂的原因很可能是因為缺乏基礎
雖然TCPIP頭兩卷有一些相關的基礎描述吧
換句話說,雖然很多概念你知道了,到你並不知道他們運用於什麼地方。所以不知道這些功能是如何生效的。如同一盒拼圖,你知道它們能拼成畫,但不知道怎麼拼
而怎麼拼是這類技術的一種學習範式。一般來說是先了解功能預期達成的目的,再了解基本邏輯原理,最後串起實現細節。專業點說是自頂至下的方式。不論是功能設計還是學習
和另一個答案一樣 強烈推薦抓包。
曾經在華為的時候,新員工試用期會有一個安排學習方向,然後組內該員工做講師進行收穫培訓。一個研究生新員工方式就被安排學習網路協議
收穫培訓時,兩個一看就是大牛的老員工坐在台下提細節問題,新員工用資料上的書面理解回答。
於是老員工就開始如復讀機般發問——你抓過包嗎?
新員工顯然沒有細節實踐,只能做出概念回答。老員工則連續問出只要抓過包就能明顯觀察到很有意思的細節實現,如rst和fin的區別,push什麼時候使用,會話保持時間和退出機制由哪方決定,異常處理等。
培訓後該新員工一臉被怒草過的表情。過了一個禮拜這貨多了個外號叫抓包小王子.....簡稱包子
(1)什麼是協議?
協議就是兩個或多個對象之間為了某個或多個需求而設置的約定,即在什麼時間,遇到什麼情況該做什麼。
舉例:
小強和小明約定周末一起去玩小霸王遊戲機,但是如果遇上停電就去掏鳥窩。
(2)什麼是TCP/IP協議?
TCP/IP協議就是為了滿足世界上成千上萬的網路設備的各種通信需求而設計的一套約定。
舉例:
你要從某網站下載一部電影,如何實現呢?首先網站伺服器和你的電腦互相識別,需要IP協議;為了跨越幾千公里的互聯網找到一條通往你電腦的路徑,需要路由協議;為了片子數據傳輸不丟失亂序重複,需要TCP協議;另外你可以用FTP協議接收電影。
單個協議就是單個約定,以TCP為例,約定了通信時超時怎麼辦?數據丟失怎麼辦?亂序怎麼辦?網路擁塞了怎麼辦?等等。
(3)TCP/IP為什麼這麼多協議?
不是協議多,而是需求多,每個協議都是從具體的實際需求中產生的。需求多了,問題就多,為了解決一個個的問題,而出現了一個個的協議。
舉例:
支付頁面一般是https,因為安全需求;組播協議出現是因為網路點播需求;IP over AOS出現是因為宇航員方便上網的需求等等。
(4)TCP/IP協議為什麼分層?
「分層」的思想可以應用到很多領域,它是複雜問題簡單化的有效方法。協議分層好處: 協議只需關注本層問題,直接利用下層提供的服務,同時向上層提供服務,並且每層的更改不會影響其他層。
舉例:
經典五層模型:物理層-&>鏈路層-&>網路層-&>傳輸層-&>應用層
(5)TCP/IP協議如何入門?
要點1:
謹記「網路協議因需求而產生,以解決實際問題為目的」,因此學習某個協議一定要了解它的應用場景和提出目的。
要點2:
選一本好的入門教程。本人極力推薦謝希仁教授的《計算機網路》,本書概念清晰,思路明確,既不膚淺又不是很深入且面面俱到,現在已經出到第六版,本書閱讀不得低於3遍。
要點3:
針對某個協議,深入理解其報文格式是學習的關鍵。協議程序化後就是「數據結構+演算法」,報文格式就是「數據結構」。
要點4:
一定要動手實驗,這可以加深對協議理解。比如可以用網路抓包(如wireshark)學習某個協議的演算法,如ARP的發現過程,TCP的握手協議,TFTP的文件傳輸原理。還可以網路編程,如簡單的網路攻擊軟體製作等。
這本書可以說是數通工程師的基本手冊,畢竟現在的互聯網就是個tcp ip的互聯網。
可是這本書並不簡單,它詳細介紹了tcp ip協議簇的原理與實現,不僅包括對協議的認識(報文格式,交互邏輯),還包括編程。
如果你打算以後成為一名網路工程師,這本書能為你提供深入到編程層面的計算機網路思想,雖然你以後可能不會再用到這本書里的知識,這種思想會始終給你幫助。
先學會wireshark,然後看tcp/ip就容易多了
要徹底的理解和運用TCP/IP,首先必須學習並掌握計算機科學的所有基礎課程:
(最好按這個順序,多數學校差不多都是這個順序)
高數,線代,物理
電路原理
數字電路
信號系統
計算機原理
編譯原理
操作系統
數據結構
C/C++語言
單片機開發
如果這些課程還沒有學完就不要著急卻學TCP/IP,安心上課,因為這些知識是必須掌握的,沒有近道可抄。當這些課程都學精通了,理解諸如TCP/IP之類的技術就是非常自然的事情。如果在學習TCP/IP的時候出現樓主描述的「感覺自己讀起來十分吃力」的現象,說明以上課程沒有全部學好,或者,智力確實太低不適合這門技術的學習,但通常這是不可能的,因為我想至少99.9%的人的智力都是夠學TCP/IP的。
有了上面的基礎,這裡講一種個人認為最佳的學習方法:
和所有計算機相關的技術一樣,TCP/IP是一項工程技術,任何一種工程技術,都是人為創造出來。理解它的最好方法就是先來回答:為什麼要出現TCP/IP這個東西?是什麼需求驅動了這個技術的出現?所以,我們不必急著去學TCP/IP具體細節,只需要搞清楚一個事實,那就是:TCP/IP是用來解決計算機之間相互傳輸數據的一套方法。
這個時候,我們先不妨想一下,如果現在有兩台計算機,我們如何設計一些硬體和軟體讓這兩台計算機實現通信,就用單片機,每個單片機都有一些空閑的埠供我們使用。
嘗試進行以下思想實驗:
(注意只需要思想實驗,不要真的去實現,那是不可能的)
(值得花費數月甚至更長的時間去不斷去想去改進這些問題的答案,磨刀不誤砍柴工)
(這裡只列出非常少的一部分問題,拋磚引玉,等你解決了這些問題就會自然的衍生出大一個數量級的問題來,再去一一思考,如此循環)
先考慮兩個單片機:
如何實現物理連接?
串列還是並行?
要用幾根線?
設計什麼樣的通信時序?
能達到多大的比特率?
都有哪些辦法能夠提高比特率?
數據怎麼分頁,怎麼索引?一次把所有數據都傳完是不是合理?行的通嗎?
可能需要設計那些命令?比如發起連接、關閉連接、發數據等等。
如何把這些基礎的操作封裝成一個庫?而不用次次從頭寫代碼。
如何檢測數據傳輸過程中是否發生錯誤?
要是數據傳輸過程中發生錯誤怎麼辦?
一方故意拔線、掉電、死機,另一方怎麼辦?
要是每個單片機上需要分時運行多個需要通信的程序怎麼辦?
然後需要通信的單片機多起來了,物理位置也不是原來的放在一張桌子上了,會跨越非常大的距離:
如何把多個單片機連在一起?是要用一個匯流排串起來嗎?還是要設計一個新的硬體把這些單片機都連接到這個新的硬體上?
如何標識每一個單片機?
如何實現任意兩個單片機間的通信?
如果有10個單片機怎麼辦?100個呢?1000個呢?一萬個、百萬個、上億個呢?
任意一個單片機都會分時復用和任意多個單片機通信,怎麼辦?
通信距離有1m,有100m,有1km,有100km,有10000km,怎麼辦?延遲如何處理?是不是要非同步傳輸了?
有成千上萬個單片機了,要怎麼組織這些單片機的連接了?任意兩個直接互聯是不是明顯不可能了?要不要中繼?中繼設備怎麼設計?
兩個單片機間的數據是不是要加密?是不是要防篡改?是不是能確定目標單片機就是目標單片機而不是偽裝的呢?
數據傳輸速率太高了,是不是要另外弄個單片機作為原單片機的協處理器專門來負責傳輸數據呢?怎麼實現?
是不是出現了不同層級和不同功能的中繼,即各種轉發數據專用的單片機?這些單片機分別應該實現哪些功能呢?
如何才能實現整個網路高速穩定運行?數據是不是會在中繼上發生阻塞?
兩個單片機間通信要經過數個、數十個、數百個中繼了,任意一個中繼上、任意線路上都可能發生各種不可預知的錯誤,怎麼辦?
是不是不能只用電線了?要用光纖了?要用無線電波了?
由這幾十個問題不斷思考能衍生出成千上萬的問題。
等我們把這些問題都思考一遍後,想像一些自己能給出的方案。然後,再打開TCP/IP相關的書籍,我們就會知道:通過數十萬從業人員幾十年的努力,現實中是用什麼方法解決這些問題的。一、協議的定義
協議的法律解釋:協議是指兩個或兩個以上實體為了進行某項活動,經過協商後雙方達成的一致意見。
協議的關鍵在於協商,整個活動或過程的進行需要依賴制定協議的雙方或多方的支持與配合。因此,對於TCP/IP協議而言,其目的是為主機群提供互相通信的網路服務。
在計算機網路中,通信發生在不同系統的實體之間。實體就是任何能夠發送和接收信息的東西。但是,兩個實體並不能簡單地將數據流發送給對方,同時還希望對方能夠理解該數據流。因此,這種所謂的理解就需要雙方進行協商,即達成協議。協議就是一組控制數據通信的規則。協議定義要傳送什麼,怎樣進行通信,以及何時進行通信。
協議的三個關鍵要素是:
- 語法:語法就是數據的結構或格式,也就是指數據呈現的順序。例如,簡單的協議可以規定數據的前8位是發送端的地址,第二個8位是接收端的地址,而剩下的位流則是報文自身。
- 語義:語義是每一部分數據流比特位的意思。一個特殊的位模式應該怎樣解釋?基於這樣的解釋又該採取什麼行動?等等。
- 同步:同步有兩個特點:數據在何時應當發送出去以及數據應當以怎樣的速率進行發送。
二、網際網路的管理機構
網際網路協議十分龐大,因此,需要設置專門的組織機構進行管理。其組織方式如下圖所示:
網際網路協會(ISOC):網際網路協會(ISOC)通過維持和支持其他的一些網際網路管理機構如IAB、IETF、IRTF以及ICANN來提供對網際網路標準化過程的支持。
網際網路體系結構研究委員會(IAB):網際網路體系結構研究委員會(IAB)是ISOC的技術顧問,主要任務是監督TCP/IP協議族的持續發展,以及用技術諮詢能力向網際網路界的研究人員提供服務。
網際網路工程部(IETF):網際網路工程部(IETF)是工作組的論壇,其負責找出TCP/IP協議族運行中的問題,並對這些問題提出解決的方法。同時,IETF還開發並評審打算成為網際網路標準的一些規約。這些工作組目前被劃分為九個領域。
網際網路研究部(IRTF):網際網路研究部(IRTF)是研究組的論壇,工作集中於有關網際網路協議、應用、體系結構和技術的長期研究題目上。
網際網路名字與號碼指派公司(ICANN):網際網路名字與號碼指派公司(ICANN)主要負責網際網路域名和地址的管理。
網路信息中心(NIC):網路信息中心(NIC)主要負責收集和分發關於TCP/IP協議族的信息。
三、TCP/IP協議族
在具體討論TCP/IP協議族之前,我們先簡單討論一下OSI模型。
OSI模型的目的是為了使兩個不同的系統能夠容易地通信,而不需要改變底層的硬體或軟體的邏輯。OSI模型並不是協議,它是一個靈活的、穩健的、可互操作的模型,用來了解和設計網路體系結構。
OSI模型中的層次:1、物理層:物理層協調在物理媒體中傳送比特流所需的各種功能。物理層涉及到介面和傳輸媒體的機械和電氣的規約。它還定義了這些物理設備和介面為所發生的傳輸所必須完成的過程和功能。
物理層負責把逐個比特從一跳(結點)移動到另一跳(結點)。
2、數據鏈路層:數據鏈路層把物理層(即原始的傳輸設施)轉換為可靠的鏈路。它是物理層對上層看起來好像是不產生差錯的。
鏈路層負責把幀從一跳(結點)移動到另一跳(結點)。
3、網路層:網路層負責把分組從源點交付到終點,這可能要跨越多個網路(鏈路)。數據鏈路層監督在同一個網路上兩個系統之間分組的交付,而網路層則確保每一個分組能夠從它的源點到達終點。
網路層負責把逐個分組從源主機交付到目的主機。
4、傳輸層:傳輸層負責把完整的報文進行源點到終點(端到端)的交付。
5、會話層:會話層是網路的對話控制器,它建立、維持通信系統之間的交換,並使這些通信系統同步。會話層負責對話的控制和同步。
6、表示層:表示層考慮的是兩個系統所交換的信息的語法和語義。
表示層負責轉換、壓縮和加密。
7、應用層:應用層使用戶接入到網路。應用層給用戶提供了介面,也提供了對許多種服務的支持。
了解了OSI模型,現在我們著眼於TCP/IP協議族。
TCP/IP協議族在OSI模型之前就已經開發了,因此,TCP/IP協議族的層次無法準確地和OSI模型對應起來。
TCP/IP協議族由5層組成:物理層、數據鏈路層、網路層、運輸層和應用層。
TCP/IP是由一些交互性的模塊組成的分層次的協議,其中的每個模塊提供特定的功能。
在物理層和數據鏈路層,TCP/IP並沒有定義任何特定的協議。它支持所有標準的和專用的協議。在TCP/IP互聯網中的網路可以是區域網、城域網或廣域網。
在網路層,TCP/IP支持網路互連協議(IP)。IP協議與四個支撐協議相互配合完成網路層的核心功能,另外四個支撐一些分別是ARP、RARP、ICMP和IGMP。
在傳輸層,TCP/IP定義了三個協議:傳輸控制協議(TCP)、用戶數據報協議(UDP)以及流控制協議(SCTP)。它們負責將報文從一個進程交付到另一個進程。
在應用層,TCP/IP的應用層相當於OSI模型中合併起來的會話層、表示層和應用層。常見的應用層協議包括FTP、HTTP、SMTP協議等。
四、TCP/IP剖析
到這一步,我們知道了整個TCP/IP的模型是怎樣的。但是,這只是TCP/IP入門的起點。在本節,我將根據自己的理解,對整個TCP/IP體系進行簡單的剖析。
整體的內容組織如下:
1、TCP/IP的關注點是什麼
2、TCP/IP的核心是什麼
3、一大波協議正在逼近
4、來看一個例子
5、從TCP/IP延伸開去
下面,我們就按照上述進行詳細地分述:
Part 1:TCP/IP的關注點是什麼
對於網路協議,我們需要特別注意的一個點在於「協商」。網路實體需要進行通信,需要互相交換彼此的信息,做出彼此認可和嚴格遵守的規定。然後,網路實體遵循這些規定來相互配合完成通信行為。
這裡有一點需要明確,那就是怎樣定義網路實體。網路實體本身是一種抽象的概念,可以是低層次上的所謂電路元件,也可以是更高層次上的所謂自然人用戶,任何具有通信需求的事物都可以是網路實體。高層次的網路實體彼此的協議交互與低層次的網路實體彼此的協議交互是不同的,同時高層次的網路實體的協議交互需要依賴於低層次網路實體的協議功能的支持和配合。
舉個例子,兩個人的握手過程,握手過程實質是一種通信行為。對於最高層的自然人而言,握手是表示友好的象徵,因此,約定俗成下,兩個人在正式場合的會面都是以友好的握手為開始和結束的,這是通過社交行為準則約束的協議。但是,對於握手的這個生理行為,其需要依賴於底層生理機能作為支撐。例如,伸出手的過程,需要依賴於眼睛的距離定位,同時,握手時手掌必須保持與地面垂直,握手雙方需要作出同樣的姿勢,不能出現一方握緊拳頭的握手行為,否則這將是一次失敗的握手行為。可見,一次簡單的握手動作需要依賴於握手社交禮儀的約束協議以及更細節更底層的協議支持,包括生理性協議和心理性協議。
對於計算機網路實體與計算機網路實體之間的通信行為,也就是計算機通信網路,它們的通信行為同樣需要建立一套完整的協議體系。這套協議體系遠沒有自然生活中某些協議複雜,事實上,計算機網路的協議體系很大程度上借鑒了自然生活中的許多協議的設計思想和方法。
而對於計算機網路協議體系而言,目前最成熟也是最流行的技術協議體系就是TCP/IP協議族。在高帶寬、低時延、低誤碼率的底層的物理層和數據鏈路層技術的支撐下,同時,在多種高效的管理控制協議的配合下,整個計算機網路的通信的速率、質量以及可控性日趨提升。
因此,統歸而言,TCP/IP協議體系關注的是計算機網路中每個計算機網路實體中位於不同層次的功能模塊需要根據怎樣的規定進行處理,以實現通信功能的多樣性和通信質量的更優化。
也許,這句話有點晦澀,我們簡單舉個例子。我認為這也是計算機網路技術設計中借鑒最多的實際生活場景,那就是郵政系統。
首先,我們看一下具體的場景:
信息I:姓名:張三
住址:四川省,成都市,高新區,天府大道2016號
信息II:
姓名:王五
住址:廣東省,廣州市,天河區,黃埔大道2012號
現在,張三想給王二寫一封信,內容是:
成都房價大漲,速回炒房。
那麼,現在,我們就通貫地將整個寄信過程進行講解(部分流程可能存在錯誤,請及時指正):
1、張三在信紙上用簽字筆寫下「成都房價大漲,速回炒房」的內容。
2、張三將信紙裝入信封,用固體膠封口,並書寫信封封皮的內容。
3、張三將信件投遞到附近郵局設置的公共投遞郵箱里。
4、區級郵局郵遞員從公共投遞郵箱里取出所有郵件,然後統一交由當地區級郵局。
5、當地區級郵局分類郵件,將發往本區的郵件交由郵遞員依次投遞,同時,發往其他地方的郵件打包發往市級郵局。
6、市級郵局收集所有郵件,將發往本市的郵件按分區發往不同的區級郵局,同時,發往其他市的郵件打包發往省級郵局。
7、省級郵局收集所有郵件,將發往本省的郵件按市發往不同的市級郵局,同時,發往其他省的郵件打包發往其他省級郵局。
8、按照此過程,經過多次處理,信件由郵遞員投遞到對方王五的家庭信箱中。王五檢查家庭信箱,即可收到信件。
那麼,這裡的問題就來了,郵局是怎麼知道郵件是發往哪裡的呢?這是信件投遞的關鍵點。上述的敘述中,有一個地方我們描述得很含糊——「書寫信封封皮的內容」,那麼,信封封皮的內容是什麼呢?有什麼書寫規則嗎?
信封封皮內容如下:郵編:510000
收件人:王五
發往:廣東省 廣州市 天河區 黃埔大道2012號寄件人:張三
寄自:四川省 成都市 高新區 天府大道2016號
因此,有了這些信息的協助,我們就能明白郵局是怎麼處理郵件的了。具體細節就不再贅述了,相信讀者能夠很明白地想清楚郵局的是怎麼分類郵件的了。
但是,這裡有一些問題,我們覺得可以進行深入挖掘,同時,我們也可以將其中的某些部分與計算機網路中的某些功能對應起來。這樣,我們就能更好地理解計算機網路。
1、為什麼設置家庭信箱和公共投遞信箱?
首先,家庭信箱是什麼?信箱在美國是非常重要的,獨立屋前面都有一個美國郵政的信箱,除了快遞是送到家門口,其它的信件,商家廣告都是發到信箱里。信箱沒有一個統一的標準,有些家庭把家門前的信箱還稍微裝飾一番,變得漂亮或者與眾不同。
那麼,什麼又是公共投遞郵箱?
公共投遞郵箱是郵箱的一種,常見於街道上,是用來收集外寄信件的郵政設施,寄信人若果不便去郵政局,可以把信件投入到就近的郵箱,郵遞員會定時來郵筒收集信件,回郵局,再分類、運輸及派送。 郵箱是郵政局的固定資產,它是便民設施。
那麼,為什麼要設置兩種不同的郵箱呢?
如果單獨用家庭郵箱同時放置待發送和待接收的信件,這是極為混亂的。雖然可以根據收件人判定是否是待發送的信件,但是,這樣做的效率極低,同時在人力場景下,出錯的可能性極大。
因此,可以嘗試將家庭信箱左右隔開,一邊用於放置待發送的信件,另一邊用於放置待接收的信件。這樣,就不存在判定某信件是否是待發送信件還是待接收信件的問題了。
貌似這是一種極好的方案了。那麼問題來了,為什麼實際生活中還要單獨設置公共投遞郵箱呢?原因同樣在於人力成本,因為郵遞員如果是將寄件送往收信人住處,只需按目標去往即可;但是,如果郵遞員需要去攬件,就必須要挨家挨戶地查看家庭信箱中是否有信件。整個過程漫長而耗時,因此,設置公共投遞郵箱是一種折中的方式。
現在,我們考慮在進行網路傳輸時,如何將家庭信箱和公共投遞郵箱映射到計算機網路中。
按類比的方法,我們考慮一個聊天應用,網路主機上的聊天應用即是郵政系統中的寄件人,正如寄件人接入郵政系統是通過帶郵戳的信封、公共投遞郵箱和家庭信箱一樣,網路主機上的聊天應用接入網路的方式是通過位於主機操作系統中的協議棧和網路適配器實現的。
但是,對於計算機網路來說,設置公共的發送緩存是一種耗費資源的事情,因為主機通過物理連接直連到公共發送緩存的代價極高。因此,在計算機網路實現中,可以參照家庭信箱的機制即可實現收發過程,即如我們前面所述,將家庭信箱左右隔開,分別用於放置待接收信件和待發送信件,這從理論上來說是可行的。
故而,在網路主機的網卡處,分別設置接收緩衝區和發送緩衝區,這種做法就如同將家庭信箱隔為待接收信件區和待發送信件區一樣。
現在,又有問題了,寫信寫太多,信箱容量又太小,放不下怎麼辦?或者,收到的信件太多,接收信箱容量小,同樣放不下,這又該怎麼辦?
對應到計算機網路中,這就是數據包產生快,發送緩衝區小,導致溢出怎麼辦?或者,接收的數據包多,但是接收緩衝區小,導致溢出又怎麼辦?
也許在現實中,這種郵箱容量小,信件放不了的情況比較少見,同時,基於投訴體制,郵政系統的反應能夠較快的解決這個問題。但是,在計算機網路中,這種情況的發生就是常有的了,因此,有必要對這種情況進行理論分析和演算法解決。這就是屬於擁塞控制方面的內容了。但是,在解決這些問題之前,我們還是先將目光聚焦於郵政系統中的某些關鍵點之上。
2、郵遞員有什麼性質?
在郵政系統中,郵遞員扮演的角色其實很簡單,即將信件從一個地方送往另一個地方。他們其實相當於信息的搬運工,只不過他們並不知道自己所搬運的信息是什麼。通常,一個郵遞員負責管理一個片區的信件攬收和分發工作。
其實,從本質上來說,將郵遞員類比到計算機網路中,是一個非常複雜的問題。因為,郵遞員本身具有思想,其本身的很多行為都融入了計算機網路中的核心思想,比如最短路尋路演算法、旅行商問題等等。
為了簡化問題,在此處,初開始,我片面地將郵遞員類比為網路數據傳輸信道(光纖、銅纜、無線信號等)。他們僅僅只有著傳輸數據的工作,依照指令將數據從一端傳到另一端。也就是說,郵遞員相當於郵政系統的物理層。但是,此處有一個謬誤的地方:郵遞員通常不會僅僅對應於一對一鏈路,而是許多鏈路的集合,從某種程度上其更符合乙太網交換機的特性。
因此,從郵遞員實際的工作,即從郵局接收到自己負責片區(比如一條街道上的所有家庭)的所有郵件,然後分發到不同的家庭去來看,郵遞員更像是管理一個區域網的交換機。而對於郵遞員來說,其行走的雙腿,其騎行的自行車,其駕駛的小貨車,才是真正的網路數據傳輸信道(光纖、銅纜、無線信號等)。這些能夠將數據從一個地方傳送到另一個地方的交通媒介(介質),才是郵政系統的物理層。
而對於郵遞員,其需要維護一張核心表(也許在他們的小筆記本上,也許在他們的記憶池中),這張表對應著一些關鍵信息,包括某某家的門牌號是多少,電話是多少,一般什麼時候在家等等(新來的郵遞員的小本本上可能什麼都沒有)。在交換機中,其處理就要簡單一些,其僅僅只需知道發往某某主機的數據包需要從哪個埠發出即可,同時,輔以超時機制,即可實現信息的及時更新。
同時,這裡也會有一些問題,假如某個人的住址沒有寫清楚,只知道是住這條街的,但是不知道具體的門牌號,而且小冊子上也沒有記錄,這時,僅知道某人的姓名,應該怎樣找到這個人住在那裡呢?
對應到實際網路中,該問題就是只知道目的主機的IP地址或者主機名,怎麼找到對應的物理地址MAC呢?這就是ARP需要解決的問題。
但是,這裡有一點需要說明的是,現實中的很多問題的解決方式與計算機網路中的解決方式存在差異,不能完全生搬硬套,需要明確各自的優勢與短處,揚長避短,充分發掘內部的計算處理靈活性。
3、收件人檢查家庭信箱的方式?
在進一步講解郵局的功能之前,我們還有一個很有意思的問題可以談談。這其實不是完全與計算機網路相契合的場景解釋,但是,我覺得分析和討論一下這個問題還是比較有意思的。
通常情況下是,收件人有兩種方式可以去獲取別人發送給自己的信件,一種是主動的,一種是被動的。
首先,我們來看看主動的方式。在主動環境下,收件人通過定期檢查信箱是否有信件來確認是否應該執行收信操作,在這裡,收信人可以控制檢查信箱的頻率和間隔周期。但是,相應的,收件人需要付出一定的代價,如果檢查的頻率比較高,收件人就需要付出更多的時間用於處理信箱檢查的工作。
現在,我們再看看被動的處理方式。在被動環境下,收件人並不會去檢查信箱是否有信件,而是受外界的指令來執行收信操作。對於這個指令,一般是郵遞員將信件放入家庭信箱時,就扯著嗓子同時猛敲門地吼,「王五,有你的信,快tm去取」。這個時候,收件人就必須去處理這件事,他檢查信箱,然後將裡面所有的收信都取出來。這樣的做法好不好呢,當然,這種做法符合人之常情。但是,也不能說主動方式就不好。
下面,我們將前面講的這個過程類比到計算機網路中來看看。根據收件人處理家庭信箱的方法,我們可以類比,當網卡接收到數據時,計算機操作系統中的內核網路協議棧會如何處理網卡上接收的數據。首先,內核網路協議棧可以定期去檢查網卡接收緩衝區中是否有數據包,如果有,則處理數據包,如果沒有,則返回繼續執行原有操作。這個過程在計算機科學中稱之為輪詢。另外,內核網路協議棧也可以像郵遞員那種,通過外部事件來觸發動作,這個外部事件就是中斷。相應的處理方式我們稱之為非同步中斷處理。
現在,我們站在計算機中網路協議棧的角度和高度上來比較一下這兩種方式的優劣性。
當數據包到達網路設備時,通常會觸發硬體中斷。系統在不支持軟中斷時,數據包的輸入過程只能完全在硬體中斷中處理。在這種情況下,雖然可以完成數據包的輸入,但硬體中斷處理所佔用的CPU資源過多,導致系統對其他硬體響應不夠及時。
在某些情況(嵌入式設備)下,數據包到達網路設備時,並不會觸發硬體中斷。在這種情況下,只能通過定時器輪詢網路設備的狀態,當發現有數據包到達時,才從網路設備中讀取數據包並輸入到協議棧。這種情況下,數據包的輸入及時完全需要依靠定時器觸發的頻率,如果頻率過高,可能會過多地消耗CPU資源,而頻率過低時,數據包的吞吐量便過分低下。
因此,可以看出,輪詢在數據吞吐量較高的情況下,更加節省資源;而在數據吞吐量較低的情況下,使用硬體中斷的非同步方式更加推薦。
但是,現有的計算機中,還有一種方法能極大地提高網路處理速度,條件是需要支持硬體中斷和軟中斷(至於什麼是軟中斷,後續有時間會進行解釋)。這種方法相當於中斷機制與輪詢機制的混合體,我們稱之為NAPI方式。NAPI方式能夠有效地提高網路處理速度。在網路負載較重時,NAPI技術能顯著地減少由於接收到數據包而產生的硬中斷數量,對高速率、短長度的數據包的處理非常有效。
NAPI的實現方法是:當一批數據包中的第一個數據包到達網路設備時,會議硬中斷的方式通知系統;在硬中斷常式中,系統將該設備添加到CPU的設備輪詢隊列中,並關閉中斷,同時激活數據包輸入軟中斷;由軟中斷常式遍歷輪詢隊列中的網路設備,從中讀取數據包。這樣,在內核從網路設備中接收報文的過程中,若有新的報文到來,NAPI也無需再執行中斷常式,而只需維護網路設備輪詢隊列,就能讀取到新的報文。當全部設備讀取完成後,再打開中斷。
本段內容結合《Linux內核源碼剖析——TCP/IP實現》內容進行整理和描述。
4、郵局做了什麼工作?
終於講到郵局了,對於郵局的設置結構,存在著一種很獨特的現象,我們也許可以從其中挖掘點什麼東西。那麼,這是個什麼現象呢?那就是整個郵政系統的郵局是分級的,從最小的區級郵局,在往上是市級郵局,省級郵局,也許還有國家級郵局。那麼,為什麼要分級呢?
要回答這個問題,其實我們要從網路本身來考慮。網路如同圖論中的拓撲圖,是由一系列節點和鏈路組合而成的。當這個圖的節點和鏈路數目增加時,這個圖也就越複雜。一個圖越複雜,其管理和控制就越難。因此,聰明的網路工程師根據傳統人類社會的等級制度,也提出了網路環境中的分級管理方式。
談到分級,我們不能單純地將隨便一個圖來進行分級,而是需要進行精心設計的圖。從分級結構來看,其從上到下是一棵多叉樹;從每一級來看,其是一個隨機拓撲圖。
下圖是現代電信網路中的分級拓撲結構圖:
現在,我們來關注一下分級拓撲的好處。
首先,易管理性,通過上級統一節點出入口,可以很方便的控制被管理網路的出入口流量轉發。另外,通過追責管理方式,可以很快地定位網路故障與網路攻擊。其次,靈活性。通過分級拓撲,可以簡化網路拓撲的複雜度,在網路配置的靈活性方面有著較大的提高。
當然,分級拓撲的壞處也很明顯,那就是核心節點的失效會導致整個網路的網路通信故障,這樣所造成的後果會十分嚴重。這些核心節點的維護工作通常是由網路運營商負責的,經常通過冗餘備份和災備系統來完成系統的可靠性和穩定性支持。
啊,扯得有點遠了,我們還是回到郵局的問題上來。前面胡扯了這麼多,其實想說明的就是,郵局其實就是這些多級網路中的各個關鍵節點。類比而言,區級郵局通常是接入層的各個關鍵節點,它們連接著各自所管理的接入網。而市級郵局通常表示匯聚層的各個關鍵節點,這些關鍵節點通常一對多連接著接入層的多個關鍵節點。對於省級郵局,其則對應於核心層的關鍵節點,這些郵局數目較少,但是吞吐量和體量極大,是整個郵政系統工作的核心子網。
事實上,對應於實際網路,郵局相當於路由器。不同級別的郵局相當於不同吞吐量和功能集的路由器,比如,核心網的省級郵局相當於電信網路中的核心路由器,這些路由器通常有著上TB/s的吞吐量,能夠支持海量的數據傳輸需求。
那麼,郵局有什麼作用呢?百度百科上如是說。1、負責快遞等郵政業務的市場准入,維護信件寄遞業務專營權,依法監管郵政市場。
2、負責監督檢查機要通信工作,保障機要通信安全。
3、負責郵政行業安全生產監管,負責郵政行業運行安全的監測、預警和應急管理,保障郵政通信與信息安全。
4、負責郵政行業統計、經濟運行分析及信息服務,依法監督郵政行業服務質量。
5、垂直管理各省、自治區、直轄市郵政管理局。
上述關於郵局的百度百科內容太官方和政治了,看著有點驢唇不對馬嘴。同樣地,百度百科上對於路由器的功能描述如下:
1、連通不同的網路。從過濾網路流量的角度來看,路由器的作用與交換機和網橋非常相似。但是與工作在網路物理層,從物理上劃分網段的交換機不同,路由器使用專門的軟體協議從邏輯上對整個網路進行劃分。例如,一台支持IP協議的路由器可以把網路劃分成多個子網段,只有指向特殊IP地址的網路流量才可以通過路由器。對於每一個接收到的數據包,路由器都會重新計算其校驗值,並寫入新的物理地址。因此,使用路由器轉發和過濾數據的速度往往要比只查看數據包物理地址的交換機慢。但是,對於那些結構複雜的網路,使用路由器可以提高網路的整體效率。路由器的另外一個明顯優勢就是可以自動過濾網路廣播。總體上說,在網路中添加路由器的整個安裝過程要比即插即用的交換機複雜很多。
2、信息傳輸。有的路由器僅支持單一協議,但大部分路由器可以支持多種協議的傳輸,即多協議路由器。由於每一種協議都有自己的規則,要在一個路由器中完成多種協議的演算法,勢必會降低路由器的性能。路由器的主要工作就是為經過路由器的每個數據幀尋找一條最佳傳輸路徑,並將該數據有效地傳送到目的站點。由此可見,選擇最佳路徑的策略即路由演算法是路由器的關鍵所在。為了完成這項工作,在路由器中保存著各種傳輸路徑的相關數據——路徑表(Routing Table),供路由選擇時使用。路徑表中保存著子網的標誌信息、網上路由器的個數和下一個路由器的名字等內容。路徑表可以是由系統管理員固定設置好的。
暫時想不起來說啥了,後續再談。。。
5、為什麼需要郵編?
郵政編碼,是一個國家或地區為實現郵件分揀自動化和郵政網路數位化,加快郵件傳遞速度,而把全國劃分的編碼方式。郵遞區號制度已成為衡量一個國家通信技術和郵政服務水平的標準之一。
郵政編碼通常是用阿拉伯數字組成,代表投遞郵件的郵局的一種專用代號,也是這個局投遞範圍內的居民和單位通信的代號。郵政編碼是實現郵件機器分揀的郵政通信專用代號,是實現郵政現代化的必需工具,最終目的是使您的信件在傳遞過程中提高速度和準確性,因此在交寄信件、包裹時務必寫明郵政編碼。為了實現郵件分揀自動化和郵政網路數字化,加快郵件傳遞速度。
從前面的我們關於郵編的描述,我們知道,郵編的提出是為了實現郵件分揀自動化。自動化的實現通常需要依賴於一些規則,對於郵政編碼,其必須使用阿拉伯數字來表示,這就是對應的規則。另外,不同的阿拉伯數字對應不同的省市區,這通常通過一張全國郵政編碼一覽表即可實現快速查找。
對應到網路中,我們就不能不提及TCP/IP網路中的地址編碼規則了。
對於郵政編碼來說,全國的那些城市數目基本是固定的,不會增長或減少,同時它們的基數較小。但是,對於網路設備來說,其數目日益增多,且增長速度越來越快。如何對這些設備進行唯一描述,這是一個極為嚴峻的問題。
在TCP/IP模型中,目前最流行的編址方式是IPv4地址。其長度為32bit,能夠表示4294967296個地址。但是,隨著互聯網的飛速發展,目前網路設備的數目已經遠遠超過了IPv4地址的容量。為了解決IPv4地址容量受限的問題,網路工程師提出了新的編址方式IPv6,同時提出了如NAT等地址「變相擴容」技術。
對於IPv4的編址方式,常常分為分類的IP地址和無分類編址CIDR。具體細節可自行谷歌搜索。
小結一下,提出IPv4的目的在於對網路設備進行編址,以確定網路設備的唯一性及位置。關於NAT技術,其又分為SNAT和DNAT,其應用十分廣泛,通過使用NAT技術,還能完成一些除變相地址擴容之外的有趣特性,例如負載均衡實現等(大家可以參見LVS)。
6、業務高峰期時怎麼辦?
現在我們通過郵政系統來討論網路中的幾個比較有意思的研究問題。下面我們首先談談業務。
在郵政系統中,業務是怎樣的存在?業務通過什麼來描述呢?其實,很容易我們就可以想到,純粹從寄件服務上來說,業務就包括信件服務、包裹服務,同時,基於不同的服務等級,分為挂號信和平信。因此,如何考慮不同服務等級的業務承載與處理,這是一個可以研究的點。
另外,假設我們只考慮普通包裹的郵遞運輸,當在雙十一時,整個郵政系統的業務量異常龐大時,如何調節整個郵政系統才能保證這種高峰期下的服務質量。這也是一個可以研究的點。
推及到計算機網路,在郵政系統中的不同服務等級的業務承載及處理即對應於運營商網路的QoS支持,現在的比較成熟的方案有基於MPLS和RSVP的IntServ和基於數據包分類的DiffServ。
對於郵政系統中的業務高峰期,在計算機網路中,通常通過擁塞控制來實現整個網路的平穩過渡,這個機制與郵政系統的業務高峰期處理方法有所差異。主要差異就在於計算網路中可以通過丟包來實現速率的平滑過渡,但是,郵政系統卻不能通過丟包的方式來處理(因為每件物品都是唯一的,不能拷貝)。
關於DiffServ和IntServ以及擁塞控制,大家可以谷歌。如果有時間,在後續內容中也可能會提及一二。
7、如果保證安全性?
兩種思路:用戶加密與網路協議加密。——用戶加密(具有可控性),網路協議加密(SSH、Shadowsocks等)。
Part 2:TCP/IP的核心是什麼
下面,我們來探討一下TCP/IP的核心是什麼。我覺得,TCP/IP的核心就是網路協議棧的核心。網路協議棧的核心主要由以下幾條規則來表示:
- 實體
- 分組的封裝和解封裝
- 透明傳輸與對等實體
- 服務訪問點SAP
- 協議棧構建
下面,我們依次進行講解:
1、實體
某層中活動的元素稱為實體。
實體通常表現為某個協議的執行體,這些實體稱之為協議實體。實體也可能是協議棧中某些功能模塊,這些實體稱之為非協議實體。
例如:
以及
2、分組的封裝和解封裝原則
對協議實體而言:
數據單元DU從上而下時,協議將為DU增加首部形成協議數據單元PDU,此過程稱之為封裝。
數據單元DU從下而上時,該過程動作相反,稱之為解封裝。
對非協議實體而言:
不會出現分組的封裝動作。
3、透明傳輸與對等實體原則
對等實體的一些性質:
* 對等實體間的通信是直接通信(虛通信)
* 實體的對等關係不滿足傳遞律
* 對等實體是第一個收到原實體發出的分組
* 對等實體間的通信就是協議實體的交互
* 每個協議實體至少有一個對等實體
4、服務訪問點SAP
協議分類:
* Communication Protocol 通信協議:為上面的實體提供通信服務,提供對上SAP
* Transaction Protocol 事務協議:完成特定任務,不提供對上SAP
SAP模型:
通信協議一般會提供足夠多的SAP數量:
* 實體用SAP區分上面不同的實體
* 各個SAP提供的服務功能完全相同
* 上層實體按需綁定在某個SAP上
* 存在未綁定實體的SAP
另外,通信協議實體提供SAP是構建協議棧的基礎。實際上,協議棧全是利用SAP實現的,各層SAP向上的關係,形成了一棵樹。
同時,SAP使協議棧具備了靈活擴展能力,可以把某層的功能用多個協議來實現,每個協議相對簡單,提高效率,也可方便的為某層添加新功能。
5、協議棧構建原則
規則一:SAP固定分配(全局統一、局部統一、保留)
—— 與不同的下層實體對接時,有固定位置;簡化了協議棧的構建。
規則二:實體可動態使用任意SAP
—— 提供了應用實體動態使用SAP的方法,為應用實體提供了多重訪問的可能。
對於此,大家可以思考TCP連接分配埠的一些問題。
在這裡,留幾個小問題:
問題一:
問題二:
問題三:
在本部分,我們主要講述了協議棧設計上的一些核心點,這貌似與TCP/IP協議棧有一些出入。但是,我覺得萬變不離其宗,了解協議棧設計的方法,有助於我們更好地去了解TCP/IP協議的更多細節。
至於後面的三個問題,歡迎大家一起交流學習。
Part 3:一大波協議正在逼近
現在,我們來關注TCP/IP協議棧中的幾個核心協議。並不會深入講解,只是走馬觀花,拋磚引玉罷了。
這裡,我們我們主要講解以下幾個協議:UDP、TCP、DNS、ARP以及HTTP。
1、UDP
無連接傳輸協議
2、TCP
面向連接的傳輸協議
3、DNS
域名解析
4、ARP
地址解析
5、HTTP
超文本協議
Part 4:來看一個例子
跟著大部隊走,瀏覽器訪問網頁的流程分析。從應用層一路向下,從本地主機到遠端伺服器,再從遠端伺服器到本地主機,最後再沿協議棧回到瀏覽器。
Part 5:從TCP/IP延伸開去
1、SDNNFV技術
SDN、OpenFlow、P4
2、網路安全技術
SSL、HTTPS、SSH
3、雲計算技術
4、大數據技術
五、總結篇
在本文中,主要對TCP/IP的協議棧設計思想和具體內容進行了簡單的梳理,同時對未來的一些網路技術進行了簡單的展望。歡迎各位同道中人多多交流,互相進步。
不要想著來知乎問一下,看幾個回答就會茅塞頓開,入門不是那麼容易但是入門了就沒那麼複雜了,慢慢看吧,多來幾遍,結合實際網路應該不是那麼難懂。
說明你沒有學習計算機系統和計算機網路,硬啃tcp/ip當然不行。建議你先去看下前兩部分,在知乎提問並不能快速解決基礎不足的問題。
計算機指令,但是無論什麼介質都可以執行通信指令
TCP 和 IP 是兩個(組)不同的協議。正如有答主說的,TCP/IP協議詳解那本書是講的在Internet中網路層和傳輸層相關的協議。如果說得更詳細一點,就是IETF所制定的主要協議。
那麼它們是做什麼的呢?從網路的設計來看:
以IP為代表的網路層協議主要解決兩個問題:
- 地址。如何保證在網路中的每一個節點都至少有一個唯一可識別的地址。這就是我們通常見的IPv4和IPv6.
- 尋找路徑,也就是我們說的路由。由於每個節點不是直接連通的,而是要通過不同的節點轉發才能到達(就好像從中國從飛機到南美沒有直達,就得通過歐洲轉機)。為了找到一條最優路徑,需要路由協議,這就包括了OSPF,ISIS,BGP等一大批。
但是,網路層的協議是沒有服務質量的保證的,也就是說,你發一個數據包,網路層只能「儘力」送到(best effort原則),但並不保證:
- 一定能到達目地
- 能按時到達目地
- 能按順序到達目地
這樣,我們就需要以TCP為代表的傳輸層協議,來保證以上三點 -- 主要的方式就是通過一定的反饋及重傳機制。簡單地說,TCP保證在網路層協議不給力的情況下,端對端的傳輸性能。
網路層協議和傳輸層協議另外一個重大區別就是,網路層協議是必須在網路中所有節點都實現的。而傳輸層協議 只需要在發送和接收兩端實現就可以了。
大學老師給過一個精準的比喻
「泥愁啥?」
「瞅泥咋地!」
讀第一遍不行就讀第二遍 這個東西沒有幾個人是讀完一遍就都理解了的
如果你是新手不推薦直接看TCP/IP協議卷一,為什麼呢?因為新手要先知道互聯網幹了什麼,為什麼要分層,每層又幹了什麼。也就是需要有個整體概念。TCP/IP協議卷一,這本書要解決是什麼問題你要先搞清楚,如果你對TCP/IP幹了什麼都不知道的話,你又怎麼去了解它的詳細實現和整個協議簇呢?協議簇的每個協議都是為了解決某一個特定問題,而這些問題組合起來,就是互聯網路要解決的問題。
程序猿一枚,也曾度過《TCP/IP協議》。我的體會是如果你確實是要重寫最最底層的網路部分,那就要稍微詳細了解TCP/IP。如果只是想我一樣做做WEB,做做高並發,做做大數據,沒有必要那麼詳細的了解《TCP/IP協議》。
首先協議實在太太多了,最最常用的就有 http,ftp,udp等等亂七八糟的協議,你想看也看不過來。
其次,《TCP/IP協議》實在太底層了。你去買一個不粘鍋,實在沒有必要要了解塗層的物理構成吧。
最後,我覺得你只要抓住協議兩個字理解一下就好了。協議,不是什麼高大上的東西,其實就是個約定。比如我跟你說「你早」,你也跟我說「你早」,那就說名你是願意和我交流的;如果你說「滾」,那就說明不願意了。
兩台計算機之間要交流也是一樣的,必須事先做一些規定。這些規定就是所謂的協議。比如必須知道兩台計算機之間的地址才能交流吧,那麼IP協議就規定地址必須寫成 192.168.1.1 的樣式。要是當年由中國人發明的計算機網路,指不定現在的IP協議就規定地址必須寫成 xxx區xxx國xxx省xxx市xxx 的樣式呢。
TCP也是為了在網路中可能出現各種情況的前提下保證一定送達的一個協議。 比如快遞是必須保證一定送達的,可是實際中真的不是開一輛車送一下就能保證的。萬一車壞了怎麼辦?萬一路堵了怎麼辦?萬一出車禍了怎麼辦?萬一接收人不在家怎麼辦?萬一地址被磨掉了一部分怎麼辦?
其實你要是能考慮到網路上可能出現的所有情況,你也能寫一個TCP出來
https://aa4933.github.io/2016/07/29/Challenge/
tcp/ip協議------實戰教你如何破解今日頭條介面這並不是一本適合初學者的書
推薦閱讀:
※tcp中的mss是536?
※為什麼區域網要用mac地址而不直接使用IP地址,統一用IP地址不是更好嗎?
※高帶寬往低帶寬傳送數據的處理機制是怎樣的?
※測試TCP server的QPS的合適方法?
※為什麼traceroute通過外網到了一個內網地址?