-
1 # 庭博
-
2 # Geek視界
根據我所知道的回答一下這個問題。
要回答這個問題必須瞭解以下幾個概念:
網路分層模型
OSI七層參考模型
TCP/IP四層模型
網路協議
網路分層模型位於地球兩端的使用者透過網際網路實現通訊是一個非常複雜的過程。
解決一個複雜問題的最好方法就是分層,每一層解決一個問題,所有就有了網路的分層模型。每層解決一個通訊問題,同一層之間透過協議進行通訊,上下層之間透過服務訪問點相互通訊。
目前公認的網路分層模型有兩個:
OSI七層參考模型
TCP/IP四層模型
如下圖所示,源主機和目的主機之間的通訊過程:
OSI七層參考模型OSI參考模型分為七層,由下到上依次是:物理層、資料鏈路層、網路層、傳輸層、會話層、表示層、應用層。
物理層:傳輸0,1這樣的位元流,對使用者是透明的。有很多物理層的標準,規定了物理層的電氣特性比如辦公用的網線、家庭用的光貓等。
資料鏈路層:傳輸資料幀,透過MAC地址標識通訊雙方。常用的通訊協議有乙太網的802.11、家庭的GPON、廣域網的PPP、FDDI、ATM等。
傳輸層:傳輸資料報,透過埠號標識應用層的應用程式。提供面向連線的TCP服務或者無連線的UDP服務,實現端到到的通訊。
會話層:提供通訊雙方會話的建立、維持、釋放。
表示層:完成資料轉換,比如GB2312編碼到UTF-8的轉換,還有資料壓縮與解壓縮等。
TCP/IP四層模型OSI七層參考模型是理論模型,實際應用的是TCP/IP四層模型,對應關係如下圖所示,關於各層的功能參考上一節:
應用層:對應OSI的應用層、表示層、會話層
傳輸層:同OSI
網路層:同OSI
網路介面層:同OSI的資料鏈路層和物理層
網路協議要想實現網路參考模型中每一層之間的通訊,就來不開協議,否則麼辦法交流。
應用層協議:http協議實現web服務、ftp協議實現ftp下載、smtp協議實現收郵件、pop3協議實現接收郵件、dns協議實現ip地址到域名的轉換
傳輸層協議:面向連線的tcp和無連線的udp,透過不同的埠號標識應用層協議,比如80表示web,21標識ftp,3389標識遠端桌面等
網路層協議:ip協議,透過ip地址標識通訊雙發,透過arp協議實現ip地址到mac地址的轉換
資料鏈路層協議:802.11協議實現區域網通訊,透過mac地址標識通訊雙方
物理層協議:雙絞線、wifi、短波通訊、衛星通訊、ffdi、gpon、epon、光纖等
-
3 # 王海軍老師
一、TCP/IP參考模型(四層or五層)
TCP/IP參考模型是計算機網路的祖父ARPANET和其後繼的因特網使用的參考模型。
1、四層模型:
應用層:對應OSI中的應用層、表示層、會話層
資料鏈路層:對應OSI中的資料鏈路層、物理層(也有叫網路介面層)
七層對四層
2、五層模型:
應用層:對應OSI中的應用層、表示層、會話層
資料鏈路層:對應OSI中的資料鏈路層、物理層(也有叫網路介面層)
物理層層:對應OSI中的物理層
七層對五層
在每一層都工作著不同的裝置,比如我們常用的交換機就工作在資料鏈路層的,一般的路由器是工作在網路層的。
在每一層實現的協議也各不同,即每一層的服務也不同.下圖列出了每層主要的協議。其中每層中具體的協議,我會在後面的逐一學習。
3、四層,五層,七層對比:
二、TCP資料格式和IP資料格式TCP資料報文
IP資料報文
決定上層協議
三、TCP協議三次握手和四次揮手TCP,名為傳輸控制協議,是一種可靠的傳輸層協議,IP協議號為6。
原則上任何資料傳輸都無法確保絕對可靠,三次握手只是確保可靠的基本需要。
三次握手
TCP的連線的拆除需要傳送四個包,因此稱為四次揮手。客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。
簡單確認
TCP視窗
所謂三次握手(Three-Way Handshake)即建立TCP連線,就是指建立一個TCP連線時,需要客戶端和服務端總共傳送3個包以確認連線的建立。在socket程式設計中,這一過程由客戶端執行connect來觸發。
FAQ為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?
這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的連線請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裡來發送。但關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部發送給對方了,所以你可能未必會馬上會關閉SOCKET,也即你可能還需要傳送一些資料給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文和FIN報文多數情況下都是分開發送的。
-
4 # 車小胖
先來談談汽車行業,隨著家庭轎車的普及,越來越多的人開始使用汽車,其中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協議的時候,要想像成兩臺機子哦!兩臺機子通訊,必須有一個“合同”,即協議。甲機的資訊一層一層的往下傳,一直傳到硬體,傳到網路;乙機的則相反,從網路上得到資料後往上傳,先是網絡卡,再鏈路....一直到你的應用軟體,這樣就完成了通訊。
那麼為什麼每個層還要分成若干個塊呢? 比如應用層它就分成FTP、SMTP、HTTP這樣的,因為我們的工作有多種目的,所以不同的目的用不同的方法。比如,你只想傳檔案,那就選FTP好了,跟SMTP、HTTP沒關係。