在層次結構這章中,我們了解到網(wǎng)絡層主要負責的功能是數(shù)據(jù)路由,就是決定數(shù)據(jù)在網(wǎng)絡中傳輸?shù)穆窂?/strong>。
IP協(xié)議
IP協(xié)議解決了在虛擬網(wǎng)絡中數(shù)據(jù)報傳輸路徑的問題。
虛擬互聯(lián)網(wǎng)絡
實際的計算機網(wǎng)絡是錯綜復雜的,物理設備通過使用IP協(xié)議,屏蔽了物理網(wǎng)絡之間的差異 。
當網(wǎng)絡中的主機使用IP協(xié)議連接時,則無需關注網(wǎng)絡細節(jié)。
回到上一章內容,假設主機A要跨設備傳輸?shù)街鳈CE,此時將BCD看成一個虛擬的互聯(lián)網(wǎng)絡,此時A和E都和這個虛擬互聯(lián)網(wǎng)絡相連,此時的數(shù)據(jù)傳輸又符合數(shù)據(jù)鏈路層的以太網(wǎng)傳輸協(xié)議了。
MAC地址是48位的,使用十六進制表示。
eg:30-B4-9E-ED-85-CA ==> 00110000-10110100-10011111-11111110-10000101-11001010
IP地址是32位的,使用點分十進制表示。
eg:192.168.11.11 ==> 11000000.10101000.00001011.00001011
MAC地址唯一標示了物理設備,是不可改變的。
IP地址則是在網(wǎng)絡中唯一標識網(wǎng)絡設備,但IP地址是可以被重新分配的。
IP數(shù)據(jù)報
在前面兩章我們了解到,物理層負責傳輸01比特流,到了數(shù)據(jù)鏈路層后傳輸?shù)氖菙?shù)據(jù)幀。

而幀數(shù)據(jù)結構的定義則是IP數(shù)據(jù)報,其結構如下。

IP首部的詳細結構如下圖。

版本:占4位,指的是IP協(xié)議的 版本,通信雙方的版本必須一 致,當前主流版本是4,即IPv4, 也有IPv6。
首部位長度:占4位,最大數(shù)值 為15,表示的是IP首部長度, 單位是“32位字”(4個字節(jié)), 也即是IP首部最大長度為60字節(jié)。
總長度:占16位,最大數(shù)值為 65535 (MTU),表示的是IP數(shù)據(jù)報總長 度(IP首部+IP數(shù)據(jù))。
標識:16位。IP軟件在存儲器中維持一個計數(shù)器,每產(chǎn)生一個數(shù)據(jù)報,計數(shù)器就加1,并將此值賦給標識字段。但這個“標識”并不是序號,因為IP是無連接服務,數(shù)據(jù)報不存在按序接收的問題。當數(shù)據(jù)報由于長度超過網(wǎng)絡的MTU而必須分片時,這個標識字段的值就被復制到所有的數(shù)據(jù)報的標識字段中。相同的標識字段的值使分片后的各數(shù)據(jù)報片最后能正確地重裝成為原來的數(shù)據(jù)報。
標志:占3位,但只有2位有意義。表示數(shù)據(jù)報能否分片。
片偏移:占13位。片偏移指出:較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對用戶數(shù)據(jù)字段的起點,該片從何處開始。片偏移以8個字節(jié)為偏移單位。這就是說,除了最后一個分片,每個分片的長度一定是8字節(jié)(64位)的整數(shù)倍。
TTL:占8位,表明IP數(shù)據(jù)報文 在網(wǎng)絡中的壽命,每經(jīng)過一個 設備,TTL減1,當TTL=0時, 網(wǎng)絡設備必須丟棄該報文。
協(xié)議:占8位,表明IP數(shù)據(jù)所攜 帶的具體數(shù)據(jù)是什么協(xié)議的 (如:TCP、UDP等)。
首部校驗和:占16位,校驗IP 首部是否有出錯。
源IP地址:發(fā)送方IP地址。
目的IP地址:接收方IP地址。
一些協(xié)議碼
| 協(xié)議名 | ICMP | IGMP | IP | TCP | UDP | OSPF |
|---|---|---|---|---|---|---|
| 字段值 | 1 | 2 | 4 | 6 | 17 | 89 |
IP協(xié)議工作過程
IP報文傳輸采用的是逐跳(hop-by-hop)轉發(fā),即IP報文在數(shù)據(jù)鏈路中是一步步逐級跳到下一個物理設備直到目的設備為止。
IP路由表
在數(shù)據(jù)鏈路層可知其維護了一個MAC地址表,而網(wǎng)絡層則維護了一個IP路由表。
MAC地址表由MAC地址和硬件接口組成,IP路由表則由目的IP地址和當前設備下一跳IP地址組成。
計算機和路由器都擁有路由表。
轉發(fā)流程
以下圖所示為例。

從網(wǎng)絡層開始數(shù)據(jù)傳輸?shù)倪^程。
簡易版:
A發(fā)出目的地為C的IP數(shù)據(jù)報,查詢路由表發(fā)現(xiàn)下一跳為E,A將數(shù)據(jù)報發(fā)送給E。
E查詢路由表發(fā)現(xiàn)下一跳為F,將數(shù)據(jù)報發(fā)送給F。
F查詢路由表發(fā)現(xiàn)目的地C直接連接,將數(shù)據(jù)報發(fā)送給C。
詳細版:
A發(fā)出目的地為C的IP數(shù)據(jù)報,查詢路由表發(fā)現(xiàn)下一跳為E,
A將IP數(shù)據(jù)報交給數(shù)據(jù)鏈路層,并告知目的MAC地址是E,
數(shù)據(jù)鏈路層填充源MAC地址A和目的MAC地址E
數(shù)據(jù)鏈路層通過物理層將數(shù)據(jù)發(fā)送給E
E的數(shù)據(jù)鏈路層接收到數(shù)據(jù)幀,把幀數(shù)據(jù)交給網(wǎng)絡層
E查詢路由表,發(fā)現(xiàn)下一跳為F
E把數(shù)據(jù)報交給數(shù)據(jù)鏈路層,并告知目的MAC地址為F
E的數(shù)據(jù)鏈路層封裝數(shù)據(jù)幀并發(fā)送
F的數(shù)據(jù)鏈路層接收到數(shù)據(jù)幀,把幀數(shù)據(jù)交給網(wǎng)絡層
F查詢路由表,發(fā)現(xiàn)下一跳為C
F把數(shù)據(jù)報交給數(shù)據(jù)鏈路層,并告知目的MAC地址為C
F的數(shù)據(jù)鏈路層封裝數(shù)據(jù)幀并發(fā)送
數(shù)據(jù)鏈路層擁有了在相鄰兩個節(jié)點傳輸數(shù)據(jù)得能力,網(wǎng)絡層則借助路由表的機制,利用數(shù)據(jù)鏈路層的傳輸能力逐級的傳輸數(shù)據(jù)。
IP地址的子網(wǎng)劃分
IP地址是32位的,常分成4個8位,使用點分十進制表示。
分類的IP地址
將32位的IP地址劃分成2部分:網(wǎng)絡號和主機號。32位的IP地址分為4個8位,根據(jù)網(wǎng)絡號位1個8位、2個8位以及3個8位來將IP地址分類成A、B、C三類地址。

一些特殊的主機號
主機號全0(eg: 1.0.0.0)表示當前網(wǎng)絡段,不可分配為特定主機
主機號為全1(eg: 1.255.255.255)表示廣播地址,向當前網(wǎng)絡段所有主機發(fā)消息
A類地址網(wǎng)絡段全0(00000000)表示特殊網(wǎng)絡
A類地址網(wǎng)絡段后7位全1(eg:01111111 = 127)表示回環(huán)地址
B類地址網(wǎng)絡段(10000000.00000000 = 128.0)是不可使用的
C類地址網(wǎng)絡段(192.0.0)是不可使用的
127.0.0.1,通常被稱為本地回環(huán)地址(Loopback Address),不屬于任何 一個有類別地址類。它代表設備的本地虛擬接口,所以默認被看作是永遠 不會宕掉的接口。在Windows操作系統(tǒng)中也有相似的定義,所以通常在 安裝網(wǎng)卡前就可以ping通這個本地回環(huán)地址。一般都會用來檢查本地網(wǎng)絡 協(xié)議、基本數(shù)據(jù)接口等是否正常的。
排除特殊IP地址后的子網(wǎng)劃分

子網(wǎng)掩碼
通過上面的子網(wǎng)劃分后,再加上去除一些特殊IP地址,很難一下子判斷出當前IP屬于哪一類IP地址,于是提出了子網(wǎng)掩碼的概念。
子網(wǎng)掩碼和IP地址一樣都是32位,子網(wǎng)掩碼由連續(xù)的1和連續(xù)的0組成。某一個子網(wǎng)的子網(wǎng)掩碼具備網(wǎng)絡號位數(shù)個連續(xù)的1,和主機號位數(shù)i數(shù)連續(xù)的0。
例如A類地址擁有8位網(wǎng)絡號和24位主機號,那么A類地址的子網(wǎng)掩碼即為8個1和24個0組成,即255.0.0。
同理可得B類地址的子網(wǎng)掩碼為255.255.0,C類為255.255.255.0。
無分類編址CIDR
CIDR由網(wǎng)絡前綴和主機號組成,其中網(wǎng)絡前綴是任意位數(shù)的。

CIDR中沒有A、B、C類網(wǎng)絡號、和子網(wǎng)劃分的概念,CIDR將網(wǎng)絡前綴相同的IP地址稱為一個CIDR地址塊。
使用斜線記法來標識CIDR地址
例如193.10.10.129/25,標識這32位的地址,其中有25位為網(wǎng)絡號。
ARP與RARP協(xié)議
(R)ARP協(xié)議是TCP/IP協(xié)議棧里面基礎的協(xié)議,主要用于協(xié)調網(wǎng)絡層和數(shù)據(jù)鏈路層。
根據(jù)數(shù)據(jù)鏈路層MAC地址表的知識可知:
當路由器的MAC地址表中沒有目的地址,此時路由器會將此MAC地址進行廣播(發(fā)送方A除外),接收局域網(wǎng)中與該路由其相連的其他設備的MAC地址并記錄。
根據(jù)上文網(wǎng)絡層IP路由表的知識可知:
A發(fā)出目的地為C的IP數(shù)據(jù)報,查詢路由表發(fā)現(xiàn)下一跳為E,
A將IP數(shù)據(jù)報交給數(shù)據(jù)鏈路層,并告知目的MAC地址是E,
數(shù)據(jù)鏈路層填充源MAC地址A和目的MAC地址E
數(shù)據(jù)鏈路層通過物理層將數(shù)據(jù)發(fā)送給E
結合這兩者可知,這些表都是根據(jù)MAC地址來的,那MAC地址和IP地址怎么轉換呢?
ARP: Address Resolution Protocol 地址解析協(xié)議
ARP協(xié)議的作用就是將網(wǎng)絡層的IP地址轉換為數(shù)據(jù)鏈路層的MAC地址。

ARP協(xié)議維護了一份ARP緩存,ARP緩存是個用來儲存IP地址和MAC地址的緩沖區(qū),其本質就是一個IP地址==>MAC地址的對應表,表中每一個條目分別記錄了網(wǎng)絡上其他主機的IP地址和對應的MAC地址。由前文的知識可知,MAC地址是永久不變的,但IP地址是可變,所以ARP緩存記錄是有期限的。
工作過程(參考百度百科):
主機A的IP地址為192.168.1.1,MAC地址為0A-11-22-33-44-01;
主機B的IP地址為192.168.1.2,MAC地址為0A-11-22-33-44-02;
當主機A要與主機B通信時,地址解析協(xié)議可以將主機B的IP地址(192.168.1.2)解析成主機B的MAC地址,以下為工作流程:
第1步:根據(jù)主機A上的路由表內容,IP確定用于訪問主機B的轉發(fā)IP地址是192.168.1.2。然后A主機在自己的本地ARP緩存中檢查主機B的匹配MAC地址。
第2步:如果主機A在ARP緩存中沒有找到映射,它將詢問192.168.1.2的硬件地址,從而將ARP請求幀廣播到本地網(wǎng)絡上的所有主機。源主機A的IP地址和MAC地址都包括在ARP請求中。本地網(wǎng)絡上的每臺主機都接收到ARP請求并且檢查是否與自己的IP地址匹配。如果主機發(fā)現(xiàn)請求的IP地址與自己的IP地址不匹配,它將丟棄ARP請求。
第3步:主機B確定ARP請求中的IP地址與自己的IP地址匹配,則將主機A的IP地址和MAC地址映射添加到本地ARP緩存中。
第4步:主機B將包含其MAC地址的ARP回復消息直接發(fā)送回主機A。
第5步:當主機A收到從主機B發(fā)來的ARP回復消息時,會用主機B的IP和MAC地址映射更新ARP緩存。本機緩存是有生存期的,生存期結束后,將再次重復上面的過程。主機B的MAC地址一旦確定,主機A就能向主機B發(fā)送IP通信了。
數(shù)據(jù)格式
ARP數(shù)據(jù)報文是直接封裝在數(shù)據(jù)鏈路層的數(shù)據(jù)幀里的。

ARP數(shù)據(jù)報文格式如下:

其中28位的請求/應答報文具體如下:

PAD:填充數(shù)據(jù),以太網(wǎng)的幀最小為64位,不足的需要填充到64位。
RARP: Reverse Address Resolution Protocol 逆地址解析協(xié)議
ARP(地址解析協(xié)議)是設備通過自己知道的IP地址來獲得自己不知道的物理地址的協(xié)議,RARP以與ARP相反的方式工作。RARP發(fā)出要反向解析的物理地址并希望返回其對應的IP地址,應答包括由能夠提供所需信息的RARP服務器發(fā)出的IP地址。雖然發(fā)送方發(fā)出的是廣播信息,RARP規(guī)定只有RARP服務器能產(chǎn)生應答。許多網(wǎng)絡指定多個RARP服務器,這樣做既是為了平衡負載也是為了作為出現(xiàn)問題時的備份。(百度百科)
RARP數(shù)據(jù)報文格式如下:

工作原理:
- 發(fā)送主機發(fā)送一個本地的RARP廣播,在此廣播包中,聲明自己的MAC地址并且請求任何收到此請求的RARP服務器分配一個IP地址;
- 本地網(wǎng)段上的RARP服務器收到此請求后,檢查其RARP列表,查找該MAC地址對應的IP地址;
- 如果存在,RARP服務器就給源主機發(fā)送一個響應數(shù)據(jù)包并將此IP地址提供給對方主機使用;
- 如果不存在,RARP服務器對此不做任何的響應;
- 源主機收到從RARP服務器的響應信息,就利用得到的IP地址進行通訊;如果一直沒有收到RARP服務器的響應信息,表示初始化失敗。
NAT:Network Address Translation 網(wǎng)絡地址轉換
IPv4最多只有40+億個IP地址,隨著設備的增多,IP地址開始不夠用了。并且早期的IP規(guī)劃不合理,導致IP號的浪費。
這時引入了內網(wǎng)和外網(wǎng)的概念。
內網(wǎng)地址(局域網(wǎng)IP)是在內部機構使用的,需要避免和外網(wǎng)地址重復。外網(wǎng)地址(因特網(wǎng)IP)是在全球范圍內使用的,全球公網(wǎng)唯一。
三類內網(wǎng)地址
10.0.0.0~10.255.255.255(支持千萬數(shù)量級設備)
172.16.0.0~172.31.255.255(支持百萬數(shù)量級設備)
192.168.0.0~192.168.255.255(支持萬數(shù)量級設備)
內網(wǎng)中的眾多設備共同使用外網(wǎng)中的一個IP。內網(wǎng)多臺設備使用同一個IP請求外網(wǎng)服務,為了區(qū)分具體是哪一臺設備在請求,使用了NAT技術。NAT用于多臺主機通過一個共有IP訪問互聯(lián)網(wǎng)的私有網(wǎng)絡(內網(wǎng))中。
那么NAT是怎么解決這個問題的呢?
假設現(xiàn)在有兩臺局域網(wǎng)設備AB以及一臺路由器C,

NAT的作用就是將內網(wǎng)中的地址轉換為外網(wǎng)的地址。這一步是對程序員透明的,在路由器內部自動完成。

由數(shù)據(jù)鏈路層的知識可知,局域網(wǎng)中的主機在發(fā)送數(shù)據(jù)是,數(shù)據(jù)先會逐跳到路由器,此時路由器就會將局域網(wǎng)地址轉換為外網(wǎng)地址,再繼續(xù)逐跳。同理數(shù)據(jù)返回到路由器時,路由器將外網(wǎng)地址轉換為內網(wǎng)地址,再進行逐跳。
NAT技術的實現(xiàn)也是維護了一張NAT表,里面的數(shù)據(jù)是內網(wǎng)地址和外網(wǎng)地址的映射。雖然NAT減緩了IP地址的消耗,但是這種IP地址多級轉換增加了互聯(lián)網(wǎng)的復雜度。
ICMP Internet Control Message Protocol 網(wǎng)際控制報文協(xié)議
ICMP是TCP/IP協(xié)議簇的一個子協(xié)議,用于在IP主機、路由器之間傳遞控制消息??刂葡⑹侵妇W(wǎng)絡通不通、主機是否可達、路由是否可用等網(wǎng)絡本身的消息。
IP數(shù)據(jù)報是存儲在數(shù)據(jù)幀的幀數(shù)據(jù)中的,ICMP數(shù)據(jù)是存在IP數(shù)據(jù)報的數(shù)據(jù)中。ICMP由ICMP報文首部和ICMP報文數(shù)據(jù)兩部分組成。

ICMP的報文類型有兩種:差錯報告報文和詢問報文。
| ICMP報文種類 | 類型(8位) | 報文類型 | 代碼(8位) |
|---|---|---|---|
| 3(終點不可達) | 網(wǎng)絡不可達 | 0 | |
| 3 | 主機不可達 | 1 | |
| 差錯報告報文 | 5(重定向) | 對網(wǎng)絡重定向 | 0 |
| 5 | 對主機重定向 | 1 | |
| 11 | 傳輸超時 | - | |
| 12 | IP頭損壞 | 0 | |
| 12 | 缺少其他必要參數(shù) | 1 |
| ICMP報文種類 | 類型(8位) | 報文類型 | 代碼(8位) |
|---|---|---|---|
| 詢問報文 | 0或8 | 回送(Echo)請求或應答 | - |
| 13或14 | 時間戳(Timestamp)請求或應答 | - |
ICPM協(xié)議的應用
Ping命令
ping命令一般用于判斷網(wǎng)絡是否連通。
使用ping命令會發(fā)送一個ICMP的詢問報文,接著將該報文封裝成IP報文放到數(shù)據(jù)幀里,在數(shù)據(jù)鏈路層發(fā)送出去。

Traceroute
Traceroute可以探測IP數(shù)據(jù)報在網(wǎng)絡中走過的路徑。
由前文可知
IP數(shù)據(jù)報首部有占8位的生存時間TTL,表明IP數(shù)據(jù)報文 在網(wǎng)絡中的壽命,每經(jīng)過一個 設備,TTL減1,當TTL=0時, 網(wǎng)絡設備必須丟棄該報文。
網(wǎng)絡設備丟棄報文后,會發(fā)送ICMP終點不可達差錯報文。
Traceroute主要是利用了TTL和ICMP終點不可達報文,從TTL=1開始,每次將TTL加1,直到到達目的設備。通過這樣逐級收集信息,就獲得了IP報文的傳輸路徑。

網(wǎng)絡層的路由
通過上面的內容可知,網(wǎng)絡層維護了一張路由表,存放的是目的IP地址以及下一跳IP地址。
那么這個表示咋么來的呢?
要解決上面的問題,需要一個合適的算法。如下圖所示,我們以每個頂點表示一個計算機/路由器/網(wǎng)絡,以每條邊表示一條網(wǎng)絡路徑。

經(jīng)過這樣抽象之后,可見路由算法實際上可以抽象成圖論算法。但網(wǎng)絡環(huán)境復雜,路由算法比圖論算法要復雜一些。
自治系統(tǒng)
自治系統(tǒng):autonomous system。在互聯(lián)網(wǎng)中,一個自治系統(tǒng)(AS)是一個有權自主地決定在本系統(tǒng)中應采用何種路由協(xié)議的小型單位。
這是個抽象概念,自治系統(tǒng)的范圍可根據(jù)場景確定。例如一個路由器根與其相連的設備能組成AS,整個校園網(wǎng)也能組成AS。
AS內部的路由協(xié)議稱為內部網(wǎng)關協(xié)議(RIP、OSPF)
AS外部的路由協(xié)議稱為外部網(wǎng)關協(xié)議(BGP)
內部網(wǎng)關協(xié)議
RIP:Routing Information Protocol 路由信息協(xié)議
距離矢量(DV)算法
距離矢量算法其基本原理就是運用矢量疊加的方式獲取和計算路由信息。
具體算法過程略,自行百度。
RIP協(xié)議的過程
RIP協(xié)議把網(wǎng)絡的跳數(shù)(hop)作為DV算法的距離,它每隔30s交換一次路由信息。此外RIP協(xié)議約定跳數(shù)>15的路由則為不可達路由。
以下是RIP協(xié)議的簡略工作過程,若需詳細了解,請自行百度。
1. 路由器初始化路由信息
2. 對相鄰路由器X發(fā)過來的信息,對信息的內容進行修改(下一跳地址設置為X,所有距離加1)
i. 檢索本地路由,將信息中新的路由插入到路由表里面
ii. 檢索本地路由,對于下一跳為X的,更新為修改后的信息
iii. 檢索本地路由,對比相同目的的距離,如果新信息的距離更小,則更新本地路由表
3. 如果3分鐘沒有收到相鄰的路由信息,則把相鄰路由設置為不可達(16跳)
OSPF:Open Shortest Path First 開放式最短路徑優(yōu)先
OSPF的簡單說就是兩個相鄰的路由器通過發(fā)報文的形式成為鄰居關系,鄰居再相互發(fā)送鏈路狀態(tài)信息形成鄰接關系,之后各自根據(jù)最短路徑算法(Dijkstra算法)算出路由,放在OSPF路由表,OSPF路由與其他路由比較后優(yōu)的加入全局路由表。
RIP和OSPF對比

外部網(wǎng)關協(xié)議BGP
BGP(Border Gateway Protocol,邊界網(wǎng)關協(xié)議,BGP用于在不同的自治系統(tǒng)(AS)之間交換路由信息。當兩個AS需要交換路由信息時,每個AS都必須指定一個運行BGP的節(jié)點,來代表AS與其他的AS交換路由信息。這個節(jié)點可以是一個主機。但通常是路由器來執(zhí)行BGP。兩個AS中利用BGP交換信息的路由器也被稱為邊界網(wǎng)關(Border Gateway)或邊界路由器(Border Router)。