數據路由。前端
計算機 A 與 B 之間的數據通訊能夠認爲是經過一個虛擬的互連網絡進行傳輸的。android
「每個惟一的網絡設備都有一個惟一的 IP 地址。不一樣於 MAC 地址是不可改變的,IP 地址會根據當前設備所鏈接的網絡環境的變化而發生變化」。git
例如一個 IP 地址:192.168.11.11 => 11000000.10101000.00001011.00001011程序員
IP 數據報 = IP 首部 + IP 數據報的數據,「IP 數據報的報文格式」 以下所示:github
佔4位,指的是 IP 協議的版本,通訊雙方的版本必須一致,當前主流版本是4,即 IPv4,也有 IPv6。web
佔4位,最大數值爲15,表示的是 IP 首部長度,單位是 32位字(4個字節)。因此 IP 首部的 「最大長度爲 15 * 4 = 60字節」。面試
表示當前的數據包是高優先級的,仍是低優先級的。數據包是按照 TOS 被分配到3個波段(band0、band一、band2)裏面的。算法
佔16位,最大數值爲65535,表示的是 IP 數據報的總長度(IP 首部 + IP 數據)。數據庫
須要注意的是,「數據在數據鏈路層中的傳輸受最大傳輸單元 MTU 的限制,而 MTU 通常爲爲 1500 個字節,若是 IP 數據報的長度高於 MTU 的話,數據鏈路層將會把 IP 數據報進行 分片,即拆分紅多個數據幀進行傳輸」。編程
協議內部自身使用,不須要關注。
佔3位,目前只有兩位是有意義的,「標識是否進行分片」。
佔 13 位,「若是發生了分片,這裏將會記錄當前的數據幀保存的是第幾個偏移的 IP 數據」。
佔8位,「代表 IP 數據所攜帶的具體數據是什麼協議的」。(例如:TCP、UPD 等等)
協議 | 值 |
---|---|
ICMP | 1 |
IGMP | 2 |
IP | 4 |
TCP | 6 |
UDP | 17 |
OSPF | 89 |
「佔16位,校驗 IP 首部是否有錯,接收方在接收了 IP 數據報文以後會進行頭部的校驗,若是出錯會進行丟棄」。
發送 IP 數據報文的 IP 地址。
數據報到達的 IP 的地址。
數據是從目的設備傳輸到下一個網絡1,又從下一個網絡1傳輸到路由器,又從路由器跳到下一個網絡2,因此是一跳一跳,即 hop-by-hop。
由於規劃和分配 IP 地址很是麻煩。
組成形式:網絡號 + 主機號
一般有以下三種類型的 IP 地址:
「本地迴環地址(Loopback Address):127.0.0.1,不屬於任何一個有類別地址類。它表明設備的本地虛擬接口,因此默認被看做是永遠不會廢棄的接口。在 Windwos 操做系統中也有類似的定義,因此通常在安裝網卡前就能夠 ping 通這個本地迴環地址。通常都會用來檢查本地網絡協議、基本數據接口等是不是正常的」。代碼以下所示:
quchao@quchaodeMacBook-Pro EMC-MBANK-ANDROID % ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.068 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.103 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.081 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.081 ms 複製代碼
它們都僅用做特殊用途。
❝某公司擁有256名員工,每人配備一個計算機,請問該公司應該申請哪一種網絡段?
❞
分配 B 類地址,可是一個 B 類地址所能容納的主機數量爲 2^16-2,這會形成極大的浪費。爲了解決這個問題,須要劃分子網。
例如:將 193.10.10.0 這個 IP 劃分爲 193.10.10.0 ~ 193.10.10.127 與 193.10.10.128 ~ 193.10.10. 255。
❝子網這麼多,如何判斷某個 IP 的網絡號?
❞
「快速地判斷某一個 IP 屬於哪個子網號,經過 IP & 子網掩碼 = 該 IP 對應的子網號」。子網掩碼的組成特色以下所示:
例如 A、B、C 類的子網掩碼地址:A類:255.0.0.0,B類:255.255.0.0,C類:255.255.255.0
「CIDR 使用了斜線記法,例如:193.10.10.129/25 表示網絡號爲 25 位,主機號爲 7位」。通常家裏都是使用 /24 的 CIDR,此時整個網絡裏面的第一個地址爲 192.168.0.1,每每就是私網的出口地址。例如:家裏面的電腦鏈接 WIFI,WIFI 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是廣播地址。
❝loopback 是什麼?
❞
「即環回接口,一般會被分配到 127.0.0.1 這個地址,它用於本機內部通訊,通過內核處理後直接返回,不會再任何網絡中出現」。
❝某公司總共有 200 名員工,須要拆分紅兩個部分,每一個部分使用一個小型網絡,如何使用 CIDR 進行劃分?
❞
可使用一個 /24 做爲一箇中型網絡(在 CIDR 中被稱爲超網),旗下有兩個 /25 做爲一個小型網絡(在 CIDR 中被稱爲子網)。
❝在 IP 數據的轉發過程當中,A 將 IP 數據報交給數據鏈路層,並告知其目的 MAC 地址是 E。這裏 A 是如何知道目的 MAC 地址是 E 的呢?
❞
「ARP 協議將網絡層 IP 32位地址轉換爲數據鏈路層 MAC 48位地址」。
「緩存了 IP 地址到硬件地址之間的映射關係。有緩存時直接從緩存中取出便可,沒有緩存時則會和 MAC 地址表獲取地址時使用的廣播形式相似」,即
「ARP 緩存是 ARP 協議和 RARP 協議運行的關鍵。此外,ARP 緩存表中的記錄並非永久有效的,有必定的期限」。
使用 arp -a
命令,以下所示:
quchao@quchaodeMacBook-Pro EMC-MBANK-ANDROID % arp -a
? (22.1.253.254) at 0:10:db:ff:10:0 on en0 ifscope [ethernet] ? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet] ? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet] 複製代碼
「ARP 協議被直接封裝在了數據鏈路層中的數據幀裏面的」。
❝既然 ARP 協議是直接被封裝在數據鏈路層中的數據幀裏面的,那麼爲何它是屬於網絡層的內容?
❞
主要是由於 「ARP 協議使用到了網絡層的 IP 地址」。
「不改變 IP 地址的網關,咱們稱爲轉發網關;改變 IP 地址的網關,咱們稱爲 NAT 網關」。
❝爲何要使用 NAT?
❞
對於公司,它能夠在外部使用全球惟一的外網 IP 地址,一般在內部使用一個 B 類內網地址便可。
同理,對於家庭能夠在外部使用全球惟一的外網 IP 地址,一般在內部使用一個 C 類內網地址便可。
❝問題:內網的多個設備使用同一個外網 IP 請求外網服務,外部是怎麼樣才能知道是哪個內網設備請求的呢?
❞
「使用 NAT ,它用於多個主機經過一個公有 IP 訪問互聯網的私有網絡,並減緩了 IP 地址的消耗,可是增長了網絡通訊的複雜度」。
例如以下兩個 NAT 轉換過程:發送數據時,A 設備內網地址和端口號 => 外網地址與端口號:192.168.2.11:6666 => 173.21.59.10:16666,B 設備內網地址和端口號 => 外網地址與端口號:192.168.2.10:7777 => 173.21.59.10:17777。
「因爲同時轉換了 Port ,即進行了 端口映射,NAT 也可稱爲 NA(P)T」。
ICMP 協議主要是用於 「輔助 IP 協議發送與接收數據的,它能夠報告錯誤信息或異常狀況」。
「ICMP 協議被封裝在 IP 數據報的數據之中,其也分爲 報文首部與報文數據。若是須要使用 ICMP 協議,則須要在 IP 協議首部的8位協議中寫入1,以代表 IP 數據所攜帶的具體數據是 ICMP 協議的」。
差錯報告報文具體分爲 「七種類型」,而 「大部分的報文類型是由類型的值和具體代碼組成的」。具體以下圖所示:
詢問報文具體分爲 「兩類」,它僅僅是由 「類型的值」 決定的。具體以下圖所示:
經常使用的 ping 就是查詢報文,是一種主動請求而且得到主動應答的 ICMP 查詢報文,以下:
ICMP ECHO REQUESTZ
:
「對 ping 的主動請求進行網絡抓包」。
ICMP ECHO REPLY
:
「主動請求的回覆」。
因此,ping 發的包也是符合 ICMP 格式的,僅僅增長了一些本身的格式。以下所示:
ping 命令執行時,源主機會構建一個 ICMP 請求數據包,其中有兩個最重要的字段,以下:
例如 ping www.wanandorid.com 網站,以下所示:
quchao@quchaodeMacBook-Pro cmmp-core-client-android % ping www.wanandroid.com
PING www.wanandroid.com (47.104.74.169): 56 data bytes 64 bytes from 47.104.74.169: icmp_seq=0 ttl=51 time=51.877 ms 64 bytes from 47.104.74.169: icmp_seq=1 ttl=51 time=52.416 ms 64 bytes from 47.104.74.169: icmp_seq=2 ttl=51 time=48.942 ms 64 bytes from 47.104.74.169: icmp_seq=3 ttl=51 time=45.816 ms 64 bytes from 47.104.74.169: icmp_seq=4 ttl=51 time=48.336 ms 64 bytes from 47.104.74.169: icmp_seq=5 ttl=51 time=42.358 ms ç64 bytes from 47.104.74.169: icmp_seq=6 ttl=51 time=49.428 ms 64 bytes from 47.104.74.169: icmp_seq=7 ttl=51 time=41.963 ms 複製代碼
遇到網絡不通的問題時,除了直接 ping 目標 IP 地址,頭腦中年還應該有一個清晰的網絡拓撲圖,而且須要清楚地知道一個包從源地址傳到目標地址要通過哪些設備,而後逐個 ping 中間的這些設備或機器,一般的排查步驟以下所示:
此外,除了 ping 以外,咱們還能夠經過 tcpdump -i eth0 icmp
,「查看發出的包有沒有到達某個點,以及回覆的包到達了哪一個點,以便更容易推斷出錯的位置」。
❝ping 不一樣必定就表明網絡不通嗎?
❞
不是,若是不在咱們的控制範圍內,不少中間設備都是禁止 ping 的,可是 ping 不通不表明網絡不通。這個時候就要使用 Telnet,經過其餘協議來測試網絡是否暢通。
「用於探測 IP 數據報在網絡中走過的路徑」。
在 IP 數據報的首部中,有一個8位的生存時間 TTL,它表示了 IP 數據報文在網絡中的壽命,每通過一個設備,TTL 減1,「當 TTL = 0時,網絡設備必須丟棄該報文,並會發送 ICMP 終點不可達差錯報文」。
而 Traceoute 則巧妙地應用了 ICMP 終點不可達差錯報文與 TTL 機制,爲了探測 IP 數據報文走過的路徑,它會發送一個 UDP 數據包。將 TTL 設置爲1,一旦遇到一個路由器,它就會犧牲了。接着返回一個 ICMP 包,就是網絡差錯包,類型是時間超時,這樣就能知道一個路由器有多遠。具體機制以下所示:
這樣,源主機就接收到了全部的路徑信息,就能夠輸出該數據報在網絡中的路徑了。traceroute 命令的使用示例以下所示:
tracert github.com (Windows 爲 tracert github.com)
quchao@quchaodeMacBook-Pro cmmp-core-client-android % traceroute github.com traceroute to github.com (13.250.177.223), 64 hops max, 52 byte packets 1 22.4.93.254 (22.4.93.254) 11.676 ms 7.331 ms 9.620 ms 2 59.40.180.129 (59.40.180.129) 977.679 ms 440.943 ms 10.672 ms 3 49.186.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.186.49) 9.207 ms 12.436 ms 10.636 ms 4 125.176.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.176.125) 13.202 ms 10.292 ms 28.478 ms 5 183.56.65.6 (183.56.65.6) 11.763 ms 9.236 ms 183.56.65.18 (183.56.65.18) 11.392 ms 6 202.97.94.134 (202.97.94.134) 18.357 ms 202.97.94.150 (202.97.94.150) 18.175 ms 202.97.94.134 (202.97.94.134) 36.600 ms 7 202.97.94.98 (202.97.94.98) 245.161 ms 202.97.12.29 (202.97.12.29) 19.504 ms 202.97.12.41 (202.97.12.41) 22.256 ms 複製代碼
❝爲何查找一個 IP 地址時可能會看不到中間有些路由器的信息?
❞
由於有的路由器根本不會返回這個 ICMP 包。
路由表包括了 「目的 IP 地址與下一跳 IP 地址的映射關係」。
「從網絡的分級層級來看,每個主幹 ISP 均可以認爲是一個主幹 AS,每個地區 ISP 均可以認爲是一個地區 AS,而每個公司、校園、家庭均可以認爲是一個小的 AS」。
例如家庭 AS1 與公司 AS2 它們直接使用的網關協議示意圖以下所示:
咱們能夠把網絡拓撲圖轉換爲圖,其中
「路由算法的本質即圖論的算法,但因爲複雜的網絡環境,因此路由算法比圖論算法要更加複雜」。
❝如何設計一個好的路由算法?
❞
「實現簡單,開銷很小」。
假設有一個 A-B-C 的鏈路,假如 A 路由節點出現問題沒法使用,那麼 B、C 就會互相詢問,知道它們各自的跳數一直累加到超過 15 跳。
與 RIP 協議的不一樣:
所以,能夠看到 「LS 協議解決了 RIP 協議 隨便相信隔壁路由、視野不夠的問題」。
特色:
過程:
核心是 Dijkstra 算法。
而後,咱們再來回顧一下 「完整過程」:
RIP | OSPF |
---|---|
從鄰居看網絡 | 整個網絡的拓撲 |
在路由器之間累加距離 | Dijkstra 算法計算最短路徑 |
頻繁、週期更新,收斂很慢 | 狀態變化更新,收斂很快 |
路由間拷貝路由信息 | 路由間傳遞鏈路狀態,自行計算路徑 |
雖然 OSPF 協議解決了 RIP 協議的問題,對整個網絡有了必定的全局觀,可是 「OSPF 協議自己較爲複雜,實現開銷較大」。
❝爲何要在 AS 之間使用 BGP 協議呢?
❞
「因爲各個 AS (國家、地區)之間政策、安全等緣由,BGP 僅可以找到一個到底目的地的比較好的路由。而 AS 之間是經過 BGP 發言人來進行路由信息的交換的」。
❝什麼是數據幀?
❞
❝若是數據裏面恰好有這些比特流怎麼辦?
❞
❝透明傳輸是什麼?
❞
❝若是數據裏面恰好有這些控制字符該怎麼辦?
❞
在該控制字符前面加上一個 ESC 轉義字符,若是數據中也包含有 ESC 轉義字符時,則能夠在前面再加一個 ESC 轉義字符。而數據鏈路層的轉義字符能夠類比與編程語言中的轉義字符。
❝爲何要進行差錯監測?
❞
「所以物理層只管傳輸比特流,沒法控制是否出錯。因此數據鏈路層須要負責 差錯監測 的工做」。
「在比特流的後面加上 奇偶校驗碼(1/0).例如:00110100 => 全部位數和爲3,是基數,在該比特流後面加1。(偶數加0)」
它的侷限性在於 「當比特流中出錯兩位時,沒法檢測出錯誤」。
CRC 使用了 「模 2 除法」,即:「當最高位爲0時,則認爲餘數不夠除,取商爲0」。
「發送端增長校驗碼:」
「接收端驗證校驗碼:」
「缺點」
❝爲何要設計出 MTU?
❞
數據幀過大或太小都會影響傳輸的效率。例如會增長數據傳輸時的總時延。以太網 MTU 通常爲 1500 字節。
由傳輸鏈路中全部 MTU 中的最小 MTU 決定。
「存有 MAC 地址和硬件接口的映射關係。其中每個 MAC 地址都有與之對應的硬件接口」。
單位爲 「字節」。
❝其中的幀數據具體是什麼數據?
❞
❝若是 MAC 地址並不知道 B 的硬件接口,路由器如何處理?
❞
❝什麼是比特流?
❞
「由高低電頻表示的數據流,1 => 高電頻,0 => 低電頻」,例如由比特流 100110101010 轉化成的數字信號以下圖所示:
從外至內由 「聚氯乙烯套層、絕緣層、銅線」 組成。
不一樣於 無屏蔽雙絞線,其在第二層 「加了屏蔽層」。
從外至內由 「絕緣保護套層、外導體屏蔽層、絕緣層、內導體」 組成。
光纖由 「包層(低折射率的媒體)、纖芯(高折射率的媒體)」 組成。
❝如何處理髮送與接受出現衝突的狀況?
❞
計算機網絡是一個須要咱們持續深刻探索的一門基礎學科,在本篇中咱們全面瞭解了計算機網絡的核心基礎知識,這爲咱們以後探討移動網絡優化相關的問題打下了必定的網絡基礎。網絡優化之旅纔剛剛開始~
❝關於計算機網絡的高頻問題能夠 查看此處。
❞
❝歡迎關注個人微信:
❞bcce5360
❝「因爲微信羣已超過 200 人,麻煩你們想進微信羣的朋友們,加我微信拉你進羣。」
❞
❝2千人QQ羣,「Awesome-Android學習交流羣,QQ羣號:959936182」, 歡迎你們加入~
❞