計算機網路之網路層
阿新 • • 發佈:2020-06-09
## 網路層概述
網路層的目的是實現兩個端系統之間的資料透明傳送,具體功能包括定址和路由選擇、連線的建立、保持和終止等。它提供的服務使傳輸層不需要了解網路中的資料傳輸和交換技術。如果您想用盡量少的詞來記住網路層,那就是"路徑選擇、路由及邏輯定址"。
網路層中涉及眾多的協議,其中包括最重要的協議,也是TCP/IP的核心協議——IP協議。IP協議非常簡單,僅僅提供不可靠、無連線的傳送服務。IP協議的主要功能有:無連線資料報傳輸、資料報路由選擇和差錯控制。與IP協議配套使用實現其功能的還有地址解析協議ARP、逆地址解析協議RARP、因特網報文協議ICMP、因特網組管理協議IGMP。
### IP協議詳解
#### 虛擬互連網路
實際的計算機網路是錯綜複雜的,物理裝置通過使用IP協議,遮蔽了物理網路之間的差異,當網路中的主機使用IP協議連線時,則無需關注網路細節。IP協議使得複雜的實際網路變為一個虛擬互連的網路,還使得網路層可以遮蔽底層細節而專注網路層的資料轉發,IP協議解決了在虛擬網路中資料報傳輸路徑的問題。
IP地址長度為32位,常分成4個8位,IP地址常使用點分十進位制來表示(0\~255.0\~255.0\~255.0\~255),也就是共有$2^{32} = 4294961296$個IP地址。下圖是IP協議的格式:
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200606065836323-1350481097.png)
我們來看看IP協議的首部:
**版本**:佔4位,指的是IP協議的版本,通訊雙方的版本必須一致,當前主流版本是4,即IPv4,也有IPv6
**首部位長度**:佔4位,最大數值為15,表示的是IP首部長度,單位是“32位字”(4個位元組),也即是IP首部最大長度為60位元組
**總長度**:佔16位,最大數值為65535,表示的是IP資料報總長度(IP首部+IP資料)
**TTL**:佔8位,表明IP資料報文在網路中的壽命,每經過一個裝置,TTL減1,當TTL=0時,網路裝置必須丟棄該報文。作用:避免資料在網路中無限傳輸,當這個網路報文找不到目的機器時,而進行無限傳輸,來浪費頻寬資源
**協議**:佔8位,表明IP資料所攜帶的具體資料是什麼協議的(如:TCP、UDP等)
協議名|ICMP|IGMP|IP|TCP|UDP|OSPF|…
--|--|--|--|--|--|--|--
欄位值|1|2|4|6|17|89|…
**首部校驗和**:佔16位,校驗IP首部是否有出錯
#### IP協議的轉發流程
在資料鏈路層的學習中我們知道了MAC地址表,由於IP協議的轉發是通過逐跳(hop-by-hop)來實現的,所以在網路層中,存在一個類似於MAC地址表的路由表,路由表是儲存的目的IP地址和下一跳IP地址的對映,計算機或者路由器都擁有路由表。路由表如下:
目的IP地址|下一跳IP地址
--|--
IP1|IP4
IP2|IP5
IP3|IP6
…|…
A裝置是如何跨裝置將資料傳送給C裝置的呢?
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200609090729792-1560511197.png)
A裝置向C裝置在網路層中傳輸資料的過程如下:
1. A發出目的地為C的IP資料報,查詢路由表發現下一跳為E
2. A將資料報傳送給E
3. E查詢路由表發現下一跳為F,將資料報傳送給F
4. F查詢路由表發現目的地C直接連線,將資料報傳送給C
---
現在結合資料鏈路層和網路層,再來看一下跨裝置傳輸資料的過程:
1. A發出目的地為C的IP資料報,查詢路由表發現下一跳為E
2. A將IP資料報交給資料鏈路層,並告知目的MAC地址是E
3. 資料鏈路層填充源MAC地址A和目的MAC地址E
4. 資料鏈路層通過物理層將資料傳送給E
5. E的資料鏈路層接收到資料幀,把幀資料交給網路層
6. E查詢路由表,發現下一跳為F
7. E把資料報交給資料鏈路層,並告知目的MAC地址為F
8. E的資料鏈路層封裝資料幀併發送
9. F的資料鏈路層接收到資料幀,把幀資料交給網路層
10. F查詢路由表,發現下一跳為C
11. F把資料報交給資料鏈路層,並告知目的MAC地址為C
12. F的資料鏈路層F封裝資料幀併發送
---
從IP協議的轉發流程中我們可以看到:資料幀每一跳的MAC地址都在變化,但IP資料報每一跳的IP地址始終不變。但我們會發現一個問題,在網路層中將資料報交給資料鏈路層,並且需要告知目的MAC地址,但是在網路層中只知道IP地址,我們是如何知道目的MAC地址的呢?這就是ARP協議做的事情了。
### ARP協議
ARP(Address Resolution Protocol)地址解析協議,將網路層中的32位IP地址,通過ARP協議解析為資料鏈路層中的48位MAC地址。這個對映關係是儲存在ARP快取表中的。arp -a命令:檢視ARP快取表
IP地址|MAC地址
--|--
192.168.83.254|00-50-56-e0-33-40
192.168.83.255|01-00-5e-00-00-16
224.0.0.251|01-00-5e-00-00-fc
239.1.2.3|01-00-5e-40-98-8f
255.255.255.255|01-00-5e-7f-ff-fa
ARP快取表是ARP協議和RARP協議執行的關鍵,ARP快取表快取了IP地址到硬體地址之間的對映關係,ARP快取表中的記錄並不是永久有效的,有一定的期限。這是因為當你的網路裝置,換個網路環境,網路裝置的IP地址就可能會發生改變,ARP快取表中的原來的記錄就失效了。當ARP快取表中有對映關係,就直接查詢ARP快取表;如果沒有這個對映關係,ARP協議就會廣播,並記錄迴應得地址資訊。
RARP(Reverse Address Resolution Protocol)逆地址解析協議,其作用與ARP協議相反,即把資料鏈路層中48位MAC地址,解析位網路層中的32位IP地址。(R)ARP協議是TCP/IP協議棧裡面基礎的協議,ARP和RARP的操作對程式設計師是透明的,理解(R)ARP協議有助於理解網路分層的細節。
### IP地址的子網劃分
#### 分類的IP地址
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200606081849282-1228121622.png)
|最小網路號|最大網路號|子網數量|最小主機號|最大主機號|主機數量
--|--|--|--|--|--|--
A|0(00000000)|127(01111111)|$2^7$|0.0.0|255.255.255|$2^{24}$
B|128.0|191.255|$2^{14}$|0.0|255.255|$2^{16}$
C|192.0.0|223.255.255|$2^{21}$|0|255|$2^{8}$
**特殊的主機號**:主機號全0表示當前網路段,不可分配為特定主機;主機號為全1表示廣播地址,向當前網路段所有主機發訊息
* A類地址網路段全0(00000000)表示特殊網路
* A類地址網路段後7位全1(01111111:127)表示迴環地址
* B類地址網路段(10000000.00000000:128.0)是不可使用的
* C類地址網路段(192.0.0)是不可使用的
---
實際可使用各類IP地址如下:
|最小網路號|最大網路號|子網數量|最小主機號|最大主機號|主機數量
--|--|--|--|--|--|--
A|1|127(01111111)|$2^7$-2|0.0.1|255.255.254|$2^{24}$-2
B|128.1|191.255|$2^{14}$-1|0.1|255.254|$2^{16}$-2
C|192.0.1|223.255.255|$2^{21}$-1|1|254|$2^{8}$-2
127.0.0.1,通常被稱為本地迴環地址(Loopback Address),不屬於任何一個有類別地址類。它代表裝置的本地虛擬介面,所以預設被看作是永遠不會宕掉的介面。在Windows作業系統中也有相似的定義,所以通常在安裝網絡卡前就可以ping通這個本地迴環地址。一般都會用來檢查本地網路協議、基本資料介面等是否正常的。
#### 劃分子網
隨著互連網應用的不斷擴大,原先的IPv4的弊端也逐漸暴露出來,即網路號佔位太多,而主機號位太少,所以其能提供的主機地址也越來越稀缺,目前除了使用NAT在企業內部利用保留地址自行分配以外,通常都對一個高類別的IP地址進行再劃分,以形成多個子網,提供給不同規模的使用者群使用。這裡主要是為了在網路分段情況下有效地利用IP地址,通過對主機號的高位部分取作為子網號,從通常的網路位界限中擴充套件或壓縮子網掩碼,用來建立某類地址的更多子網。但建立更多的子網時,在每個子網上的可用主機地址數目會比原先減少。
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200606090201822-318716944.png)
上圖就把原來的C類地址劃分成了兩個子網。
但子網號這麼多,有沒有辦法快速判斷某個IP的網路號?這就是子網掩碼的作用了,子網掩碼是標誌兩個IP地址是否同屬於一個子網的,也是32位二進位制地址,其每一個為1代表該位是網路位,為0代表主機位。它和IP地址一樣也是使用點式十進位制來表示的。如果兩個IP地址在子網掩碼的按位與的計算下所得結果相同,即表明它們共屬於同一子網中。
子網掩碼由連續的1和連續的0組成,某一個子網的子網掩碼具備網路號位數個連續的1
**在計運算元網掩碼時,我們要注意IP地址中的保留地址,即" 0"地址和廣播地址,它們是指主機地址或網路地址全為" 0"或" 1"時的IP地址,它們代表著本網路地址和廣播地址,一般是不能被計算在內的。**
#### 無分類編址CIDR
CIDR中沒有A、B、C類網路號、和子網劃分的概念,CIDR將網路字首相同的IP地址稱為一個“CIDR地址塊”,注意網路字首是任意位數的。
網路字首|主機號
--|--
斜線記法:193.10.10.129/25 使用二進位制表示:11000001.00001010.00001010.10000001
無分類地址CIDR相比原來的子網劃分更加 靈活:
CIDR字首長度|掩碼點分十進位制|地址數
--|--|--
/13|255.248.0.0|512K
/14|255.252.0.0|256K
/15|255.254.0.0|128K
/16|255.255.0.0|64K
/17|255.255.128.0|32K
/18|255.255.192.0|16K
/19|255.255.224.0|8K
#### 網路地址轉換NAT技術
IPv4最多隻有40+億個IP地址,早期IP地址的不合理規劃導致IP號浪費。在介紹NAT技術之前,首先要知道內網地址和外網地址。
* 內網地址:內部機構使用,避免與外網地址重複。三類內網地址如下:
+ 10.0.0.0~10.255.255.255(支援千萬數量級裝置)
+ 172.16.0.0~172.31.255.255(支援百萬數量級裝置)
+ 192.168.0.0~192.168.255.255(支援萬數量級裝置)
* 外網地址:全球範圍使用,全球公網唯一
網路地址轉換技術是發生在本地路由器的,主要功能就是把內網的IP地址轉成外網的IP地址來進行外部的通訊,並且在接收到資料之後,再把外網IP地址對映成內網IP地址,轉發到具體的某個裝置上面去。
內網多個裝置使用同一個外網IP請求外網的服務,外部怎麼知道具體是哪個裝置在請求的?網路地址轉換NAT的英文全稱是Network Address Translation,NAT技術用於多個主機通過一個公有IP訪問網際網路的私有網路中,外部主要是通過埠號來區分到底是內網的哪一個裝置進行請求的,這其中有一個NA(P)T表表:示例如下:
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200606093041521-874851919.png)
方向|舊的地址和埠號|新的地址與埠號
--|--|--
出|192.168.2.11:6666|173.21.59.10:16666
出|192.168.2.10:7777|173.21.59.10:17777
入|173.21.59.10:16666|192.168.2.11:6666
入|173.21.59.10:17777|192.168.2.10:7777
NAT減緩了IP地址的消耗,但是增加了網路通訊的複雜度
### ICMP協議
ICMP協議全稱是網際控制報文協議(Internet Control Message Protocol),ICMP協議可以報告錯誤資訊或者異常情況
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200606102001059-1750108806.png)
ICMP協議首部:
ICMP報文分為:差錯報告報文和詢問報文:
####ICMP協議的應用
ping應用:我們可以通過ping命令進行簡單的網路故障排查:
1. ping本地迴環地址,一般情況下,都會得到返回的,如果得不到返回,則說明你的計算機的協議棧出現了問題,這個時候就可能需要重灌系統,或者是重新安裝這個協議棧
2. ping閘道器地址,即路由器地址,如果能得到返回的話,則說明本機到路由器的通路是通的,如果沒有返回的話,則說明你的wifi,或者你的網線連線是有問題的
3. ping遠端地址,如果不通的話,則說明你的家到ISP之間的網路是故障的,此時就需要聯絡網路服務商(移動、電信、聯通)進行排查。
Traceroute應用:Traceroute可以探測IP資料報在網路中走過的路徑
### 路由概述
思考:路由表中的下一跳地址是怎麼來的?下一跳地址是唯一的嗎?下一跳地址是最佳的嗎?路由器怎麼多,他們是怎麼協同工作的?為了解決這些問題,路由表需要一個好的演算法去解決這些事情。路由演算法實際上是圖論的演算法,由於網路環境複雜,使得路由演算法要比圖論的演算法更復雜。
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607095453310-1517135006.png)
由於網際網路的規模是非常大的,網際網路環境是非常複雜的,所以我們需要對網際網路進行劃分。自治系統(Autonomous System)是指處於一個管理機構下的網路裝置群,AS內部網路自行管理,AS對外提供一個或者多個出(入)口。自治系統內部路由的協議稱為:內部閘道器協議(RIP、OSPF), 自治系統外部路由的協議稱為:外部閘道器協議(BGP)。
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607095810096-1695686983.png)
#### 路由演算法
路由演算法的本質是距離向量(DV)演算法, 距離向量(DV)演算法介紹如下:
* 每一個節點使用兩個向量$D_i$和$S_i$
* $D_i$描述的是當前節點到別的節點的距離
* $S_i$描述的是當前節點到別的節點的下一節點
* 每一個節點與相鄰的節點交換向量$D_i$和$S_i$的資訊
* 每一個節點根據交換的資訊更新自己的節點資訊
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607103841300-328663666.png)
現在假設有A的距離向量資訊,收到的距離向量資訊如下圖:
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607105924701-502964357.png)
A通過B到各個節點得距離向量資訊如下:
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607111321912-1136651588.png)
A通過C到各個節點得距離向量:並更新下一條的節點
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607112341345-1588131792.png)
A通過D到各個節點得距離向量:並更新下一條的節點
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607113133473-2050788803.png)
A通過F到各個節點得距離向量:並更新下一條的節點
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200607113342701-737059304.png)
#### RIP協議
RIP(Routing Information Protocol)協議,RIP協議是使用DV演算法的一種路由協議。RIP協議把網路的跳數(hop)作為DV演算法的距離,每隔30s交換一次路由資訊,認為跳數> 15的路由則為不可達路由。
RIP協議的過程
1. 路由器初始化路由資訊(兩個向量$D_i$和$S_i$)
2. 對相鄰路由器X發過來的資訊,對資訊的內容進行修改(下一跳地址設定為X,所有距離加1)
1. 檢索本地路由,將資訊中新的路由插入到路由表裡面
2. 檢索本地路由,對於下一跳為X的,更新為修改後的資訊
3. 檢索本地路由,對比相同目的的距離,如果新資訊的距離更小,則更新本地路由表
3. 如果3分鐘沒有收到相鄰的路由資訊,則把相鄰路由設定為不可達(16跳)
RIP協議的優缺點:
* 優點:實現簡單,開銷很小。
* 缺點:故障資訊傳遞慢。也就是隨便相信“隔壁老王”,“自己不思考” “視野不夠”。因為RIP協議每一個路由器它只看到相鄰路由器的資訊,而看不到更遠的路由器資訊,這也限制了網路的規模。
### 內部閘道器路由協議之OSPF協議
#### 鏈路狀態(LS)協議
鏈路狀態(LS)協議:向所有的路由器傳送訊息,也就是一傳十、十傳百,只和相鄰的路由器交換資訊。訊息描述該路由器與相鄰路由器的鏈路狀態,每隔30s交換路由資訊,只有鏈路狀態發生變化時,才傳送更新資訊。
#### Dijkstra(迪傑斯特拉)演算法
Dijkstra演算法是著名的圖演算法,Dijkstra演算法解決有權圖從一個節點到其他節點的最短路徑問題,“以起始點為中心,向外層層擴充套件”。
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200608080223076-1466716109.png)
Dijkstra(迪傑斯特拉)演算法定義:
1. 初始化兩個集合(S, U)(S為只有初始頂點點A的集合,U為其他頂點集合)
2. 如果U不為空, 對U集合頂點進行距離的排序,並取出距離A最近的一個頂點D
i. 將頂點D的納入S集合
ii. 更新通過頂點D到達U集合所有點的距離(如果距離更小則更新,否則不更新)
iii. 重複2步驟
3. 直到U集合為空,演算法完成
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200608082807693-2094863869.png)
#### OSPF協議的過程
OSPF(Open Shortest Path First:開放最短路徑優先),OSPF協議的核心是Dijkstra演算法。OSPF協議的過程:路由器接入網路,路由器向鄰居發出問候資訊,與鄰居交流鏈路狀態資料庫,廣播和更新未知路由。
RIP協議|OSPF協議
--|--
從鄰居看網路|整個網路的拓撲
在路由器之間累加距離|Dijkstra演算法計算最短路徑
頻繁、週期更新,收斂很慢|狀態變化更新,收斂很快
路由間拷貝路由資訊|路由間傳遞鏈路狀態,自行計算路徑
### 外部閘道器路由協議之BGP協議
BGP(Border Gateway Protocol: 邊際閘道器協議),BGP協議是執行在AS之間的一種協議。由於網際網路的規模很大,AS內部使用不同的路由協議。
![](https://img2020.cnblogs.com/blog/1975191/202006/1975191-20200608091528109-1360839756.png)
AS之間需要考慮除網路特性以外的一些因素(政治、安全…),BGP(Border Gateway Protocol,邊界閘道器協議),BGP協議能夠找到一條到達目的比較好的路由,AS之間通過BGP發言人來進行路由資訊的交換。BGP發言人(speaker):BGP並不關心內部網路拓撲,AS之間通過BGP發言人交流資訊,BGP Speaker可以人為配置策略。
總結:網路層負責對子網間的資料包進行路由選擇。此外,網路層還可以實現擁塞控制、網際互連等功能;網路層的基本資料單位為IP資料報;包含的主要協議:IP協議(Internet Protocol,因特網互聯協議)、ICMP協議(Internet Control Message Protocol,因特網控制報文協議)、ARP協議(Address Resolution Protocol,地址解析協議)以及RARP協議(Reverse Address Resolution Protocol,逆地址解析協議)。網路層重要的裝置是路由器。常見的路由選擇協議有:RIP協議、OSPF協議。RIP協議 :底層是貝爾曼福特演算法,它選擇路由的度量標準(metric)是跳數,最大跳數是15跳,如果大於15跳,它就會丟棄資料包;OSPF協議 :Open Shortest Path First開放式最短路徑優先,底層是迪傑斯特拉演算法,是鏈路狀態路由選擇協議,它選擇路由的度量標準是頻寬,
4位版本 | 4位首部長度 | 8位服務型別(TOS) | 16位總長度(位元組) | ||||
16位標識 | 3位標誌 | 13位片偏移 | |||||
8位生存時間(TTL) | 8位協議 | 16位首部校驗和 | |||||
32位源IP地址 | |||||||
32位目的IP地址 | |||||||
選項options(若有) | |||||||
IP資料 |
8位型別 | 8位程式碼 | 16位校驗和 |
ICMP報文資料 |
ICMP報文種類 | 型別的值 | 報文型別 | 具體程式碼 |
差錯報告報文 | 3(終點不可達) | 網路不可達 | 0 |
主機不可達 | 1 | ||
5(重定向) | 對網路重定向 | 0 | |
對主機重定向 | 1 | ||
11 | 傳輸超時 | - | |
12 | 壞的IP頭 | 0 | |
缺少其他必要引數 | 1 | ||
詢問報文 | 0或8 | 回送(Echo)請求或應答 | - |
13或14 | 時間戳(Timestamp)請求或應答 | - |