![網(wǎng)絡(luò)協(xié)議第二講.ppt_第1頁](http://file1.renrendoc.com/fileroot2/2020-1/13/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee1.gif)
![網(wǎng)絡(luò)協(xié)議第二講.ppt_第2頁](http://file1.renrendoc.com/fileroot2/2020-1/13/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee2.gif)
![網(wǎng)絡(luò)協(xié)議第二講.ppt_第3頁](http://file1.renrendoc.com/fileroot2/2020-1/13/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee3.gif)
![網(wǎng)絡(luò)協(xié)議第二講.ppt_第4頁](http://file1.renrendoc.com/fileroot2/2020-1/13/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee4.gif)
![網(wǎng)絡(luò)協(xié)議第二講.ppt_第5頁](http://file1.renrendoc.com/fileroot2/2020-1/13/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee/87af5b02-98e8-4fab-b6a3-ecd26d8b6fee5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、網(wǎng)際協(xié)議與選路,第二講,第5章 IP:軟件總體結(jié)構(gòu) 第6章 IP:選路表與選路算法 第7章 IP:分片與重組,2020/7/24,第5章IP:軟件的總體結(jié)構(gòu),5.1 引言 本章所關(guān)心的是實現(xiàn)網(wǎng)際協(xié)議(IP)的軟件的組織結(jié)構(gòu)。IP提供的功能看似簡單,但它的紛繁難懂使軟件的實現(xiàn)過程變得復(fù)雜,而其精細微妙之處又使軟件很難做到準確無誤。在講解IP的過程中,為了不至于因突然涉及所有部分而使人無法接受,我們將具體實現(xiàn)方案分3章討論。本章給出了數(shù)據(jù)結(jié)構(gòu)并描述軟件的整體結(jié)構(gòu),還討論了IP軟件的理論性操作以及通過IP層的數(shù)據(jù)報流程。在稍后的章節(jié)中,還要詳述選路和差錯處理的細節(jié),展示IP軟件中的各段程序代碼是如何
2、使用這些數(shù)據(jù)結(jié)構(gòu)的。,2020/7/24,52 中心環(huán)節(jié),單從主機的角度來看,人們會很自然地將IP軟件分為兩個不同的部分考慮:一部分處理輸入,另一部分處理輸出。輸入部分使用IP首部中的PROTO字段來決定應(yīng)該由上層協(xié)議中的哪個模塊來接收傳入數(shù)據(jù)報。輸出部分使用一張本地選路表來選擇外發(fā)數(shù)據(jù)報要送往的下一跳。 它使得IP和上層協(xié)議軟件之間的溝通變得十分笨拙。另外,網(wǎng)關(guān)中的選路過程要比主機中的更復(fù)雜。由于一個網(wǎng)關(guān)必須將發(fā)送來的數(shù)據(jù)報繼續(xù)轉(zhuǎn)送到它的下一跳所以網(wǎng)關(guān)中的軟件都不能輕易地被劃分成輸入和輸出部分。這樣,在IP處理傳入數(shù)據(jù)報時可能會產(chǎn)生輸出數(shù)據(jù)。而當(dāng)發(fā)送來的數(shù)據(jù)報引起錯誤時,網(wǎng)關(guān)還必須生成ICM
3、P差錯信息,這更進一步地使輸入和輸出的界限模糊。,2020/7/24,53 lP軟件設(shè)計思想,為保持IP軟件的簡單性和統(tǒng)一性,在范例中采用的組織結(jié)構(gòu)上的技巧有: 統(tǒng)一的輸入隊列及統(tǒng)一的選路過程。 獨立的IP進程。 本地主機接口。 雖然建立網(wǎng)關(guān)的必要性引發(fā)了許多的設(shè)計思想,但針對網(wǎng)關(guān)的設(shè)計在主機上同樣有效,并允許在主機和網(wǎng)關(guān)上使用同樣的程序。,2020/7/24,54 IP軟件結(jié)構(gòu)和數(shù)據(jù)報流程,541 選擇傳入數(shù)據(jù)報的策略 在第3章中曾提到過,每個網(wǎng)絡(luò)接口,包括偽網(wǎng)絡(luò)接口,都有屬于自己的、送往IP進程的數(shù)據(jù)報隊列:圖51描畫出該數(shù)據(jù)流。 如果有多個數(shù)據(jù)報正在輸入隊列中等待,IP進程必須選取其中之
4、一,并為其選擇路由。IP選取哪一個數(shù)據(jù)報將決定系統(tǒng)的行為: 挑選數(shù)據(jù)報并為其選擇路由的IP程序段實現(xiàn)了一個重要策略;它決定了數(shù)據(jù)報來源的相對優(yōu)先級。,2020/7/24,541 選擇傳入數(shù)據(jù)報的策略,正確的做法是公平分配優(yōu)先權(quán),使傳入和外發(fā)數(shù)據(jù)流在選擇路由時享有平等的優(yōu)先權(quán)。我們的實現(xiàn)策略是以循環(huán)法(round-robin)來選擇數(shù)據(jù)報,以期達到公平合理。也就是說,它從某個隊列中選擇出一個數(shù)據(jù)報,并為其做路由處理之后,繼續(xù)向前移動并檢查下一個隊列。如果有K個含有數(shù)據(jù)報的隊列正在等待著路由處理,那么IP在處理完所有K個隊列中的第一個數(shù)據(jù)報之后,才有可能處理到任一隊列中的第二個數(shù)據(jù)報。 過程ipg
5、etp實現(xiàn)了循環(huán)法選擇的策略,2020/7/24,541 選擇傳入數(shù)據(jù)報的策略,正如程序代碼所示,靜態(tài)變量ifnext用作接口數(shù)組的索引。它遍歷整個網(wǎng)絡(luò)接口結(jié)構(gòu)。在每個接口中,它檢查狀態(tài)變量ni_state,以確定接口是否已被打開。當(dāng)ipgetp發(fā)現(xiàn)一個打開的接口中有正在等待的數(shù)據(jù)報時,它就使用宏NIGET來提取并返回第一個數(shù)據(jù)報。再次調(diào)用ipgetp時將跨過前一次處理的接口,繼續(xù)查找:,2020/7/24,542 允許IP進程被阻塞,過程ipgetp包含了一種微妙的優(yōu)化思想: 如果所有輸入隊列都空,IP進程在調(diào)用過程ipgetp時被阻塞。一旦有一個數(shù)據(jù)報到達,IP進程就恢復(fù)執(zhí)行并立刻檢查已有
6、數(shù)據(jù)報到達的那個接口。 首先,當(dāng)與某個特定接口相關(guān)聯(lián)的設(shè)備驅(qū)動程序在它的輸入隊列中放入一個數(shù)據(jù)報時就向IP進程發(fā)送一個報文。其次,ipgetp中的循環(huán)語句以調(diào)用receive結(jié)束,在ipgetp遍歷了所有網(wǎng)絡(luò)接口而沒有發(fā)現(xiàn)任何數(shù)據(jù)報之后,它調(diào)用receive,receive在信息到達之前為阻塞狀態(tài)。當(dāng)ipgetp返回時,它以函數(shù)值的形式向主調(diào)過程傳送一個報文。報文中包含了一個指針,指向已有數(shù)據(jù)報到達的接口。ipgetp將該接口指針賦值給ifnext,并重新開始遍歷,2020/7/24,542 允許IP進程被阻塞,既然已經(jīng)知道了IP所使用的選擇數(shù)據(jù)報的策略,那么來查看一下IP進程的結(jié)構(gòu);其基本算
7、法非常簡單。IP不斷地調(diào)用ipgetp來選擇一個數(shù)據(jù)報,接著調(diào)用一個過程來計算下一跳的地址,并將數(shù)據(jù)報置入與將要發(fā)送該數(shù)據(jù)報的網(wǎng)絡(luò)接口相關(guān)聯(lián)的隊列中。 盡管從概念上看似簡單,但許多細節(jié)問題使程序代碼復(fù)雜化。例如,如果數(shù)據(jù)報來自于某個網(wǎng)絡(luò),IP必須驗證此數(shù)據(jù)報的校驗和是否正確。如果選路表中沒有指定的目的站,IP必須生成一個ICMP“目的站不可達”報文。如果選路表指出該數(shù)據(jù)報應(yīng)當(dāng)被送往產(chǎn)生這個數(shù)據(jù)報的網(wǎng)絡(luò)中的某個目的站,IP必須生成一個ICMP“重定向”報文。最后,IP必須處理定向廣播這一特殊情況,此時IP向指定的網(wǎng)絡(luò)發(fā)送數(shù)據(jù)報的副本,并向網(wǎng)關(guān)自身的上層協(xié)議軟件也發(fā)送一份副本。IP進程從過程ipp
8、roc的執(zhí)行開始。,2020/7/24,543 IP使用的常量的定義,在文件ip.h中定義了IP軟件使用的符號常量。另外,它還用結(jié)構(gòu)IP定義了IP數(shù)據(jù)報的格式。,2020/7/24,544 校驗和的計算,ipproc利用過程cksum來計算或驗證數(shù)據(jù)報的首部校驗和。首部校驗和將首部視為16位整數(shù)的序列,并把校驗和定義為對首都中所有16位整數(shù)各求反碼,并將結(jié)果相加、再對求得的和計算一次二進制反碼。得到的和數(shù)及反碼定義為使用二進制反碼算法。 大多數(shù)設(shè)備使用二進制補碼算法,因此僅累加得出一個16位的校驗和并不能得到正確的結(jié)果。為了便于移植并避免以匯編語言編寫程序,過程cksum 使用了c語言編寫。在
9、范例中使用了32位(長整型)算法來累加得到一個和,然后通過向這個整數(shù)和中增加所有進位位的辦法,將結(jié)果折合成一個16位的值。最后,cksum返回結(jié)果的反碼。,2020/7/24,545 處理定向廣播,只要一個數(shù)據(jù)報發(fā)送到定向廣播地址,則在指定的目的網(wǎng)絡(luò)中的所有機器都必須接收到一份副本,關(guān)鍵是要記?。?定向廣播包括了目的網(wǎng)絡(luò)上的網(wǎng)關(guān)和主機,即便是負責(zé)在網(wǎng)絡(luò)上繼續(xù)向前發(fā)送該數(shù)據(jù)報的網(wǎng)關(guān)也不能例外。 然而,大多數(shù)網(wǎng)絡(luò)硬件不會將廣播分組的副本再次傳送回發(fā)出這個廣播的機器。如果一個網(wǎng)關(guān)需要一份廣播數(shù)據(jù)報的副本,那么軟件必須采取明確的措施,以保留一份副本。因此,如果一個網(wǎng)關(guān)接收到的數(shù)據(jù)報的目的地址是直接與這
10、個網(wǎng)關(guān)相連的某個網(wǎng)絡(luò)的定向廣播地址,那么這個網(wǎng)關(guān)必須做兩件事: (1)為本機的協(xié)議軟件復(fù)制一份數(shù)據(jù)報。 (2)在指定的網(wǎng)絡(luò)上廣播該數(shù)據(jù)報。,2020/7/24,545 處理定向廣播,ipproc為所有的數(shù)據(jù)報調(diào)用ipdbc,其中絕大多數(shù)并沒有指定要定向廣播。ipdbc一開始就檢查數(shù)據(jù)報來源,因為如果該數(shù)據(jù)報是由本地機器生成的,則不需要復(fù)制。然后ipdbc調(diào)用isbrc。將數(shù)據(jù)報的目的地址與這個網(wǎng)關(guān)直接相連接的所有網(wǎng)絡(luò)的定向廣播地址相比較,如果均不相同,則說明這是一個非廣播數(shù)據(jù)報,而非廣播數(shù)據(jù)報也不需要復(fù)制。在不需要復(fù)制的情況下,ipdbc不采取任何行動,直接返回。 ipproc將像平常那樣選擇
11、一個路由并繼續(xù)向前發(fā)送該數(shù)據(jù)報。 如果數(shù)據(jù)報的目的地址是某個直接與網(wǎng)關(guān)相連的網(wǎng)絡(luò)上的定向廣播地址,它必須被復(fù)制。其中一份副本送往本地機器軟件,另份以正常方式繼續(xù)轉(zhuǎn)發(fā)。為了復(fù)制數(shù)據(jù)報, ipdbc根據(jù)數(shù)據(jù)報的大小從標準網(wǎng)絡(luò)緩沖池或大緩沖池中分配一個緩沖區(qū)。如果緩沖區(qū)分配成功,ipdbc將數(shù)據(jù)報復(fù)制到新緩沖區(qū)中,并把新緩沖區(qū)放入輸出端口,此端口與發(fā)送數(shù)據(jù)報時經(jīng)過的網(wǎng)絡(luò)接口相關(guān)聯(lián)。當(dāng)ipdbc返回后,ipproc將副本原件通過偽網(wǎng)絡(luò)接口傳遞給本地機器。,2020/7/24,546 識別一個廣播地址,IP協(xié)議標準規(guī)定了三種類型的廣播地址:本地網(wǎng)絡(luò)廣播地址(全“1)、定向網(wǎng)絡(luò)廣播地址(主機地址段為全“1
12、”的A、B、C三級IP地址)以及一個子網(wǎng)廣播地址(主機地址段為全“1”的子網(wǎng)IP地址),遺憾的是,當(dāng)Berkeley將TCP/IP合并入BSD UNIX時,他們決定使用非標準廣播地址,有時稱為Berkeley廣播,這些廣播的格式在應(yīng)該是全“1”的地方使用了全“0”表示。 盡管BerkeIey格式的廣播地址肯定是非標準的,但許多從Berkeley程序代碼中衍生出來的商用體系已經(jīng)采納了這種格式。為了與廣泛使用的Berkeley規(guī)范兼容,我們的范例代碼接收使用全“0”或全“1”兩種格式的廣播。此程序代碼段包含在過程isbrc中。,2020/7/24,55 lP首部中的字節(jié)順序,為了使網(wǎng)際協(xié)議獨立于運
13、行它的機器,協(xié)議標準為首部中所有整型值規(guī)定了網(wǎng)絡(luò)字節(jié)順序在發(fā)送一個數(shù)據(jù)報之前,主機必須將所有整型值從本機字節(jié)順序轉(zhuǎn)換成標準網(wǎng)絡(luò)字節(jié)順序。而當(dāng)接收到一個數(shù)據(jù)報之后,主機必須將這些整型值從標準網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換成本機字節(jié)順序。 過程iph2net和iPnet2h執(zhí)行這一轉(zhuǎn)換任務(wù):ipnet2h在ipproc中被調(diào)用,而iph2net在ipfsend、ipproc和ipputp中被調(diào)用;實用程序使用函數(shù)net2hs(從網(wǎng)絡(luò)到主機短整型)和hs2net(從主機短整型到網(wǎng)絡(luò))為每個字段進行轉(zhuǎn)換。 為了優(yōu)化處理時間,在我們的程序代碼中,所有IP地址以網(wǎng)絡(luò)字節(jié)順序保存,并且不轉(zhuǎn)換協(xié)議首都中的地址字段。這樣,這
14、段程序代碼只需轉(zhuǎn)換不含IP地址的整型字段。,2020/7/24,56 向lP發(fā)送數(shù)據(jù)報,561 發(fā)送本地生成的數(shù)據(jù)報 給出一個本地生成的數(shù)據(jù)報和一個IP目的地址,過程ipsend填寫IP首部并將數(shù)據(jù)報放入本機接口的隊列中,IP進程將從這個隊列中取出并發(fā)送數(shù)據(jù)報。 ipsend填寫首部中的每個字段,包括指定的目的地址。為了保證每個外發(fā)數(shù)據(jù)報中標識字段都有唯一的值,ipsend將全局變量ipackid的值賦予該標識字段,然后遞增變量ipackid.ipsend完成填寫首部的任務(wù)之后,調(diào)用enq把數(shù)據(jù)報置入本地主機(偽網(wǎng)絡(luò))接口的隊列中。 注意,雖然網(wǎng)絡(luò)接口的ni_ipinq隊列在正常情況下包含的是
15、傳入數(shù)據(jù)報(也就是來自其他網(wǎng)點的數(shù)據(jù)報),但從應(yīng)用軟件的角度看,偽網(wǎng)絡(luò)接口的隊列中包含的是“外發(fā)”的數(shù)據(jù)報。最后,在IP進程因等待數(shù)據(jù)報的到達而處于阻塞狀態(tài)的情況下,ipsend調(diào)用send向IP進程發(fā)送一個報文。,2020/7/24,562 發(fā)送傳入數(shù)據(jù)報,當(dāng)一個經(jīng)由網(wǎng)絡(luò)發(fā)送來的數(shù)據(jù)報到達時,網(wǎng)絡(luò)接口層的設(shè)備驅(qū)動程序必須將其放置在適當(dāng)?shù)腎P隊列中。它調(diào)用ip-in完成這項工作。 給出個指向分組緩沖區(qū)的指針,ip-in調(diào)用enq將分組置入接口的隊列中。如果隊列已滿,ip-in遞增變量IplnDiscards的值,以記錄下這個隊列的溢出差錯,并丟棄分組。最后,在IP進程被阻塞并等待接收數(shù)據(jù)報的情
16、況下,ip-in向IP進程發(fā)送一個報文。,2020/7/24,57 表格的維護,IP軟件需要一個時鐘機制,用于維護網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu),包括IP選路表和分片重裝表。在我們的范例中,使用一個單一的定時器進程來完成這種周期性任務(wù)。事實上,定時器進程并不僅用于IP任務(wù)中,它還觸發(fā)ARP高速緩存的超時,并且可被用于其他任何沒有嚴格時延要求的長時間的周期性任務(wù)中。在過程slowtimer中的程序代碼段,體現(xiàn)了如何輕易地將新任務(wù)加入列表中。 正如程序代碼所示,slowtimer由個無限循環(huán)構(gòu)成,它重復(fù)不斷地喚醒一組維護過程。一個特定的維護過程可能花費相當(dāng)長的時間來完成它的任務(wù),而且一次喚醒與下一次喚醒之間的執(zhí)行時
17、間也可能不一樣長。因此slowtimer計算兩次執(zhí)行之間的實際時延,并將其作為參數(shù)遞給維護過程。,2020/7/24,5.8 小結(jié),為簡化程序代碼,IP作為唯一的、獨立的進程執(zhí)行,并通過一個偽網(wǎng)絡(luò)接口與本機的高層協(xié)議軟件交互作用。在沒有數(shù)據(jù)報時,IP進程被阻塞。一旦從任何地方發(fā)來一個或多個數(shù)據(jù)報后IP進程被喚醒,并處理這些數(shù)據(jù)報,直至為它們選擇路由為止。為了使處理過程公平合理,并避免出現(xiàn)“饑餓狀態(tài)”,我們在范例中對所有輸入數(shù)據(jù)源,包括對應(yīng)于本機的偽網(wǎng)絡(luò)接口,采用了循環(huán)法策略。這樣不論是本地產(chǎn)生的通信量,還是來自網(wǎng)絡(luò)連接的傳入通信量都沒有優(yōu)先權(quán)。,2020/7/24,5.8 小結(jié),定向廣播是指將
18、數(shù)據(jù)報發(fā)送到特定網(wǎng)絡(luò)的所有主機和網(wǎng)關(guān)上。協(xié)議標準允許設(shè)計者自己決定是否繼續(xù)向前傳送由其他網(wǎng)絡(luò)產(chǎn)生的定向廣播。如果網(wǎng)關(guān)選擇了允許定向廣播,它正常地為這些定向廣播選擇路由。如果目的地址給出了一個直接與網(wǎng)關(guān)相連的網(wǎng)絡(luò),IP必須保證本機的上層協(xié)議軟件接收到一份數(shù)據(jù)報的副本。為了提高它的實用性,在實現(xiàn)范例中,既可使用TCP/IP標準(全“1”)、也可使用BSD UNIX格式(全“0”)的廣播地址。它復(fù)制廣播數(shù)據(jù)報,并安排網(wǎng)絡(luò)接口發(fā)送副本、而原數(shù)據(jù)報經(jīng)過選路,被發(fā)往本機的協(xié)議軟件。 IP校驗和由16位二進制反碼組成,其值可用32位二進制補碼及進位傳遞來計算。,2020/7/24,第6章 IP:選路表和選路
19、算法,2020/7/24,6.1 引言,前章描述了網(wǎng)際協(xié)議(IP)軟件的總體結(jié)構(gòu),并提供了其關(guān)鍵過程ipproc的程序代碼。本章將提供選擇路由的細節(jié),繼續(xù)討論IP。本章詳細描述IP選路表的結(jié)構(gòu),以及實現(xiàn)選路表的數(shù)據(jù)結(jié)構(gòu),還討論了路由算法,并敘述了IP在選擇路由時如何使用子網(wǎng)掩碼。最后,它敘述了IP是如何區(qū)分網(wǎng)絡(luò)路由、子網(wǎng)路由以及主機路由的。,2020/7/24,62 路由維護和查找,選路軟件在理論上可劃分為兩組。其中一組由那些用來為數(shù)據(jù)報選擇正確路由的過程組成,另一組由增加、改變或刪除路由的過程組成。因為網(wǎng)關(guān)必須為自己所處理的每個數(shù)據(jù)報判定路由,所以路由查找程序代碼決定了網(wǎng)關(guān)的整體性能。因此,
20、通常將查找程序代碼優(yōu)化,以期達到最高速度。 路內(nèi)的插入、改變或刪除的速率通常比為數(shù)據(jù)報選擇路由的速率要低得多。計算新路由的程序需要與其他設(shè)備通信以建立其可達性。它們可以在重定向之前花任意長的時間。因此,路由更新過程不需要像查找操作那樣被優(yōu)化。其基本觀點是: 應(yīng)當(dāng)選擇能使查找路由花費最小的IP數(shù)據(jù)結(jié)構(gòu)和算法,維護路由的花費則并不那么重要,2020/7/24,62 路由維護和查找,雖然在早期的TCP/IP軟件中,選路表的查找經(jīng)常采用線性查找,但現(xiàn)在大多數(shù)系統(tǒng)利用張散列表,使之能夠快速查找任意大小的選路表。 我們的軟件采用了桶散列(bucket hashing)結(jié)構(gòu):它將選路表的入口劃分成許多“散列
21、表元”,并利用一個散列函數(shù)迅速找到正確的散列表元。,2020/7/24,63選路表結(jié)構(gòu),2020/7/24,63選路表結(jié)構(gòu),保存路由的主要數(shù)據(jù)結(jié)構(gòu)是數(shù)組。數(shù)組的每個元素對應(yīng)一個散列表元,并包含一個指針,指向被裝入這個散列表元中的通往目的站的路由記錄鏈表:表中每個記錄包含一個IP目的地址、子網(wǎng)掩碼、下跳地址、用于向下一跳地址發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)接口,以及其他在路由管理中使用的信息。由于IP預(yù)先并不知道子網(wǎng)掩碼,因此它僅使用IP目的地址的網(wǎng)絡(luò)部分計算散列函數(shù)。然而當(dāng)IP在一個鏈表中查找表項時,使用的是完整的目的地址來進行比較。,2020/7/24,64 選路表數(shù)據(jù)結(jié)構(gòu),除route結(jié)構(gòu)外,文件route
22、.h中還定義了選路表rttable,如圖6.1所示,rttable是指向route結(jié)構(gòu)的指針數(shù)組。 除選路表之外,IP還需要其他幾個數(shù)據(jù)項。它們保存在全局結(jié)構(gòu)rtinfo中。例如,系統(tǒng)提供唯一的“默認路由”,任何不在選路表中的目的站都可使用。字段ridefault指向一個route結(jié)構(gòu),在這個route結(jié)構(gòu)中包含的是默認路由的下一跳地址。在字段ri_valid中是一個布爾變量,如果此路由的數(shù)據(jù)結(jié)構(gòu)已被初始化,則它的值為TRUE。,2020/7/24,65 路由的生成源及保持時間,選路表中的信息有幾個來源。通常,當(dāng)系統(tǒng)啟動時,初始化程序從備份存儲器中獲得一組初始路由,并將它們安裝到選路表中。在執(zhí)
23、行過程中,傳入的報文會導(dǎo)致ICMP或選路協(xié)議軟件改變現(xiàn)有的路由或建立新路由。最后,網(wǎng)絡(luò)管理員也可以增加路由或重定向。 選路表項的易失性與它的來源有關(guān)。例如,初始路由被認為是簡單估計的,只要有其他地方發(fā)來的路由信息,它就應(yīng)該被替換。然而,網(wǎng)絡(luò)管理員必須能夠推翻任何路由并建立不可變的永久性路由,以使他們能夠排除網(wǎng)絡(luò)中的路由問題,而無需路由協(xié)議的干涉。 為了適應(yīng)路由的靈活性,每個選路表項中的rt_ttl(壽命)字段指出此表項還能保持多長時間有效,以秒為單位計算。當(dāng)rt_ttl值達到0時,路由失效并被丟棄。由選路協(xié)議建立的路由,其壽命根據(jù)協(xié)議規(guī)則計算得到,而管理員能夠建立壽命無限長的路由,以保證它們不
24、會被刪除。,2020/7/24,6.6 為數(shù)據(jù)報選擇路由,661 實用過程 一些實用過程提供了選擇路由時用到的功能。過程netnum利用地址類別確定在地址字段中哪些八位組包含的是網(wǎng)絡(luò)部分,哪些八位組是主機部分,從而提取出IP地址中的網(wǎng)絡(luò)部分。它返回給出的地址,但這時其主機地址字節(jié)為全“0”。,2020/7/24,661 實用過程,在為數(shù)據(jù)報選擇路由時,IP使用過程netmatch,將目的(主機)地址與選路表項中的地址進行比較,選路表項中包含了子網(wǎng)掩碼和給定網(wǎng)絡(luò)的IP地址。 netmatch使用子網(wǎng)掩碼來屏蔽目的地址中的主機位,并將結(jié)果與表項中的網(wǎng)絡(luò)地址相比較,如果它們相符,netmatch返回
25、TURE,否則返回FALSE。 廣播是一種特殊情況,因為要采取何種動作取決于數(shù)據(jù)報的來源。來自網(wǎng)絡(luò)接口的廣播數(shù)據(jù)報必須經(jīng)過偽網(wǎng)絡(luò)接口發(fā)送給本地機器,而本地生成的廣播數(shù)據(jù)報必須被發(fā)送到適當(dāng)?shù)木W(wǎng)絡(luò)接口;為了區(qū)分這兩種情況,軟件使用了個特定主機路由(全“1”的掩碼)為來自網(wǎng)絡(luò)的廣播數(shù)據(jù)報選擇路由,并用特定網(wǎng)絡(luò)路由(掩碼僅屏蔽網(wǎng)絡(luò)部分)為向外發(fā)送的廣播選擇路由。這樣netmatch明確地判定一個廣播數(shù)據(jù)報的來源,并使用IP源地址來決定此廣播是否與給定路由相符。,2020/7/24,661 實用過程,要為一個數(shù)據(jù)報選擇路由,IP必須光查看它是否認識該數(shù)據(jù)報目的地址的有效子網(wǎng)掩碼。要做到這一點,IP調(diào)用過
26、程netmask。 netmask把IP目的地址當(dāng)作參數(shù),然后檢查幾種情況。根據(jù)約定,如果目的地址為全“0”,則意味著使用默認路由,因此netmask返回全“0”的子網(wǎng)掩碼。對其他類型的目地站,netmask調(diào)用netnum從目的地址中提取出網(wǎng)絡(luò)部分,然后檢查每個與本機直接連接的網(wǎng)絡(luò)。如果有任何與本地直接連接的網(wǎng)絡(luò)地址與目的地址的網(wǎng)絡(luò)部分相符,netmask從和此網(wǎng)絡(luò)相關(guān)的網(wǎng)絡(luò)接口結(jié)構(gòu)中提取出子網(wǎng)掩碼,然后將其返回調(diào)用者。最后,如果IP找不到有關(guān)這個目的地址的子網(wǎng)掩碼的信息,它就根據(jù)地址的類別是A、B還是C來設(shè)置屏蔽地址網(wǎng)絡(luò)部分的子網(wǎng)掩碼。,2020/7/24,661 實用過程,選路函數(shù)調(diào)用實
27、用過程rthash計算目的地網(wǎng)絡(luò)地址的散列值。 散列函數(shù)是一個簡單有效的計算函數(shù)。對于A、B或C類的地址,rthash將網(wǎng)絡(luò)地址的每個八位組相加,所得的和除以散列表長度,最后返回余數(shù)。對于D類的地址,rthash將網(wǎng)絡(luò)地址的前4位比特數(shù)乘以16,所得的值除以散列表長度,最后返回余數(shù)。,2020/7/24,662 獲得一個路由,對每一個路由表項,rtget調(diào)用netmatch,檢查其入口參數(shù)給出的目的地址是否能與表項中的地址匹配。如果在查找中沒有發(fā)現(xiàn)精確的匹配,rtget使用Route,ri_valid中默認的路由。 當(dāng)然,也可能出現(xiàn)既沒有精確匹配,也沒有默認路由的情況。因此,當(dāng)完成路由查找工作
28、后,rtget還必須繼續(xù)檢查它找到的是否是一個有效指針。如果是有效指針,rtget在返回調(diào)用者之前,要給路由表項中的引用計數(shù)值和使用計數(shù)值字段加1。維護軟件利用引用計數(shù)字段來決定如果刪除與該路由相關(guān)的存儲區(qū)是否安全。只要調(diào)用rtget的過程還需要這個路由表項,該表項的引用計數(shù)值就不為0。使用計數(shù)字段提供了管理網(wǎng)絡(luò)的一種手段,用以掌握每個表項在數(shù)據(jù)報選擇路由時使用的頻繁程度。,2020/7/24,663數(shù)據(jù)結(jié)構(gòu)初始化,過程rtinit初始化選路表和默認路由,生成互斥信號量,為路由鏈表中的結(jié)點分配存儲區(qū)并將存儲區(qū)鏈接成一個空閑列表。其實現(xiàn)方案很簡單。,2020/7/24,67 選路表的定期維護,系
29、統(tǒng)定期發(fā)起清理選路表的行動,它遞減選路表中所有表項的壽命字段位,如果某個壽命字段超時,則丟棄對應(yīng)的路由:過程rttimer用來實現(xiàn)這項定期性的表項更新任務(wù): 定時進程大約每秒調(diào)用一次rttiemr,利用參數(shù)delta,提供上次調(diào)用與這次調(diào)用之間的間隔時間。在等待互斥信號量之后,rttiemr循環(huán)遍歷選路表。對每個表項來說,它遍歷并查看各個路由鏈表。對正常的路由、rttiemr遞減壽命字段計數(shù)值,如果計時值為0,從鏈表中刪除該結(jié)點。然而,如果網(wǎng)關(guān)運行RIP,則rttiemr將超時路由標記為費用無窮大,這樣它就無法將其作為數(shù)據(jù)報的有效路由,同時又使這些超時路由在表中短暫地保留一段時間。最后,rtt
30、iemr遞減默認路由中的壽命計數(shù)值。,2020/7/24,6.7.1 增加路由,網(wǎng)絡(luò)管理軟件和選路信息協(xié)議都可調(diào)用那些用來增加、刪除或重定向的函數(shù)。例如向表中增加一個新路由。 rtadd調(diào)用過程rtnew來分配一個新結(jié)點,并初始化它的各個字段。然后rtadd將默認路由當(dāng)作特殊情況對待。對于非默認的路由,rtadd利用rthash計算新路由在路由表中的索引值,并遍歷該表項中的路由鏈表。一旦它在鏈表中找到新路由應(yīng)該被插入的地方,就查看鏈表是否包含一個具有相同目的站的已有路由。如果有,rtadd比較舊路由和新路由的度量,是否新路由更好。如果不是,就丟棄新路由。最后,rtadd或者在鏈表中插入一個新結(jié)
31、點,或者將信息復(fù)制到具有同樣地址的已有結(jié)點中。 過程rtnew分配并初始化一個新路由表項。它調(diào)用getbuf來為新結(jié)點分配存儲區(qū),然后填寫首部信息。,2020/7/24,672 刪除路由,過程rtdel以一個目的地址作為入口參數(shù),并通過從選路表中移走結(jié)點來刪除路由。 象通常那樣,程序代碼查看并以特殊情況對待默認路由。如果沒有找到匹配表項,rtdel計算目的地址的散列值,并在路由鏈表中搜索。 一旦它找到正確的路由,rtdel將該結(jié)點從鏈表中刪除,并利用宏RTFREE來遞減引用計數(shù)值?;叵胍幌拢绻糜嫈?shù)值達到0,RTFREE就將該結(jié)點返回空閑結(jié)點表。如果引用計數(shù)值仍為正值,表示肯定還有其他一個
32、或幾個進程正在使用該結(jié)點。只有當(dāng)最后一個進程將引用計數(shù)值減至0時,此結(jié)點才被釋放回空閑結(jié)點表。 宏RTFREE假設(shè)正在執(zhí)行中的進程已經(jīng)獲得了單獨訪問選路表的權(quán)力,因此它可在諸如rtdel之類的過程中被使用。任意個需要遞減選路表中引用計數(shù)值的過程部可以調(diào)用過程rtfree。當(dāng)rtfree被喚醒后,首先它等待互斥信號量,然后喚醒宏RTFREE,最后釋放信號量。,2020/7/24,68 IP選項處理,IP支持一組選項,用來控制IP如何處理主機和網(wǎng)關(guān)中的數(shù)據(jù)報。為了使例程代碼簡潔易懂,我們決定忽略對選項的處理。雖然如此,我們還是在程序代碼中包括了兩個實例程序的框架,用于搜尋IP首部中的選項。網(wǎng)關(guān)調(diào)用
33、過程ipdoopts,它僅僅返回調(diào)用者,使得網(wǎng)關(guān)在發(fā)送數(shù)據(jù)報時,并沒有對選項做任何處理。 主機調(diào)用過程ipdstopts來處理到達主機的數(shù)據(jù)報的選項。雖然我們在過程中并沒有真正實現(xiàn)選項的處理,但它分析了IP首部中選項長度八位組的信息,并將選項字段從IP首部中刪除。,2020/7/24,6.9 小結(jié),IP選路表是一個至關(guān)重要的數(shù)據(jù)結(jié)構(gòu)。當(dāng)為數(shù)據(jù)報選擇路由時,IP進程利用該選路表,在表中查找指向數(shù)據(jù)報目的站的下一跳路由。由于路由查找的頻繁使用,因此選路表在其組織結(jié)構(gòu)上盡量考慮提高查找的效率。同時,掌握新的路由信息的高層協(xié)議軟件還要在選路表中插入、刪除或更改路由。 本章詳述了負責(zé)選路表的查找和維護的
34、過程。從中可了解到選路表怎樣利用桶散列結(jié)構(gòu)提高效率的,還可以了解到當(dāng)進程正在刪除路由時引用計數(shù)器怎樣允許另一進程繼續(xù)使用該路由。,2020/7/24,第7章 IP:分片與重組,2020/7/24,7.1 引言,本章詳述將外發(fā)數(shù)據(jù)報進行分片以及將傳入數(shù)據(jù)報進行重組的軟件。由于最終目的站需要把分片的數(shù)據(jù)報重新組裝起來,因此每個應(yīng)用TCPIP的計算機必須具有負責(zé)重組的程序代碼,否則,它就不能與互聯(lián)網(wǎng)上所有的計算機通信。 協(xié)議標準規(guī)定,任何實現(xiàn)IP的程序都必須能夠?qū)?shù)據(jù)報分片及重組。事實上,任何網(wǎng)關(guān)若連接兩個以上且具有不同MTU大小的網(wǎng)絡(luò),則經(jīng)常需要將數(shù)據(jù)報分片傳輸:由于設(shè)計良好的應(yīng)用軟件會主動生成足
35、夠小的、能夠直接通過網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)報,因此主機并不需要經(jīng)常執(zhí)行分片任務(wù).,2020/7/24,72 數(shù)據(jù)報的分片,數(shù)據(jù)報的分片發(fā)生在IP為數(shù)據(jù)報選擇路由之后,以及將其置入一個與指定的網(wǎng)絡(luò)接口相關(guān)聯(lián)的隊列之前的這段時間里。IP把數(shù)據(jù)報長度與網(wǎng)絡(luò)的MTU相比較,以確定是否有必要將其分片。在最簡單的情況下,整個數(shù)據(jù)報可以被封裝成個網(wǎng)絡(luò)分組或幀,因而無需分片。 對需要分片的情況,IP首先生成多個數(shù)據(jù)報,并將每個數(shù)據(jù)報中的分片比特置為1,然后將源數(shù)據(jù)報中的數(shù)據(jù)按順序分片,并將它們裝入這些數(shù)據(jù)報中。它還要在向一源數(shù)據(jù)報產(chǎn)生的所有數(shù)據(jù)報片中將MF比特置為1,末尾的分片除外。IP邊為數(shù)據(jù)報分片,一邊將它們傳遞
36、給網(wǎng)絡(luò)接口發(fā)送出去。,2020/7/24,7.2.1 為一個數(shù)據(jù)報片再次分片,如果被分片的數(shù)據(jù)報本身就是一個數(shù)據(jù)報片,分片處理會變得復(fù)雜一些。當(dāng)一個數(shù)據(jù)報通過兩個或更多的網(wǎng)關(guān)時,可能會出現(xiàn)這種情況。如果某一個網(wǎng)關(guān)為源數(shù)據(jù)報分片,分片后的數(shù)據(jù)報可能還是太大,以致無法通過沿途經(jīng)過的下個網(wǎng)絡(luò)。因此,個網(wǎng)關(guān)可能會接收到需要再次分片的數(shù)據(jù)報片。 為數(shù)據(jù)報分片和為數(shù)據(jù)報片再次分片之間的細微差別就在于網(wǎng)關(guān)處理MF比特的不同:當(dāng)一個網(wǎng)關(guān)為原來未分片的數(shù)據(jù)報分片時,除了末尾的數(shù)據(jù)報片,它將其余所有分片上的MF比特都置為1。類似地,如果一個數(shù)據(jù)報片上的MF比特并未置為1,則網(wǎng)關(guān)會和處理原來未分片的數(shù)據(jù)報完全一樣地
37、處理這個數(shù)據(jù)報片,除末尾的分片外,將每個子分片的MF比特置為1。然而,當(dāng)網(wǎng)關(guān)為一個非末尾的數(shù)據(jù)報片再次分片時,它會把生成的所有(子)分片中的MF比特全部置為1,因為所有這些子分片都不可能是整個數(shù)據(jù)報的末尾數(shù)據(jù)報片。,2020/7/24,73 分片的實現(xiàn),ipputp的入口參數(shù):接口號、下一跳以及一個分組。如果僅用一個分組無法發(fā)送該數(shù)據(jù)報,那么ipputp將數(shù)據(jù)報順序劃分為能夠裝入分組中的數(shù)據(jù)報片。為了做到這一點,ipputp計算分片的最大可能長度,然后將數(shù)據(jù)報順序劃分為一連串最大長度的數(shù)據(jù)報片,最后剩余的數(shù)據(jù)被裝入末尾數(shù)據(jù)報片。一旦ipputp計算出了最大分片長度,它遍歷整個數(shù)據(jù)報,并調(diào)用iP
38、fsend,發(fā)送每個數(shù)據(jù)報片。 在程序代碼中包含了幾個微妙的地方。 首先,每個數(shù)據(jù)報片必須含有一個IP首都,因此次可發(fā)送的最大數(shù)據(jù)量等于MTU減去IP首部的長度,然后截短成為最接近的8的倍數(shù)。 其次,僅當(dāng)數(shù)據(jù)報中剩余的數(shù)據(jù)大于一次可發(fā)送的最大數(shù)據(jù)量時,發(fā)送動作才會繼續(xù)進行。因此,在發(fā)送末尾數(shù)據(jù)報片之前,如果末尾數(shù)據(jù)報片的長度與其他數(shù)據(jù)報片的長度相同,則不會發(fā)送最后這個數(shù)據(jù)報片。 第三,發(fā)送末尾數(shù)據(jù)報片時,ipputp僅對源數(shù)據(jù)報做適當(dāng)更改,而不再把生成的數(shù)據(jù)報片復(fù)制到一個新緩沖區(qū)中。 第四,通常末尾數(shù)據(jù)報片中的MF比特值為0。然而,當(dāng)網(wǎng)關(guān)為一個非末尾的數(shù)據(jù)報片再次分片時,它必須設(shè)置所有子分片的
39、MF比特為1。,2020/7/24,731 發(fā)送一個數(shù)據(jù)報片,過程ipfsend生成并發(fā)送一個數(shù)據(jù)報片。它首先為副本數(shù)據(jù)分配一個新緩沖區(qū),調(diào)用ipfhcopy將IP首部和選項復(fù)制到新緩沖區(qū)中,形成新數(shù)據(jù)報,然后將作為此數(shù)據(jù)報片的數(shù)據(jù)復(fù)制到新數(shù)據(jù)報中,并將結(jié)果傳遞給netwrite。,2020/7/24,732 復(fù)制數(shù)據(jù)報首部,過程ipfhcopy用于復(fù)制數(shù)據(jù)報首部;大多數(shù)程序代碼要考慮到IP選項的細節(jié)。根據(jù)協(xié)議標準,某些選項只應(yīng)當(dāng)出現(xiàn)在第一個數(shù)據(jù)報片中,而其他一些則必須出現(xiàn)在所有的數(shù)據(jù)報片中。ipfhcopy遍歷選項宇段,并查看是否應(yīng)該將某個選項復(fù)制到所有分片中。最后,當(dāng)ipfhcopy返回后
40、,ipfsend調(diào)用netwrite來發(fā)送這個數(shù)據(jù)報片。,2020/7/24,74 數(shù)據(jù)報的重組,重組數(shù)據(jù)報時,要求接收方的IP在能夠重組完整的數(shù)據(jù)報之前,不斷累積傳入的數(shù)據(jù)報片。一旦重組成功,IP為數(shù)據(jù)報選擇路由,繼續(xù)送往目的站。因為IP并不保證順序交付,協(xié)議要求IP能夠接受順序混亂的或延遲的數(shù)據(jù)報片。此外,在某個數(shù)據(jù)報的各個分片陸續(xù)到達期間,也可能混雜著其他數(shù)據(jù)報的分片。,2020/7/24,7.4.1 數(shù)據(jù)結(jié)構(gòu),為了使數(shù)據(jù)報的重組效率更高,用于保存數(shù)據(jù)報片的數(shù)據(jù)結(jié)構(gòu)必須能夠做到:為構(gòu)成某個特定數(shù)據(jù)報的一組數(shù)據(jù)報片快速定位,在一組數(shù)據(jù)報片中快速插入新的數(shù)據(jù)報片;有效地判斷一個完整的數(shù)據(jù)報是
41、否已經(jīng)全部抵達具有數(shù)據(jù)報片超時機制,如果在重組完成之前定時器溢出,則刪除數(shù)據(jù)報片。 本例中的代碼使用一個列表數(shù)組來保存數(shù)據(jù)報片。數(shù)組中的每個元素對應(yīng)于一個已有數(shù)據(jù)報片到達的數(shù)據(jù)報,并包含了一個指針,指向此數(shù)據(jù)報的分片表,文件ipreass.h說明了數(shù)據(jù)結(jié)構(gòu)。,2020/7/24,7.4.1 數(shù)據(jù)結(jié)構(gòu),數(shù)組ipfqt構(gòu)成了數(shù)據(jù)報片的主要數(shù)據(jù)結(jié)構(gòu),數(shù)組的每個元素對應(yīng)一個數(shù)據(jù)報。結(jié)構(gòu)ipfq定義了需要保存的信息,除數(shù)據(jù)報的源地址和ID字段(iPf_src和ipf_id)之外,每個元素還包含了一個壽命計數(shù)字段(ipf_ttl),用來指出該數(shù)組元素在超時之前能保留多長時間,ipf_q字段指向一個鏈表,鏈
42、表的表項是所有已經(jīng)到達的數(shù)據(jù)報片。 重組軟件必須判斷某個數(shù)據(jù)報的數(shù)據(jù)報片是否已經(jīng)全部抵達。為了提高判斷的效率,分片鏈表按順序存放。鏈表中的數(shù)據(jù)報片根據(jù)它們在原來的數(shù)據(jù)報中的偏移量大小排序。協(xié)議設(shè)計思想使序號的選取變得簡單,因為即使是為一個數(shù)據(jù)報片再次分片時,它的偏移量還是以原來的數(shù)據(jù)報為基準的,因而能夠做到在鏈表中插入任何數(shù)據(jù)報而不需要知道它是一次分片還是多次分片的結(jié)果。,2020/7/24,7.4.2 互斥操作,為了保證進程在訪問數(shù)據(jù)報片的鏈表時不會互相干擾,重組程序代碼使用了個互斥信號量ipfmutex。在文件ipreassh中說明了它是一個外部的整數(shù)值,可被所有程序代碼訪問。正如我們將要
43、看到的,由于互斥操作使系統(tǒng)能夠使用各自獨立的超時進程和重組進程,而使它顯得尤其重要。,2020/7/24,743 在鏈表中加入一個數(shù)據(jù)報片,IP使用傳入數(shù)據(jù)報片首部中的信息來確定出對應(yīng)的數(shù)據(jù)報片鏈表。如果幾個數(shù)據(jù)報片的源地址字段和IP標識符字段中的值相同,那么這些數(shù)據(jù)報片就屬于同一個數(shù)據(jù)報。過程ipreass接收數(shù)據(jù)報片,找出相應(yīng)的鏈表并將數(shù)據(jù)報片插入該鏈表中。給定一個數(shù)據(jù)報片,ipreass在分片表中搜索,看表中是否有與該數(shù)據(jù)報片所屬的數(shù)據(jù)報相對應(yīng)的表項。對每一個表項,它比較兩者的源地址和標識符字段,如果找到匹配的表頂、就調(diào)用ipfadd向鏈表中加入該數(shù)據(jù)報片,然后調(diào)用ipfjoin來查看是
44、否所有的數(shù)據(jù)報片己全部到齊,可以重組數(shù)據(jù)報。如果沒有發(fā)現(xiàn)匹配表項,ipreass分配數(shù)組中的第一個空閑表項,復(fù)制源地址和標識符字段,并將數(shù)據(jù)報片置入一個新分配的隊列中。,2020/7/24,743 在鏈表中加入一個數(shù)據(jù)報片,在我們的實現(xiàn)過程中,使用了線性查找來為一個傳入數(shù)據(jù)報片找出適當(dāng)?shù)逆湵怼τ谛阅芤蟾叩膽?yīng)用,這種方法似乎效率很低。當(dāng)然,一些計算機的確同時接收來自許多數(shù)據(jù)報的數(shù)據(jù)報片,因而要求更快的查找方式。然而,由于大多數(shù)計算機更多地與本地環(huán)境中的計算機通信,它們很少會收到分片的數(shù)據(jù)報。再者,因為重組只能在數(shù)據(jù)報到達本機時才發(fā)生,而途經(jīng)的數(shù)據(jù)流不需要重組,所以網(wǎng)關(guān)重組數(shù)據(jù)報的速度不需要像
45、為數(shù)據(jù)報選擇路由時那么快。因而,對典型的計算機系統(tǒng)來說,線性查找已經(jīng)足夠了。,2020/7/24,744 溢出時的丟棄,過程ipfadd將數(shù)據(jù)報片插入給定的鏈表:在正常情況下,此過程顯得微不足道。ipfadd只是調(diào)用enq將數(shù)據(jù)報片放入隊列中,然后將數(shù)據(jù)報的壽命字段復(fù)位。 但是,在分片列表空間已全滿的情況下,新的數(shù)據(jù)報片無法加入鏈表中。當(dāng)這種情況發(fā)生時,ipfadd丟棄對應(yīng)數(shù)據(jù)報的所有數(shù)據(jù)報片,并釋放ipfqt數(shù)組中對應(yīng)的表項。表面上看,這種做法似乎有些奇怪,然而丟棄整個鏈表的原因其實很簡單:只要丟失一個數(shù)據(jù)報片,IP就永遠無法重組并繼續(xù)處理這個數(shù)據(jù)報。因此,釋放它所對應(yīng)的數(shù)據(jù)報片占用的內(nèi)存空
46、間,可以使其他數(shù)據(jù)報有可能進行重組。更進一步講,一旦鏈表的容量達到極限值,它就無法再擴展。此時若保留該鏈表,只會徒然耗費內(nèi)存資源,而不會對成功重組數(shù)據(jù)報起什么作用。,2020/7/24,745 測試一個完整的數(shù)據(jù)報,當(dāng)IP向鏈表中增加一個新數(shù)據(jù)報片后,必須檢查它是否已擁有了組成一個完整數(shù)據(jù)報的全部數(shù)據(jù)報片。過程的ipfjoin檢查數(shù)據(jù)報片鏈表,看它們是否能形成一個完整數(shù)據(jù)報。 在證實了指定的某個數(shù)據(jù)報片鏈表正處于使用狀態(tài)后,ipfjoin進入一個循環(huán)語句,遍歷鏈表中的每個數(shù)據(jù)報片。它先設(shè)置變量off的值為0,然后利用變量off來查看它當(dāng)前指向的數(shù)據(jù)報片所處的位置是否正確,是否就是它在原來的數(shù)據(jù)
47、報中所處的位置。首先,ipfjoin查看當(dāng)前數(shù)據(jù)報片的偏移量是否與off值相符。如果當(dāng)前數(shù)據(jù)報片的偏移量超過了off的值,那么必定還有尚未到達的數(shù)據(jù)報片,因此ipfjoin返回0(這意味著數(shù)據(jù)報片還不能被重組):如果偏移量與off值一致,那么ipfjoin通過將off值加上當(dāng)前數(shù)據(jù)報片的長度,計算出下一個數(shù)據(jù)報片的偏移量。,2020/7/24,745 測試一個完整的數(shù)據(jù)報,一旦ipfjoin證實所有的數(shù)據(jù)報片已被全部收集齊,則通過判斷來保證數(shù)據(jù)報可以被裝入一個大緩沖區(qū)中。軟件只能處理裝入大緩沖區(qū)中的數(shù)據(jù)報,因為數(shù)據(jù)報在被傳送給應(yīng)用程序之前,必須在連續(xù)的存儲空間中重組。這樣,如果數(shù)據(jù)報無法裝入到
48、一個緩沖區(qū)中,ipfjoin就將這些數(shù)據(jù)報片丟棄。最后,對于可裝入個緩沖區(qū)的數(shù)據(jù)報來說,ipfjoin調(diào)用ipfcons來收集數(shù)據(jù)報片并重建完整的數(shù)據(jù)報。,2020/7/24,7.4.6 將數(shù)據(jù)報片組裝成完整的數(shù)據(jù)報,過程ipfcons將數(shù)據(jù)報片重組成完整的數(shù)據(jù)報。除了將每個數(shù)據(jù)報片中的數(shù)據(jù)復(fù)制到合適的位置外,它還要建立個有效的數(shù)據(jù)報首部。所需要的信息來自第一個數(shù)據(jù)報片的首部中,但數(shù)據(jù)報長度字段中的值要修改為整個數(shù)據(jù)報的長度:ipfcons將MF比特復(fù)位為0,以表明這個重建的數(shù)據(jù)報不是數(shù)據(jù)報片,并將偏移字段置為0,在數(shù)據(jù)報的重組過程中,ipfcons逐個釋放保存每個數(shù)據(jù)報片的緩沖區(qū);當(dāng)重組完成
49、后,ipfcons釋放分片表ipfqt中對應(yīng)的表項。,2020/7/24,75 數(shù)據(jù)報片鏈表的維護管理,因為IP是不可靠交付機制,數(shù)據(jù)報在互聯(lián)網(wǎng)中傳輸時有可能會丟失。如果一個數(shù)據(jù)報片丟失,接收端的IP軟件就不能重組原來的數(shù)據(jù)報。更進一步說,因為IP不提供確認機制,所以無法重傳數(shù)據(jù)報片。因此一旦某個數(shù)據(jù)報片丟失,IP將永遠無法恢復(fù)它所對應(yīng)的數(shù)據(jù)報。事實上,如TCP的高層協(xié)議,會使用一個新的數(shù)據(jù)報進行重傳。 為了使丟失數(shù)據(jù)報片的數(shù)據(jù)報不再浪費存儲資源,并防止因為標識符字段的重新使用而給IP帶來混亂當(dāng)已經(jīng)不可能再收到剩余數(shù)據(jù)報片時,IP必須定期檢查數(shù)據(jù)報片鏈表并丟棄舊鏈表,過程ipftimer執(zhí)行定
50、期的清理工作。,2020/7/24,75 數(shù)據(jù)報片鏈表的維護管理,ipftimer在每次被調(diào)用時(通常每秒一次)遍歷數(shù)據(jù)報片鏈表,它遞減每個表項中的壽命字段,并丟棄其值達到0的鏈表。在丟棄一個鏈表時,ipftimer從鏈表中提取出第一個結(jié)點,并利用分組緩沖區(qū)向源地址發(fā)送ICMP超時報文。在發(fā)送了ICMP報文之后,ipftimer釋放鏈表,并將iPfqt中的表項設(shè)置為空閑狀態(tài),可以被再次使用。,2020/7/24,7.6 初始化,重組數(shù)據(jù)報片時所使用的數(shù)據(jù)結(jié)構(gòu)的初始化過程很簡單。過程ipfinit生成互斥信號量并將iPfqt數(shù)組中的每個表項置為空閑狀態(tài),使之可用。,2020/7/24,7.7 小
51、結(jié),所有實現(xiàn)IP協(xié)議的機器必須能夠?qū)⑼獍l(fā)的數(shù)據(jù)報分片。并且當(dāng)被分片的數(shù)據(jù)報到達后,將其重組。 事實上,網(wǎng)關(guān)通常在遇到一個太大的數(shù)據(jù)報而無法將其作為網(wǎng)絡(luò)MTU傳送到它必須經(jīng)過的網(wǎng)絡(luò)上時,就需要將這個數(shù)據(jù)報分片。數(shù)據(jù)報的分片過程包括為每個數(shù)據(jù)報片復(fù)制數(shù)據(jù)報的首部,設(shè)置偏移字段和MF比特,復(fù)制部分數(shù)據(jù),并每次發(fā)送一個所得到的數(shù)據(jù)報片。軟件在IP為數(shù)據(jù)報選擇路由之后,以及IP將其置入一個與特定網(wǎng)絡(luò)接口相關(guān)聯(lián)的輸出隊列之前,將個數(shù)據(jù)報分片。與重組相比,分片要更直截了當(dāng)。,2020/7/24,7.7 小結(jié),為了執(zhí)行重組,IP采用了個數(shù)據(jù)結(jié)構(gòu),用于把來自某一特定數(shù)據(jù)報的所有數(shù)據(jù)報片收集起來。 一旦所有的數(shù)據(jù)
52、報片都已聚齊,就可以重組(重建)數(shù)據(jù)報并繼續(xù)處理。 重組與一個維護進程并行工作。每當(dāng)某個數(shù)據(jù)報的一個新數(shù)據(jù)報片到達時,IP在分片表中將此數(shù)據(jù)報的壽命字段復(fù)位。維護進程定期檢查數(shù)據(jù)報片鏈表,并遞減每個表項中的壽命字段;如果在所有數(shù)據(jù)報片到達之前,壽命已達到0,則維護進程丟棄整個數(shù)據(jù)報。,2020/7/24,差錯與控制報文協(xié)議,因特網(wǎng)控制報文協(xié)議 ICMP報文格式與類型 ICMP差錯報告 ICMP控制報文 ICMP請求與應(yīng)答報文對 ICMP報文封裝,2020/7/24,因特網(wǎng)控制報文協(xié)議(ICMP),ICMP協(xié)議設(shè)計的最初目的主要是用于IP層的差錯報告,由路由器或信宿以一對一的模式向信源報告?zhèn)鬏斿e
53、誤的原因。 隨著網(wǎng)絡(luò)的發(fā)展,檢測和控制功能逐漸被引入到ICMP協(xié)議中,使得ICMP協(xié)議不僅用于傳輸差錯報告,而且大量用于傳輸控制報文。 ICMP與IP協(xié)議位于同一個層次(IP層),但ICMP報文是封裝在IP數(shù)據(jù)報的數(shù)據(jù)部分進行傳輸?shù)摹?ICMP協(xié)議是IP協(xié)議的補充,用于IP層的差錯報告、擁塞控制、路徑控制以及路由器或主機信息的獲取。,返回,2020/7/24,ICMP報文格式與類型,ICMP報文由首部和數(shù)據(jù)段組成。首部為定長的8個字節(jié),前4個字節(jié)是通用部分,后4個字節(jié)隨報文類型的不同有所差異。ICMP報文的一般格式如圖所示。,2020/7/24,ICMP報文雖然細分為很多類,但總的來看可以分為
54、 如圖所示的三大類:差錯報告、控制報文和請求應(yīng)答報文。,返回,2020/7/24,ICMP差錯報告,ICMP差錯報告的數(shù)據(jù)區(qū)包含出錯數(shù)據(jù)報的首部及該數(shù)據(jù)報的前64位數(shù)據(jù),這些信息有助于信源或管理人員發(fā)現(xiàn)錯誤原因。 ICMP差錯報告具有以下特點: 1)只報告差錯,但不負責(zé)糾正錯誤,糾錯工作留給高層協(xié)議去處理。 2)發(fā)現(xiàn)出錯的設(shè)備只向信源報告差錯。 3)差錯報告作為一般數(shù)據(jù)傳輸,不享受特別優(yōu)先權(quán)和可靠性。 4)產(chǎn)生ICMP差錯報告的同時,會丟棄出錯的IP數(shù)據(jù)報。,2020/7/24,形成ICMP差錯報告時有以下例外: 1)ICMP差錯報文本身不會再產(chǎn)生ICMP差錯報告。 2)分片報文的非第一個分片
55、不會產(chǎn)生ICMP差錯報告。 3)組播地址報文不會產(chǎn)生ICMP差錯報告。 4)特殊地址127.0.0.0和0.0.0.0的報文不會產(chǎn)生ICMP差錯報告。,2020/7/24,1 信宿不可達報告,當(dāng)路由器無法根據(jù)路由表轉(zhuǎn)發(fā)IP數(shù)據(jù)報時或主機無法向上層協(xié)議和端口提交IP數(shù)據(jù)報時,將丟棄當(dāng)前的數(shù)據(jù)報,并產(chǎn)生信宿不可達差錯報告,向信源報告出錯。信宿不可達報文如圖所示。,2020/7/24,信宿不可達報文可能由路由器產(chǎn)生,也可能由信宿機產(chǎn)生。產(chǎn)生信宿不可達報文的原因的16種可能 :,2020/7/24,2 數(shù)據(jù)報超時報告,在數(shù)據(jù)報的傳輸過程中,首部的TTL值用于防止數(shù)據(jù)報因路由表的問題而無休止地在網(wǎng)絡(luò)中傳
56、輸。當(dāng)TTL值為0時,路由器會丟棄當(dāng)前的數(shù)據(jù)報,并產(chǎn)生一個ICMP數(shù)據(jù)報超時報告。另外,在信宿進行分片重組時會啟動重組定時器,一旦重組定時器超時,信宿就會丟棄當(dāng)前正在重組的數(shù)據(jù)報,然后產(chǎn)生一個ICMP數(shù)據(jù)報超時報告,并向信源發(fā)送該超時報告。,2020/7/24,數(shù)據(jù)報超時報告的報文格式與信宿不可達報告的報文格式相同,只是類型和代碼值不同。 數(shù)據(jù)報超時報告的類型和代碼的含義如表所示。類型值11表示是數(shù)據(jù)報超時報文,代碼“0”表示TTL超時,代碼“1”表示分片重組超時。,2020/7/24,3 數(shù)據(jù)報參數(shù)錯報告,數(shù)據(jù)報參數(shù)錯報告是由數(shù)據(jù)報首部字段值不明確或空缺而引起的差錯報告。一旦路由器或信宿機發(fā)
57、現(xiàn)錯誤的數(shù)據(jù)報首部和錯誤的數(shù)據(jù)報選項參數(shù)時,便拋棄該數(shù)據(jù)報,并向信源發(fā)送差錯報告報文。數(shù)據(jù)報參數(shù)錯報文的格式如圖所示。,2020/7/24,類型12表明數(shù)據(jù)報參數(shù)錯 代碼“0”表示數(shù)據(jù)報首部中的某個字段的值有錯或不明確,這時ICMP報文首部的指針指向數(shù)據(jù)報中有問題的字節(jié); 代碼“1”表示數(shù)據(jù)報首部中缺少某一選項所必須具有的部分參數(shù),此時的ICMP報文沒有指針字段。 表3給出了數(shù)據(jù)報參數(shù)錯報告的類型。 代碼為“0”的參數(shù)錯只能報告一個出錯參數(shù) 代碼為“1”的參數(shù)錯只能報告缺少參數(shù),不能說明缺少哪個參數(shù)。,返回,2020/7/24,ICMP控制報文,ICMP控制報文包括源抑制報文和重定向報文 源抑
58、制報文用于擁塞控制 重定向報文用于路徑控制 下表給出了這兩類報文的類型和作用描述。,2020/7/24,1 源抑制報文,IP協(xié)議采用的是無連接數(shù)據(jù)報方式進行傳輸 發(fā)送方事先并不了解中間的路由器和信宿的處理能力和緩沖區(qū)大小 在數(shù)據(jù)報傳輸過程中沒有采用任何流量控制機制 當(dāng)大量的數(shù)據(jù)報進入路由器或信宿時,會造成緩沖區(qū)溢出,即出現(xiàn)擁塞(Congestion)。 ICMP利用源抑制的方法來進行擁塞控制。通過源抑制來減緩信源發(fā)出數(shù)據(jù)報的速率。,2020/7/24,源抑制報文的格式如圖所示。,2020/7/24,源抑制包括三個階段:發(fā)現(xiàn)擁塞階段、解決擁塞階段和恢復(fù)階段。 在發(fā)現(xiàn)擁塞階段,路由器對緩沖區(qū)進行監(jiān)
59、測,一旦發(fā)現(xiàn)擁塞,立即向相應(yīng)的信源發(fā)送ICMP源抑制報文。該信源收到源抑制報文后,便知道擁塞已經(jīng)發(fā)生,而且所發(fā)送的數(shù)據(jù)報已經(jīng)丟掉。 在解決擁塞階段,信源根據(jù)收到的源抑制報文中所帶的原數(shù)據(jù)報的首部信息決定對去往某一特定信宿的信息流進行抑制。通常信源在收到源抑制報文后,按一定的規(guī)則降低發(fā)往某信宿的數(shù)據(jù)報傳輸率。 擁塞解除后,信源逐漸恢復(fù)數(shù)據(jù)報傳輸速率。,2020/7/24,在擁塞控制中以下幾點值得關(guān)注: 1)雖然對于每個因擁塞而丟棄的數(shù)據(jù)報都產(chǎn)生ICMP源抑制報文,但信源只按照自己的時間段進行響應(yīng)。 2)擁塞的解除由信源依據(jù)是否有進一步的源抑制報文到達來進行判斷。 3)擁塞可能是由多個源共同行為的結(jié)果,由于各個信源的發(fā)送速率相差較大,源抑制的效果未必很好。,2020/7/24,2 重定向報文,因特網(wǎng)上的路由器和主機中都存有一個路由表,路由表決定了去往目的地的下一跳路由器的地址。 路由器上的路由表能夠及時地反映網(wǎng)絡(luò)結(jié)構(gòu)的變化,這一特點由路由器之間定期交換路由信息加以保證。 主機因為不能保證全天開機,所以主
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)線的設(shè)備檢修與生產(chǎn)效率提升
- 現(xiàn)代辦公環(huán)境下的會議組織策略
- 環(huán)保理念在藝術(shù)空間設(shè)計中的應(yīng)用
- 國慶節(jié)愛國實踐活動方案
- 9 古詩三首《秋夜將曉出籬門迎涼有感》(說課稿)-2024-2025學(xué)年統(tǒng)編版語文五年級下冊
- 2024年五年級語文下冊 第六單元 15 自相矛盾說課稿 新人教版
- 6 我們神圣的國土第一課時 (說課稿)- 2024-2025學(xué)年統(tǒng)編版道德與法治五年級上冊001
- Unit 3 After School Activities Let's Check(說課稿)-2023-2024學(xué)年人教新起點版英語三年級下冊
- 2024-2025學(xué)年高中物理 第六章 萬有引力與航天 2 太陽與行星間的引力(1)說課稿 新人教版必修2
- Unit5 Clothes (第六課時)(說課稿)-2024-2025學(xué)年人教新起點版英語三年級上冊001
- 小兒腹瀉課件
- 北京市通州區(qū)市級名校2025屆高一數(shù)學(xué)第一學(xué)期期末考試試題含解析
- Unit2 Travelling Around Project北京之游學(xué)生作業(yè)教學(xué)設(shè)計 -2023-2024學(xué)年高中英語人教版必修第一冊
- 項目三任務(wù)1:認識超聲波雷達(課件)
- 起重機械生產(chǎn)單位質(zhì)量安全總監(jiān)-特種設(shè)備考試題庫
- DZ∕T 0080-2010 煤炭地球物理測井規(guī)范(正式版)
- 小學(xué)生心理健康教育學(xué)情分析
- 2024年高考語文一輪復(fù)習(xí):文言文文意概括簡答題知識清單 (二)
- 超級大腦:孩子六維能力培養(yǎng)指南
- 縱隔腫物的護理查房
- 新能源汽車概論題庫
評論
0/150
提交評論