嵌入式Linux網(wǎng)絡(luò)編程,終于有人將網(wǎng)絡(luò)的七層講清楚了
本文主要給大家分享網(wǎng)絡(luò)七層概念之網(wǎng)絡(luò)層,后續(xù)章節(jié)會跟大家講述物理層、鏈路層、傳輸層、應(yīng)用層等(難得的好文,建議先收藏!)
本文主要從以下幾個方面講解網(wǎng)絡(luò)層:
網(wǎng)際協(xié)議 IP
IP 地址
與 IP 配套幾個協(xié)議
網(wǎng)絡(luò)地址翻譯器(NAT)
地址解析協(xié)議(ARP)
反向地址轉(zhuǎn)換協(xié)議(RARP)
因特網(wǎng)控制消息協(xié)議(ICMP)
IGMP
IP 數(shù)據(jù)報的格式
IP 數(shù)據(jù)報首部的固定部分中的各字段
IP 數(shù)據(jù)報首部的可變部分
IP 層轉(zhuǎn)發(fā)分組的流程
路由表
默認(rèn)路由(default route)
路由表查找
網(wǎng)絡(luò)層是OSI參考模型中的第三層,介于運輸層和數(shù)據(jù)鏈路層之間,它在數(shù)據(jù)鏈路層提供的兩個相鄰端點之間的數(shù)據(jù)幀的傳送功能上,進(jìn)一步管理網(wǎng)絡(luò)中的數(shù)據(jù)通信,將數(shù)據(jù)設(shè)法從源端經(jīng)過若直干個中間節(jié)點傳送到目的端,從而向運輸層提供最基本的端到端的數(shù)據(jù)傳送服務(wù)。主要內(nèi)容有:虛電路分組交換和數(shù)據(jù)報分組交換、路由選擇算法、阻塞控制方法、X.25協(xié)議、綜合業(yè)務(wù)數(shù)據(jù)網(wǎng)(ISDN)、異步傳輸模式(ATM)及網(wǎng)際互連原理與實現(xiàn)。
IP是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳。IP提供不可靠、無連接的數(shù)據(jù)報傳送服務(wù)。不可靠( unreliable)的意思是它不能保證I P數(shù)據(jù)報能成功地到達(dá)目的地。I P僅提供最好的傳輸服務(wù)。任何要求的可靠性必須由上層來提供(如TCP)。
無連接(connectionless)這個術(shù)語的意思是I P并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)報的狀態(tài)信息。每個數(shù)據(jù)報的處理是相互獨立的。這也說明, I P數(shù)據(jù)報可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數(shù)據(jù)報(先是A,然后是B),每個數(shù)據(jù)報都是獨立地進(jìn)行路由選擇,可能選擇不同的路線,因此B可能在A到達(dá)之前先到達(dá)。
1.1 網(wǎng)際協(xié)議 IP
IP是英文Internet Protocol(網(wǎng)絡(luò)之間互連的協(xié)議)的縮寫,中文簡稱為“網(wǎng)協(xié)”,也就是為計算機網(wǎng)絡(luò)相互連接進(jìn)行通信而設(shè)計的協(xié)議。在因特網(wǎng)中,它是能使連接到網(wǎng)上的所有計算機網(wǎng)絡(luò)實現(xiàn)相互通信的一套規(guī)則,規(guī)定了計算機在因特網(wǎng)上進(jìn)行通信時應(yīng)當(dāng)遵守的規(guī)則。任何廠家生產(chǎn)的計算機系統(tǒng),只要遵守 IP協(xié)議就可以與因特網(wǎng)互連互通。
各個廠家生產(chǎn)的網(wǎng)絡(luò)系統(tǒng)和設(shè)備,如以太網(wǎng)、分組交換網(wǎng)等,它們相互之間不能互通,不能互通的主要原因是因為它們所傳送數(shù)據(jù)的基本單元(技術(shù)上稱之為“幀”)的格式不同。IP協(xié)議實際上是一套由軟件程序組成的協(xié)議軟件,它把各種不同“幀”統(tǒng)一轉(zhuǎn)換成(NNT流量)或者“IP數(shù)據(jù)包”格式,這種轉(zhuǎn)換是因特網(wǎng)的一個最重要的特點,使所有各種計算機都能在因特網(wǎng)上實現(xiàn)互通,即具有“開放性”的特點。
數(shù)據(jù)包也是分組交換的一種形式,就是把所傳送的數(shù)據(jù)分段打成 “包”,再傳送出去。但是,與傳統(tǒng)的“連接型”分組交換不同,它屬于“無連接型”,是把打成的每個“包”(分組)都作為一個“獨立的報文”傳送出去,所以叫做“數(shù)據(jù)包”。這樣,在開始通信之前就不需要先連接好一條電路,各個數(shù)據(jù)包不一定都通過同一條路徑傳輸,所以叫做“無連接型”。這一特點非常重要,它大大提高了網(wǎng)絡(luò)的堅固性和安全性。
每個數(shù)據(jù)包都有報頭和報文這兩個部分,報頭中有目的地址等必要內(nèi)容,使每個數(shù)據(jù)包不經(jīng)過同樣的路徑都能準(zhǔn)確地到達(dá)目的地。在目的地重新組合還原成原來發(fā)送的數(shù)據(jù)。這就要IP具有分組打包和集合組裝的功能。
在實際傳送過程中,數(shù)據(jù)包還要能根據(jù)所經(jīng)過網(wǎng)絡(luò)規(guī)定的分組大小來改變數(shù)據(jù)包的長度,IP數(shù)據(jù)包的最大長度可達(dá) 65535個字節(jié)。
網(wǎng)絡(luò)互相連接起來要使用一些中間設(shè)備
• 中間設(shè)備又稱為中間系統(tǒng)或中繼(relay)系統(tǒng)。
• 物理層中繼系統(tǒng):轉(zhuǎn)發(fā)器(repeater)。
• 數(shù)據(jù)鏈路層中繼系統(tǒng):網(wǎng)橋或橋接器(bridge)。
• 網(wǎng)絡(luò)層中繼系統(tǒng):路由器(router)
• 網(wǎng)橋和路由器的混合物:橋路器(brouter)。
• 網(wǎng)絡(luò)層以上的中繼系統(tǒng):網(wǎng)關(guān)(gateway)。
網(wǎng)絡(luò)互連使用路由器:
• 當(dāng)中繼系統(tǒng)是轉(zhuǎn)發(fā)器或網(wǎng)橋時,一般并不稱之為網(wǎng)絡(luò)互連,因為這僅僅是把一個網(wǎng)絡(luò)擴(kuò)大了,而這仍然是一個網(wǎng)絡(luò)。
• 網(wǎng)關(guān)由于比較復(fù)雜,目前使用得較少。
• 互聯(lián)網(wǎng)都是指用路由器進(jìn)行互連的網(wǎng)絡(luò)。
• 由于歷史的原因,許多有關(guān) TCP/IP 的文獻(xiàn)將網(wǎng)絡(luò)層使用的路由器稱為網(wǎng)關(guān)。
分組在互聯(lián)網(wǎng)中的傳送


1.2 P IP 地址
所謂IP地址就是給每個連接在Internet上的主機分配的一個32bit地址。按照TCP/IP協(xié)議規(guī)定,IP地址用二進(jìn)制來表示,每個IP地址長32bit,比特?fù)Q算成字節(jié),就是4個字節(jié)。例如一個采用二進(jìn)制形式的IP地址是“00001010000000000000000000000001”,這么長的地址,人們處理起來也太費勁了。為了方便人們的使用,IP地址經(jīng)常被寫成十進(jìn)制的形式,中間使用符號“.”分開不同的字節(jié)。于是,上面的IP地址可以表示為“10.0.0.1”。IP地址的這種表示法叫做“點分十進(jìn)制表示法”,這顯然比1和0容易記憶得多。
IP 地址及其分類原則
IP地址是一種層次地址,通用格式為:M——類的等級號,NET——網(wǎng)絡(luò)號,HOST——主機號。按照類的等級號,IP地址分為五類:A、B、C、D、E。如下圖所示,網(wǎng)絡(luò)號和主機號隨不同等級在32位中占有的位數(shù)不同。


網(wǎng)絡(luò)地址的最高位必須是“110”。C類IP地址中網(wǎng)絡(luò)的標(biāo)識長度為24位,主機標(biāo)識的長度為8位,C類網(wǎng)絡(luò)地址數(shù)量較多,適用于小規(guī)模的局域網(wǎng)絡(luò),每個網(wǎng)絡(luò)最多只能包含254臺計算機。
C類IP地址范圍192.0.1.1-223.255.254.254(二進(jìn)制表示為: 11000000 00000000 0000000100000001 - 11011111 11111111 11111110 11111110)。
C類IP地址的子網(wǎng)掩碼為255.255.255.0,每個網(wǎng)絡(luò)支持的最大主機數(shù)為256-2=254臺
特殊地址
除了以上三種類型的IP地址外,還有幾種特殊類型的IP地址,TCP/IP協(xié)議規(guī)定,凡IP地址中的第一個字節(jié)以“lll0”開始的地址都叫多點廣播地址。因此,任何第一個字節(jié)大于223小于240的IP地址是多點廣播地址;IP地址中的每一個字節(jié)都為0的地址(“0.0.0.0”)對應(yīng)于當(dāng)前主機;IP地址中的每一個字節(jié)都為1的IP地址(“255.255.255.255”)是當(dāng)前子網(wǎng)的廣播地址;IP地址中凡是以“llll0”的地址都留著將來作為特殊用途使用;IP地址中不能以十進(jìn)制“127”作為開頭,該類地址中數(shù)字127.0.0.1到127.1.1.1用于回路測試,如:127.0.0.1可以代表本機IP地址,用“http://127.0.0.1”就可以測試本機中配置的Web服務(wù)器。網(wǎng)絡(luò)ID的第一個6位組也不能全置為“0”,全“0”表示本地網(wǎng)絡(luò)。D類IP地址第一個字節(jié)以“1110”開始,它是一個專門保留的地址。它并不指向特定的網(wǎng)絡(luò),目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標(biāo)識共享同一協(xié)議的一組計算機。地址范圍224.0.0.1-239.255.255.254 。E類IP地址以“1111”開始,保留用于將來和實驗使用。
廣播地址,主機號全部是“1”的網(wǎng)絡(luò)地址用于廣播,必須知道信宿網(wǎng)絡(luò)的網(wǎng)絡(luò)號。
有限廣播地址,TCP/IP規(guī)定,32比特全為“1”的網(wǎng)間網(wǎng)地址用于本網(wǎng)廣播。
“0”類地址,TCP/IP規(guī)定,各位全為“0”的網(wǎng)絡(luò)號被解釋為“本”網(wǎng)絡(luò)。
“回送地址,A類網(wǎng)絡(luò)地址127是一個保留地址,用于網(wǎng)絡(luò)軟件的測試以及本地機進(jìn)程間通信,叫做回送地址。無論什么程序,一旦使用回送地址發(fā)送數(shù)據(jù),協(xié)議軟件立即返回之,不進(jìn)行任何網(wǎng)絡(luò)傳輸。 TCP/IP協(xié)議規(guī)定:含網(wǎng)絡(luò)號127的分組不能出現(xiàn)任何網(wǎng)絡(luò)上;主機和網(wǎng)關(guān)不能為該地址廣播任何尋徑信息。
私有網(wǎng)絡(luò)地址(保留地址)
A類地址:10.1.1.1-10.254.254.254
B類地址: 172.16.1.1-172.31.254.254
C類地址: 192.168.1.1-192.168.254.254
IP 地址的屏蔽碼
一般地,32位的IP地址分為兩部分,即網(wǎng)絡(luò)號和主機號,分別稱為IP地址的“網(wǎng)絡(luò)部分”和“主機部分”。子網(wǎng)掩碼用于將這兩個部分區(qū)分開來。
子網(wǎng)掩碼IP協(xié)議規(guī)定:每一個使用子網(wǎng)的網(wǎng)點都選擇一個32位的位模式,若模式中的某位置1,則對應(yīng)IP地址中的某位為網(wǎng)絡(luò)地址中的一位。若位模式中某位為0,則對應(yīng)IP地址中的某位為主機地址中的一位。
若將IP地址主機部分的各位均置為0,則稱為網(wǎng)絡(luò)地址(network address).另外在網(wǎng)絡(luò)地址后面追加了表示網(wǎng)絡(luò)地址長度的幾位數(shù)字,即在IP地址的后面劃一個斜杠”/”,在斜杠的后面寫上表示網(wǎng)絡(luò)地址部分位數(shù)的數(shù)字。
例子
IP地址是由“網(wǎng)絡(luò)地址”與“主機地址”所構(gòu)成的以IP地址為“192.168.10.68”,網(wǎng)絡(luò)地址為26位為例。
二進(jìn)制數(shù) 11000000.10101000.00001010.01000000 /26



互聯(lián)網(wǎng)中的 IP 地址


1.3 與 P IP 配套幾個協(xié)議
網(wǎng)際協(xié)議 IP 是 TCP/IP 體系中兩個最主要的協(xié)議之一。與 IP 協(xié)議配套使用的還有四個協(xié)議:
• 地址解析協(xié)議 ARP(Address Resolution Protocol)
• 逆地址解析協(xié)議 RARP(Reverse Address Resolution Protocol)
• 網(wǎng)際控制報文協(xié)議 ICMP(Internet Control Message Protocol)
• 網(wǎng)際組管理協(xié)議 IGMP(Internet Group Management Protocol)

1.3.1 網(wǎng)絡(luò)地址翻譯器( NAT )
這種技術(shù)是在局部地區(qū)網(wǎng)中,設(shè)定私有 IP 地址,當(dāng)與 Internet 連接的時候,再將其變換成全局IP 地址。并且,如果是能夠替換 TCP 或者 UDP 的端口號的網(wǎng)絡(luò)地址端口翻譯器(NAPT:Network Address Ports Translation),則使用一個全局 IP 地址就可以在多臺的主機之間進(jìn)行通信。


1.3.2 地址解析協(xié)議( ARP )
略。
1.3.3 反向地址轉(zhuǎn)換協(xié)議( RARP )
略。
1.3.4 因特網(wǎng)控制消息協(xié)議( ICMP)
ICMP是(Internet Control Message Protocol)Internet控制報文協(xié)議。它是TCP/IP協(xié)議族的一個子協(xié)議,用于在IP主機、路由器之間傳遞控制消息。控制消息是指網(wǎng)絡(luò)通不通、主機是否可達(dá)、路由是否可用等網(wǎng)絡(luò)本身的消息。這些控制消息雖然并不傳輸用戶數(shù)據(jù),但是對于用戶數(shù)據(jù)的傳遞起著重要的作用。
基本簡介
ICMP協(xié)議是一種面向連接的協(xié)議,用于傳輸出錯報告控制信息。它是一個非常重要的協(xié)議,它對于網(wǎng)絡(luò)安全具有極其重要的意義。
它是TCP/IP協(xié)議族的一個子協(xié)議,屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息等。當(dāng)遇到IP數(shù)據(jù)無法訪問目標(biāo)、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。

ICMP提供一致易懂的出錯報告信息。發(fā)送的出錯報文返回到發(fā)送原數(shù)據(jù)的設(shè)備,因為只有發(fā)送設(shè)備才是出錯報文的邏輯接受者。發(fā)送設(shè)備隨后可根據(jù)ICMP報文確定發(fā)生錯誤的類型,并確定如何才能更好地重發(fā)失敗的數(shù)據(jù)報。但是ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務(wù)由發(fā)送方完成。
我們在網(wǎng)絡(luò)中經(jīng)常會使用到ICMP協(xié)議,比如我們經(jīng)常使用的用于檢查網(wǎng)絡(luò)通不通的Ping命令(Linux和Windows中均有),這個“Ping”的過程實際上就是ICMP協(xié)議工作的過程。還有其他的網(wǎng)絡(luò)命令如跟蹤路由的Tracert命令也是基于ICMP協(xié)議的。
P ICMP 協(xié)定內(nèi)容
ICMP的全稱是 Internet Control Message Protocol 。從技術(shù)角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網(wǎng)路的連線狀況﹐也能確保連線的準(zhǔn)確性﹐其功能主要有:
• 偵測遠(yuǎn)端主機是否存在。
• 建立及維護(hù)路由資料。
• 重導(dǎo)資料傳送路徑。
• 資料流量控制。




類型字段為3,標(biāo)識這是一個ICMP 目標(biāo)不可達(dá)數(shù)據(jù)包。代碼字段的值進(jìn)一步說明了出錯的具體原因,其取值范圍為0-12。各值的含義如下表所示。

另外我們注意到ICMP 目標(biāo)不可達(dá)數(shù)據(jù)包中最后一個字段,該字段包含了出錯IP 數(shù)據(jù)包的lP頭部和IP 數(shù)據(jù)包數(shù)據(jù)部分的頭64 位。之所以要包含這個字段是為了能讓IP 數(shù)據(jù)包的發(fā)送者知道是哪個數(shù)據(jù)包出錯。
(3)源端關(guān)閉
路由器轉(zhuǎn)發(fā)IP 數(shù)據(jù)包時是僅僅根據(jù)單個數(shù)據(jù)包的信息進(jìn)行轉(zhuǎn)發(fā)的,因此它無法為某個數(shù)據(jù)包預(yù)留一定的資源。由于路由器的資源(內(nèi)存,計算時間等)是有限的,在網(wǎng)絡(luò)數(shù)據(jù)流量比較大時,路由器為了轉(zhuǎn)發(fā)數(shù)據(jù)包可能會耗盡其所有資源,這種情況稱為阻塞。出現(xiàn)阻塞就是路由器能力有限,無法轉(zhuǎn)發(fā)所有需要轉(zhuǎn)發(fā)的數(shù)據(jù)包。這時路由器會選擇丟棄一些數(shù)據(jù)包。但僅僅這樣做還是無法減輕網(wǎng)絡(luò)阻塞的情況,因為發(fā)送端在發(fā)出數(shù)據(jù)包后如果無法收到響應(yīng)往往會發(fā)送更多的數(shù)據(jù)包到網(wǎng)絡(luò)上,使得網(wǎng)絡(luò)更加擁擠,使網(wǎng)絡(luò)的阻塞更加嚴(yán)重。因此路由器在丟棄數(shù)據(jù)包時會發(fā)送一個信息到數(shù)據(jù)包的發(fā)送方,通知它網(wǎng)絡(luò)已阻塞,請緩發(fā)數(shù)據(jù)包。用來發(fā)送這個通知的就是ICMP 源端關(guān)閉數(shù)據(jù)包。該數(shù)據(jù)包格式如下圖所示。

(4)超時錯誤
在IP 數(shù)據(jù)包中有個TTL 字段。IP 數(shù)據(jù)包每被路由器轉(zhuǎn)發(fā)一次該字段的值就至少減l。當(dāng)該字段的值減少到0 時,路由器會將該數(shù)據(jù)包丟棄。但這種情況是很少發(fā)生的,因為IP 數(shù)據(jù)包都會將該字段的值設(shè)置的足夠大,使得該數(shù)據(jù)包被轉(zhuǎn)發(fā)到目標(biāo)主機時該字段的值仍然大于0。但有時也會發(fā)生這種清況,例如幾個路由器組成一個環(huán),而且路由器中的路由表有錯誤,這時在其中轉(zhuǎn)發(fā)的數(shù)據(jù)包可能一直在這個環(huán)中直到TTL 字段減為0。在將TTL 為0 的數(shù)據(jù)包丟棄之前,路由器需要通知數(shù)據(jù)包的源主機數(shù)據(jù)包轉(zhuǎn)發(fā)超時了。由于一個IP 數(shù)據(jù)包在轉(zhuǎn)發(fā)到目標(biāo)主機的過程中可能被分成了多個段,而這些分段是單獨路由的。因此很有可能一個IP 數(shù)據(jù)包的多個分段只有部分能到達(dá)目標(biāo)主機而其他的可能丟失了。目標(biāo)主機在對一個IP 數(shù)據(jù)包的多個分段進(jìn)行重組時,如果等待一定的時間后剩下的分段還沒有到達(dá),目標(biāo)主機就認(rèn)為這些分段不會到達(dá),并將已收到的分段丟棄。在丟棄這些分段之前,目標(biāo)主機會通知源主機IP 數(shù)據(jù)包的分段在進(jìn)行重組時超時了。
不管是上述兩種情況的哪一種,路由器和目標(biāo)主機都是通過向源主機發(fā)送一個ICMP 超時數(shù)據(jù)包來通知它的。該數(shù)據(jù)包的格式如下圖所示。


請求主機可以向路由器或者直接廣播該數(shù)據(jù)包,路由器會將網(wǎng)絡(luò)的子網(wǎng)掩碼通知給該主機。






































