當前位置:編程學習大全網 - 編程語言 - Android 網絡基礎之網絡協議篇

Android 網絡基礎之網絡協議篇

學習壹門技術或者看壹篇文章最好的方式就是帶著問題去學習,這樣才能在過程中有茅塞頓開、燈火闌珊的感覺,記憶也會更深刻。

對於網絡的分層,有的分為七層,有的分為四層,而我認為五層模型是最容易理解的網絡模型。

如上圖所示,從上往下依次為應用層、傳輸層、網絡層、鏈接層、實體層。

越往上,就越靠近用戶;越往下,則越靠近硬件。

大家都遵守的規則,就叫做"協議"(protocol)。

互聯網的每壹層,都定義了很多協議。這些協議的總稱,就叫做"互聯網協議"(Internet Protocol Suite),它們是互聯網的核心。

我們從最下面壹層開始分析,電腦要聯網,第壹件事要做什麽?就是用電纜、光纜、雙絞線等方式將電腦連接起來,這就是實體層。

實體層就是就是把電腦連接起來的物理手段。它主要規定了網絡的壹些電氣特性,作用是負責傳送 0 和 1 的電信號。

"鏈接層"在"實體層"的上方,確定了 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 數據的格式,這些應用程序協議就構成了"應用層"。

[圖片上傳失敗...(image-ebc671-1558268545157)]

至此,整個互聯網的五層結構,自下而上全部講完了。

文章已經讀到末尾了,不知道最初的幾個問題妳都會了嗎?如果不會的話?可以再針對不會的問題進行精讀哦!答案都在文中,相信妳肯定可以解決的!

  • 上一篇:圖靈社區 閱讀 怎樣在 Markdown 中使程序代碼帶上行號
  • 下一篇:編寫貓小說的單詞表
  • copyright 2024編程學習大全網