學習一門技術或者看一篇文章最好的方式就是帶着問題去學習,這樣才能在過程當中有茅塞頓開、燈火闌珊的感受,記憶也會更深入。網絡
對於網絡的分層,有的分爲七層,有的分爲四層,而我認爲五層模型是最容易理解的網絡模型。學習
如上圖所示,從上往下依次爲應用層、傳輸層、網絡層、連接層、實體層。
越往上,就越靠近用戶;越往下,則越靠近硬件。ui
你們都遵照的規則,就叫作"協議"(protocol)。設計
互聯網的每一層,都定義了不少協議。這些協議的總稱,就叫作"互聯網協議"(Internet Protocol Suite),它們是互聯網的核心。3d
咱們從最下面一層開始分析,電腦要聯網,第一件事要作什麼?就是用電纜、光纜、雙絞線等方式將電腦鏈接起來,這就是實體層。cdn
實體層就是就是把電腦鏈接起來的物理手段。它主要規定了網絡的一些電氣特性,做用是負責傳送 0 和 1 的電信號。blog
"連接層"在"實體層"的上方,肯定了 0 和 1 的分組方式。(多少個電信號算一組?每一個信號位有何意義?)接口
以太網規定,一組電信號構成一個數據包,叫作"幀"(Frame)。每一幀分紅兩個部分:標頭(Head)和數據(Data)。進程
"標頭"包含數據包的一些說明項,好比發送者、接受者、數據類型等等;"數據"則是數據包的具體內容。資源
"標頭"的長度,固定爲 18 字節。"數據"的長度,最短爲 46 字節,最長爲 1500 字節。所以,整個"幀"最短爲 64 字節,最長爲 1518 字節。若是數據很長,就必須分割成多個幀進行發送。
以太網規定,連入網絡的全部設備,都必須具備"網卡"接口。數據包必須是從一塊網卡,傳送到另外一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,這叫作 MAC 地址。
每塊網卡出廠的時候,都有一個全世界獨一無二的 MAC 地址,長度是 48 個二進制位,一般用 12 個十六進制數表示。
前 6 個十六進制數是廠商編號,後 6 個是該廠商的網卡流水號。有了 MAC 地址,就能夠定位網卡和數據包的路徑了。
以太網採用了一種很"原始"的方式,它不是把數據包準確送到接收方,而是向本網絡內全部計算機發送,讓每臺計算機本身判斷,是否爲接收方。
同一個子網絡的計算機都會收到這個包。它們讀取這個包的"標頭",找到接收方的 MAC 地址,而後與自身的 MAC 地址相比較,若是二者相同,就接受這個包,作進一步處理,不然就丟棄這個包。這種發送方式就叫作"廣播"(broadcasting)。
有了數據包的定義、網卡的 MAC 地址、廣播的發送方式,"連接層"就能夠在多臺計算機之間傳送數據了。
以太網協議,依靠 MAC 地址發送數據。這樣作有一個重大的缺點。以太網採用廣播方式發送數據包,若是兩臺計算機不在同一個子網絡,廣播是傳不過去的。這種設計是合理的,不然互聯網上每一臺計算機都會收到全部包,那會引發災難。
所以,必須找到一種方法,可以區分哪些 MAC 地址屬於同一個子網絡,哪些不是。若是是同一個子網絡,就採用廣播方式發送,不然就採用"路由"方式發送。("路由"的意思,就是指如何向不一樣的子網絡分發數據包)
「網絡層」的做用是引進一套新的地址,使得咱們可以區分不一樣的計算機是否屬於同一個子網絡。這套地址就叫作"網絡地址",簡稱"網址"。
"網絡層"出現之後,每臺計算機有了兩種地址,一種是 MAC 地址,另外一種是網絡地址。網絡地址幫助咱們肯定計算機所在的子網絡,MAC 地址則將數據包送到該子網絡中的目標網卡。所以,從邏輯上能夠推斷,一定是先處理網絡地址,而後再處理 MAC 地址。
規定網絡地址的協議,叫作 IP 協議。它所定義的地址,就被稱爲 IP 地址。習慣上,咱們用分紅四段的十進制數表示IP地址,從 0.0.0.0 一直到 255.255.255.255。
IP 地址的前一部分表明網絡,後一部分表明主機。好比,IP 地址 172.16.254.1,這是一個 32 位的地址,假定它的網絡部分是前 24 位(172.16.254),那麼主機部分就是後 8 位(最後的那個1)。處於同一個子網絡的電腦,它們 IP 地址的網絡部分一定是相同的,也就是說 172.16.254.2 應該與 172.16.254.1 處在同一個子網絡。
可是,問題在於單單從 IP 地址,咱們沒法判斷網絡部分。仍是以 172.16.254.1 爲例,它的網絡部分,究竟是前 24 位,仍是前 16 位,甚至前 28 位,從 IP 地址上是看不出來的。
"子網掩碼",就是表示子網絡特徵的一個參數。它在形式上等同於 IP 地址,也是一個 32 位二進制數字,它的網絡部分所有爲 1,主機部分所有爲 0。好比,IP 地址 172.16.254.1,若是已知網絡部分是前 24 位,主機部分是後 8 位,那麼子網絡掩碼就是 11111111.11111111.11111111.00000000,寫成十進制就是 255.255.255.0。
知道**"子網掩碼"**,咱們就能判斷,任意兩個 IP 地址是否處在同一個子網絡。方法是將兩個 IP 地址與子網掩碼分別進 行 AND 運算(兩個數位都爲 1,運算結果爲 1,不然爲 0),而後比較結果是否相同,若是是的話,就代表它們在同一個子網絡中,不然就不是。
由於 IP 數據包是放在以太網數據包裏發送的,因此咱們必須同時知道兩個地址,一個是對方的 MAC 地址,另外一個是對方的 IP 地址。一般狀況下,對方的IP地址是已知的(後文會解釋),可是咱們不知道它的 MAC 地址。
因此,咱們須要一種機制,可以從 IP 地址獲得 MAC 地址。
這裏又能夠分紅兩種狀況。第一種狀況,若是兩臺主機不在同一個子網絡,那麼事實上沒有辦法獲得對方的 MAC 地址,只能把數據包傳送到兩個子網絡鏈接處的"網關"(gateway),讓網關去處理。
第二種狀況,若是兩臺主機在同一個子網絡,那麼咱們能夠用 ARP 協議,獲得對方的 MAC 地址。ARP 協議也是發出一個數據包(包含在以太網數據包中),其中包含它所要查詢主機的IP地址,在對方的 MAC 地址這一欄,填的是 FF:FF:FF:FF:FF:FF,表示這是一個"廣播"地址。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出 IP 地址,與自身的 IP 地址進行比較。若是二者相同,都作出回覆,向對方報告本身的 MAC 地址,不然就丟棄這個包。
有了 ARP 協議以後,咱們就能夠獲得同一個子網絡內的主機 MAC 地址,能夠把數據包發送到任意一臺主機之上了。
**"端口"(port)**表示這個數據包到底供哪一個程序(進程)使用。
"傳輸層"的功能,就是創建"端口到端口"的通訊。相比之下,"網絡層"的功能是創建"主機到主機"的通訊。只要肯定主機和端口,咱們就能實現程序之間的交流。
在數據包中加入端口信息,這就須要新的協議。最簡單的實現叫作 UDP 協議,它的格式幾乎就是在數據前面,加上端口號。
UDP 數據包,也是由"標頭"和"數據"兩部分組成。
"標頭"部分主要定義了發出端口和接收端口,"數據"部分就是具體的內容。
UDP 數據包很是簡單,"標頭"部分一共只有8個字節,總長度不超過 65,535 字節,正好放進一個 IP 數據包。
UDP 協議的優勢是比較簡單,容易實現,可是缺點是可靠性較差,一旦數據包發出,沒法知道對方是否收到。
爲了解決這個問題,提升網絡可靠性,TCP 協議就誕生了。這個協議很是複雜,但能夠近似認爲,它就是有確認機制的 UDP 協議,每發出一個數據包都要求確認。若是有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。
所以,TCP 協議可以確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。
TCP 數據包和 UDP 數據包同樣,都是內嵌在 IP 數據包的"數據"部分。TCP 數據包沒有長度限制,理論上能夠無限長,可是爲了保證網絡的效率,一般 TCP 數據包的長度不會超過IP數據包的長度,以確保單個 TCP 數據包沒必要再分割。
"應用層"的做用,就是規定應用程序的數據格式。
舉例來講,TCP 協議能夠爲各類各樣的程序傳遞數據,好比 Email、WWW、FTP 等等。那麼,必須有不一樣協議規定電子郵件、網頁、FTP 數據的格式,這些應用程序協議就構成了"應用層"。
至此,整個互聯網的五層結構,自下而上所有講完了。
文章已經讀到末尾了,不知道最初的幾個問題你都會了嗎?若是不會的話?能夠再針對不會的問題進行精讀哦!答案都在文中,相信你確定能夠解決的!