本書--技術(shù)tcpip詳解卷2實現(xiàn)_第1頁
本書--技術(shù)tcpip詳解卷2實現(xiàn)_第2頁
本書--技術(shù)tcpip詳解卷2實現(xiàn)_第3頁
本書--技術(shù)tcpip詳解卷2實現(xiàn)_第4頁
本書--技術(shù)tcpip詳解卷2實現(xiàn)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第21 ARP:地址解析協(xié)地址解析協(xié)議(ARP)用于實現(xiàn)IP地址到網(wǎng)絡(luò)接口硬件地址的映射。常見的以太網(wǎng)網(wǎng)絡(luò)接口硬件地址長度為48bit。ARP同時也可以工作在其他類型的數(shù)據(jù)鏈路下,但在本章中,我們只考慮將IP地址映射到48bit的以太網(wǎng)地址。ARP在RFC826[Plummer1982]當(dāng)某主機要向以太網(wǎng)中另一臺主機發(fā)送IP數(shù)據(jù)時,它首先根據(jù)目的主機的IP地址在ARP高速緩存中查詢相應(yīng)的以太網(wǎng)地址,ARP高速緩存是主機的一個IP地址到相應(yīng)以太網(wǎng)地址的映射表。如果查到匹配的結(jié)點,則相應(yīng)的以太網(wǎng)地址被寫入以太網(wǎng)幀首部,數(shù)據(jù)報被加入到輸出隊列等候發(fā)送。如果查詢失敗,ARP會先保留待發(fā)送的IP數(shù)據(jù)報,然后廣播一個詢問目的主機硬件地址的ARP報文,等收到回答后再將IP數(shù)據(jù)報發(fā)送出去。以上只是簡要描述了ARP協(xié)議的基本工作過程,下面結(jié)合Net/3中的ARP實現(xiàn)來詳Net/3中ARP的實現(xiàn)是和路由表緊密關(guān)聯(lián)的,這也是為什么我們要在描述路由表結(jié)構(gòu)之后再來講解ARP的原因。圖21-1顯示了本章中我們描述ARP要用到的一個例子。整個圖是與本書中用到的網(wǎng)絡(luò)實例相對應(yīng)的,它顯示了bsdi主機上當(dāng)前ARP存的相結(jié)。其中Ifnet、ifaddr和in_ifaddr結(jié)構(gòu)是由圖3-32和圖6-5簡化而來的,所以在這里忽略了在第3章第6章中描述過的這三個結(jié)構(gòu)中的某些細(xì)節(jié)。例如,圖中沒有畫出在兩個 ifaddr結(jié)構(gòu)之后的sockaddr_dl結(jié)構(gòu)—而僅僅是概述了這兩個結(jié)構(gòu)中的相應(yīng)信息。同樣,我們也僅僅是概述了個in_ifaddr結(jié)構(gòu)中的信息。llinfo_arp結(jié)構(gòu)的雙向鏈表包含了每一個ARP已知的硬件地址的少量信息。同名全局變量llinfo_arp是該鏈表的頭結(jié)點,圖中沒有畫出第一位的la_prev指針指向最后一項,最后一項的la_next指針指向第一項。該鏈表由ARP時鐘函數(shù)每隔5分鐘處理一次。每一個已知硬件地址的IP地址都對應(yīng)一個路由表結(jié)點rtentry結(jié)構(gòu))。llinfo_arp結(jié)構(gòu)的la_rt指針成員用來指向相應(yīng)的rtentry結(jié)構(gòu),同樣地,rtentry結(jié)構(gòu)的rt_llinfo指針成員指向llinfo_arp結(jié)構(gòu)。圖中對應(yīng)主機sun(140.252.13.33)、svr4(140.252.13.34)和bsdi(140.252.13.35)的三個路由表結(jié)點各自具有相應(yīng)的llinfo_ar結(jié)構(gòu)。如圖18-2所示。llinfo_arp結(jié)構(gòu),該結(jié)點對應(yīng)于本地以太網(wǎng)(140.252.13.32)的路由項。該結(jié)點的rt_flags中設(shè)置了C比特,表明該結(jié)點是被用來形成其他結(jié)點的。設(shè)置接口IP地址功能的in_ifinit函數(shù)(圖6-19)通過調(diào)用rtinit函數(shù)來創(chuàng)建該結(jié)點。其他三個結(jié)點是主機路由結(jié)點(H標(biāo)志),并由bsdi向其他機器發(fā)送數(shù)據(jù)時通過ARP間接調(diào)用路由相關(guān)函數(shù)產(chǎn)生的(L標(biāo)志)y結(jié)構(gòu)中的指針成員指向一個,那么路由結(jié)點變量的rt_ifp成員的相應(yīng)指針成員指向?qū)?yīng)網(wǎng)絡(luò)設(shè)備接口的ifnet結(jié)構(gòu)。le_softc[0]的路由結(jié)點對應(yīng)的是bsdiloifrt_ifp.if_output指向輸出函數(shù),所以目的為本機的數(shù)據(jù)報被路由至環(huán)回接口。圖21- ARP與路由表和接口結(jié)構(gòu)的關(guān)每一個路由結(jié)點還有指向相應(yīng)的 in_ifaddr結(jié)構(gòu)的指針變量(圖6-8中了in_ifaddr結(jié)構(gòu)內(nèi)的第一個成員是一個ifaddr結(jié)構(gòu),因此,rt_ifa同樣是指向了ifaddr結(jié)構(gòu)變量)。在本圖中,我們只顯示一個路由結(jié)點的相應(yīng)指向,其余的路由結(jié)點具有同樣的性質(zhì)。而一個接口如le,可以同時設(shè)置多個IP地,個IP地址都有對應(yīng)的in_ifaddr結(jié),這就是為什么除了rt_ifp之外還要rt_ifa的原。ARP請求。當(dāng)內(nèi)核等待ARP回答時,存放該待發(fā)數(shù)據(jù)報的mbuf鏈的頭結(jié)點的地址信息就存放在la_hold里。當(dāng)收到ARPla_hold指向的mbuf鏈表中的IP數(shù)據(jù)被發(fā)送出去。路由表結(jié)點中c結(jié)構(gòu)的變量e存放的是與對應(yīng)的ARP結(jié)點相關(guān)的定時信息,用來實現(xiàn)刪除超時(通常0分鐘)ARP在4.3BSDReno中,路由表結(jié)構(gòu)定義有了很大的變化,但4.3BSDReno和Net/2.4.4BSD中依然定義有ARP緩存,只是去除了作為單獨結(jié)構(gòu)的ARP緩存鏈表,而把在Net/2中,ARP表是一個結(jié)構(gòu)數(shù)組,其中每個元素包含有以下成員:IP地址、以太網(wǎng)地址、定時器、標(biāo)志和一個指向mbuf的指針(類似于圖21-1中的la_hold成員)。在Net/3中,我們可以看到,這些信息被分散到多個相互的結(jié)構(gòu)里。如圖21-2所示,共有包含9個ARP函數(shù)的一個C文件和兩個頭文 net/ifarp.hnetinet/ifether.harphdr結(jié)構(gòu)的定多個結(jié)構(gòu)和常量ARP函圖21-2圖21-3顯示了ARP函數(shù)與其他內(nèi)核函數(shù)的關(guān)系。該圖中還說明了ARP函數(shù)與第19章中某些本章中將介紹10個全局變量,如圖21-4保存ARP的統(tǒng)計量有兩個全局變量:arp_inuse和arp_allocated,如圖21-4所示。前者用來記錄當(dāng)前正在使用的ARP結(jié)點數(shù),后者用來記錄在系統(tǒng)初始化時分配的ARP結(jié)點數(shù)??梢允褂妹頰rp-a來顯示當(dāng)前ARP緩存的信息,該命令使用sysctl系統(tǒng)調(diào)用,參數(shù)由于圖18-2中對應(yīng)多播組224.0.0.1的相應(yīng)路由表項設(shè)置了L標(biāo)志,而同時由于arp程序查詢帶有RTF_LLINFO標(biāo)志位的ARP結(jié)點,所以該程序也輸出多播地址。后面解釋為什“ plete“permanent。接收到ARP請求/針對每個ARP每5賦IP地址時增加路由結(jié)點:使用命令帶RTF_UP和RTF_CLONINGifa_rtrequest圖21- ARP函數(shù)和內(nèi)核中其他函數(shù)的關(guān) structstructllinfo_arifqueuellinfo_arp向表的表來自以太網(wǎng)設(shè)備驅(qū)動程序的ARP輸入隊檢查ARP鏈表的時間間隔的分鐘數(shù)ARP結(jié)點的有效時間的分鐘數(shù)ARP洪泛算法的時間間隔的秒數(shù)正在使用的ARP結(jié)點已經(jīng)分配的ARP結(jié)點對一個IP地址發(fā)送ARP請求的重試次數(shù)初始化對本機使用環(huán)回(默認(rèn)圖21-4圖21-5與圖18-2相應(yīng)的arp-a在卷1的25.8節(jié)中我們講過,最初的SNMPMIB定義了一個地址映射組,該組對應(yīng)的是系統(tǒng)的當(dāng)前ARP緩存信息。在MIB-II中不再使用該組,而用各個網(wǎng)絡(luò)協(xié)議組(如IP組)分別包含地址映射表來替代。注意,從Net/2到Net/3,將單獨結(jié)構(gòu)的ARP緩存演化為在路由表中集成的IP地址映射表index=<名稱成員描述相應(yīng)接口:IP映射類型:1=其他,2=失效,3=動態(tài),4=靜態(tài)(見正文圖21-6IP圖21-6所示的是MIB-II中的一個IPipNetToMediaTable,該表保存的值來自于路由表結(jié)點和相應(yīng)的ifnet結(jié)構(gòu)。ARP在以太網(wǎng)中傳送的ARP分組的格式圖21-7所示硬硬件類協(xié)議類以太網(wǎng)地6地幀類發(fā)送者地 以太網(wǎng)ARP以太網(wǎng)ARP圖21- 在以太網(wǎng)上使用時ARP請求或回答的格結(jié)構(gòu)ether_header定義了以太網(wǎng)幀首部;結(jié)構(gòu)arphdr定義了其后的5個字段,其信息用于在任何類型的介質(zhì)上傳送ARPether_arp結(jié)構(gòu)除了包含arphdr結(jié)構(gòu)外,還包含源主機和目的主機的地址。結(jié)構(gòu)arphdr的定義如圖21-8所示。圖21-7顯示了該結(jié)構(gòu)中的前4圖21-8arphdr結(jié)構(gòu):通用的ARP請求/圖21-9顯示了ether_arp結(jié)構(gòu)的定義,其中包含了arphdr結(jié)構(gòu)、源主機和目的主機的IP地址和硬件地址。注意,ARP用硬件地址來表示48bit以太網(wǎng)地址,用協(xié)議地址來表示32bit每個ARP結(jié)點中,都有一個llinfo_arp結(jié)構(gòu),如圖21-10所示。所有這些結(jié)構(gòu)組成的鏈接表的頭結(jié)點是作為全局變量分配的。我們經(jīng)常把該表稱為ARP高速緩存,因為在圖21-1中,只有該數(shù)據(jù)結(jié)構(gòu)是與ARP結(jié)點一一對應(yīng)的。圖21- 在Net/2及以前的系統(tǒng)中,很容易識別作為ARP高速緩存的數(shù)據(jù)結(jié)構(gòu),因為每一個ARPNet/3則把ARP信息存放在多個結(jié)構(gòu)中,沒有哪個數(shù)據(jù)結(jié)構(gòu)被稱為ARP高速緩存。但是為了討論方便,我們依然用ARP高速緩存的概念來表示一個ARP結(jié)點的信息。104-10 該雙向表的前兩項由insque和remque兩個函數(shù)更新。la_rt指向相關(guān)的由表結(jié)點,該路由表結(jié)點的rt_llinfo成員指向la_rt107當(dāng)ARP接收到一個要發(fā)往其他主機的IP數(shù)據(jù)報,且不知道相應(yīng)硬件地址時,必須發(fā)送一個ARP請求,并等待回答。在等待ARP回答時,指向待發(fā)數(shù)據(jù)報的指針存放在la_hold中。la_hold所指的數(shù)據(jù)報被發(fā)送出去。108-109la_asked記錄了連續(xù)為某個IP地址發(fā)送請求而沒有收到回答的次數(shù)。在圖21-24中,我們可以看到,當(dāng)這個數(shù)值達(dá)到某個限定值時,我們就認(rèn)為該主機是關(guān)閉的,并在其后一段時間內(nèi)不再發(fā)送該主機的ARP請求。110這個定義使用路由結(jié)點中rt_metrics結(jié)構(gòu)的rmx_expire成員作為ARP定時器。當(dāng)arpwhohas函數(shù)通常由arpresolve調(diào)用,用于廣播一個ARP請求。如圖21-11所示。它還可由每個以太網(wǎng)設(shè)備驅(qū)動程序調(diào)用,在將IP地址賦予該設(shè)備接口時主動發(fā)送一個地址聯(lián)編信息(圖6-28中的SIOCSIFADDioct)。主動發(fā)送地址聯(lián)編信息不但可以檢測在以太網(wǎng)中是否存在IP地址,并且可以使其他機器更新其相應(yīng)信息。arpwhohas只是簡單調(diào)用下一部分將要介紹的arprequest函數(shù)。196-202 結(jié)構(gòu)(圖3-26)對所有以太網(wǎng)設(shè)備是通用的,是le_softc結(jié)構(gòu)(圖3-20)的一部分。ac_ipaddr成員是接口的IP地址的,當(dāng)SIOCSIFADDRioct執(zhí)行時由驅(qū)動程序填寫(圖6-28)。ac_enaddr是該設(shè)備的以太網(wǎng)地址。該函數(shù)的第二個參數(shù)addr,是ARP請求的目的IP地址。在主動發(fā)送動態(tài)聯(lián)編信息時,addr等于ac_ipaddr,所以arprequest的第二和第三個參數(shù)是一樣的,即發(fā)送IP地址和目arprequest函數(shù)由arpwhohas函數(shù)調(diào)用,用于廣播一個ARP在分析代碼之前,我們先來看一下該函數(shù)建立的數(shù)據(jù)結(jié)構(gòu)。傳送ARP請求需要調(diào)用以太網(wǎng)設(shè)備的接口輸出函數(shù)ether_output。ether_output的一個參數(shù)是mbuf,它包含待發(fā)送數(shù)據(jù),即圖21-7中以太網(wǎng)類型字段后的所有內(nèi)容。另外一個參數(shù)包含目的地址的端口地址結(jié)構(gòu)。通常情況下,該目的地址是IP地址(例如,在圖21-3中,ip_output調(diào)用ether_output)。特殊情況下,端口地址的sa_family被設(shè)為AF_UNSPEC,即告知ether_output它所帶的是一個已填充的以太網(wǎng)幀首部,包含了目的主機的硬件地址,這就防止了ether_output去調(diào)用arpreslove而導(dǎo)致死循環(huán)。圖21-3中沒有顯示這種循環(huán),在arprequest下面的接口輸出函數(shù)是ether_output。如果ether_output再去調(diào)用圖21-12顯示了該函數(shù)建立的兩個數(shù)據(jù)結(jié)構(gòu)mbuf和sockaddr。另外還有兩個函數(shù)中用到11字以太網(wǎng)首 14字 (28字節(jié)未使(72字節(jié)分配和初始化

圖21-13(續(xù)209-223分配一個分組數(shù)據(jù)首部的mbufMH_ALIGN將28字節(jié)的ether_arp結(jié)構(gòu)置于mbuf的尾部,并相應(yīng)地設(shè)置m_data指針的值。將該數(shù)據(jù)結(jié)構(gòu)置于mbuf尾部,是為了允許ether_output預(yù)先考慮將14字節(jié)的以太網(wǎng)幀首部置于同一mbuf中。224-226給ea和eh兩個指針賦值,并將ether_arp結(jié)構(gòu)的值賦為0。bzero的惟一目的是227-229目的以太網(wǎng)地址設(shè)為以太網(wǎng)廣播地址,并將以太網(wǎng)幀類型設(shè)為ETHERTYPE_ARP。注意代碼中的注釋,接口輸出函數(shù)將該字段從主機字節(jié)序轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序,該函數(shù)還將填充本機的以太網(wǎng)地址。圖21-14顯示了不同以太網(wǎng)幀類型字段的常量值。 值 ETHERTYPE_IIPETHERTYPE_ARARPETHERTYPE_REVAR逆ARPETHERTYPE_IPTRAILES尾部封裝(已廢棄圖21-14RARP將硬件地址映射成IP地址,通常在無盤工作站系統(tǒng)引導(dǎo)時使用。一般來說,部分不屬于內(nèi)核TCP/IP實現(xiàn),所以本書將不作描述, 1的第5章講述了RARP的概念填充ARP230-237填充了ether_arp的所有字段,除了ARPARPHRD_ETHER的值為1時,表示硬件地址的格式是6字節(jié)的以太網(wǎng)地址。為了表示協(xié)議地址是4字節(jié)的IP地址,arp_pro的值設(shè)為圖21-14中所指的IP協(xié)議地址類型(0x800)。圖21-15顯示了不同的ARP操作碼。本章中,看到前兩種。后兩種在RARP中使用。238241接口地址結(jié)構(gòu)的sa_family成員的值設(shè)為AP_UNSPEC,sa_member成員的值設(shè) 值 ARPOP_REQUES1解析協(xié)議地址的ARPARPOP_REPL2回答ARPARPOP_REVREQUES3解析硬件地址的RARPARPOP_REVREPL4回答RARP圖21-15ARP在圖4-13ether_input函數(shù)接收到幀類型字段為ETHERTYPE_ARP的以太網(wǎng)幀時,產(chǎn)生優(yōu)先級為NETISR_ARP的軟件中斷,并將該幀掛在ARP輸入隊列arpintrq的后面。當(dāng)內(nèi)核處理該軟件中斷時,調(diào)用arpintr函數(shù),如圖21-16圖21-16arpintr函數(shù):處理包含ARP請求/319-343while循環(huán)一次處理一個以太網(wǎng)幀,直到處理完隊列中的所有幀為止。只有當(dāng)幀的硬件類型指明為以太網(wǎng)地址,并且?guī)拈L度大于或等于arphdr結(jié)構(gòu)的長度加上兩個硬件地址和兩個協(xié)議地址的長度時,該幀才能被處理。如果協(xié)議地址的類型是ETHERTYPE_IP或注意if語句中對條件的檢測順序。共兩次檢查幀的長度。首先,當(dāng)幀長大于或等于arphdr結(jié)構(gòu)的長度時,才去檢查幀結(jié)構(gòu)中的其他字段;然后,利用arphdr中的兩個長度字段該函數(shù)由arpintr調(diào)用,用于處理接收到的ARP請求/回答。ARP本身的概念比較簡單,如果收到一個針對本機IP地址的請求,則發(fā)送一個回答。這是一種普通情況。很顯然,繼續(xù)從那個主機收到數(shù)據(jù)報,隨后也會向它回送報文。所以,如果我們還沒有對應(yīng)它的ARP結(jié)點,就應(yīng)該添加一個ARP結(jié)點,因為這時我們已經(jīng)知道了對方的IP地址和硬件地址。這會優(yōu)化其后與該主機的通信。如果收到一個ARP回答,那么此時AR結(jié)點是完整的,因此就知道了對方的硬件地址。該地址存放在sockaddr_dl結(jié)構(gòu)中,所有發(fā)往該地址的數(shù)據(jù)報將被發(fā)送。ARP請求是被廣播發(fā)送的,所以以太網(wǎng)上的所有主機都將看到該請求,當(dāng)然包括那些非目的主機。回想一下arprequest函數(shù),在發(fā)送ARP請求時,幀中包含著請求方的IP地址和硬件地址,這就產(chǎn)生了下面的情況:如果其他主機發(fā)送了一個ARP請求或回答,其中發(fā)送方的IP地址與本機相同,那么肯定有一個主機配置有誤。Net/3將檢測到該差錯,并向管理員登記一個報文(這里我們不分請求或回答,因為in_arpinout查操作類型,但是ARP回答將被單播,只有如果主機收到來自其他主機的請求或回答,對應(yīng)的AP結(jié)點早已存在,但硬件地址發(fā)生了變化,那么ARP結(jié)點將被更新。這種情況是這樣發(fā)生的:其他主機以不同的硬件地址重新啟動,而本機的對應(yīng)ARP結(jié)點還未失效。這樣,根據(jù)機器重啟動時主動發(fā)送動態(tài)聯(lián)編信息,可以使主機不至于因其他主機重啟動后導(dǎo)致的ARP5).主機可以被配置為ARP服務(wù)器。這種情況下,主機可以代其他主機響應(yīng)ARP請求,在回答中提供其他主機的硬件地址。ARP回答中對應(yīng)目的硬件地址的主機必須能夠把IP數(shù)據(jù)報轉(zhuǎn)發(fā)至ARP請求中指定的目的主機。卷1的4.6節(jié)討論了ARP。一個Net3系統(tǒng)可以配置成AP服務(wù)器。這些ARP結(jié)點可以通過p命令添加,該命令中指定IP、硬件址使用pub。在圖1在2討將in_arpinput的分析分為四部分,圖21-17顯示了第58-375ether_arp結(jié)構(gòu)的長度由調(diào)用者(arp_intr函數(shù))驗證,所以ea指針指向接收到的分組。ARP操作碼(請求或回答)被拷貝至op字段,但具體值要到后面來驗證。發(fā)送的方的IP地址拷貝到isaddr和itaddr。查找匹配的接口和IP376-382搜索本機的Internet地址鏈表(in_ifaddr結(jié)構(gòu)的鏈表,圖6-5)。要記住一個接口可以有多個IP地址。收到的數(shù)據(jù)報中有指向接收接口ifnet結(jié)構(gòu)的指針(在mbuf數(shù)據(jù)報的首部),for循環(huán)只考慮與接收接口相關(guān)的IP地址。如果查詢到有IP地址等于目的方IP地址或發(fā)送方IP地址,則退出循環(huán)。383-384如果循環(huán)退出時,變量maybe_ia的值為0,說明已經(jīng)搜索了配置的IP地址整個鏈表而沒有找到相關(guān)項。函數(shù)跳至out(圖21-19),丟棄mbuf,并返回。這種情況只發(fā)生在收到385如果退出循環(huán)時,maybe_ia值不為0,即找到了一個接收端接口,但沒有一個IP地址與目的方IP地址或發(fā)送方IP地址匹配,則myaddr的值設(shè)為該接口的最后一個IP地址;否則圖21-18顯示了in_arpinput函數(shù)的第二部分,執(zhí)行分組的386-388如果發(fā)送方的硬件地址等于本機接口的硬件地址,那是因為收到了本機發(fā)出的請389-395如果發(fā)送方的硬件地址等于以太網(wǎng)的廣播地址,說明出了差錯。記錄該差錯,并檢查發(fā)送方IP396-402如果發(fā)送方的IP地址等于myaddr,說明發(fā)送本機正在使用同一個IP地址這也是一個差錯—要么是發(fā)送方,要么是本機系統(tǒng)配置出了差錯。記錄該差錯,在將目的I地址設(shè)為myaddr后,程序轉(zhuǎn)至reply(圖21-19)。注意該ARP分組本來要送往以太網(wǎng)中其他主機的—該分組本來不是要送給本機的。但是,如果這種形式的IP地址被檢測到,應(yīng)記錄差錯,并產(chǎn)生回答。圖21-19顯示了in_arpinput函數(shù)的第圖21-19in_arpinput函數(shù):創(chuàng)建新的ARP結(jié)點或更新已有的ARP在路由表中搜索與發(fā)送方IP地址匹配的403arplookup在ARP高速緩存中查找符合發(fā)送方的IP地址(isaddr)。當(dāng)ARP的IP地址等于本機IP時,如果要創(chuàng)建新的ARP結(jié)點,那么第二個參數(shù)是1,如果不需要創(chuàng)建新的ARP0。如果本機就是目的主機,總是要創(chuàng)建ARP結(jié)點的,除非一個查找其他主機的廣播分組,這種情況下只是在已有的ARP結(jié)點中查詢。正如前面提到的,如果主機收到一個對應(yīng)它自己的ARP請求,則說明以太網(wǎng)中有其他主機將要與它通信,所以應(yīng)該創(chuàng)建一個對應(yīng)該主機的ARP結(jié)點。第三個參數(shù)是0,意味著不去查找ARP結(jié)點(后面要證明)。返回值是指向0 只有當(dāng)以下三個條件為真時if找到一個已有的ARP結(jié)點或成功創(chuàng)建一個新的ARP結(jié)點(即la非空ARP結(jié)點指向一個路由表結(jié)點路由表結(jié)點的re_gateway字段指向一個sockaddr_dl結(jié)構(gòu)對于每一個目的并非本機的廣播ARP請求,如果發(fā)送方的IP地址不在路由表,則第一個條405-408如果鏈路層地址長度(sdl_alen)非0,說明的路由表結(jié)點是現(xiàn)存的而非新創(chuàng)建的,則比較鏈路層地址和發(fā)送方的硬件地址。如果不同,則說明發(fā)送方的硬件地址已經(jīng)改變,這是因為發(fā)送方以不同的以太網(wǎng)地址重新啟動了系統(tǒng),而本機的ARP結(jié)點還未超時。這種情況雖然很少出現(xiàn),但也必須考慮到。記錄差錯信息后,程序繼續(xù)往下執(zhí)行,更新ARP點的硬件地址。在這個記錄報文中,發(fā)送方的IP地址必須轉(zhuǎn)換為主機字節(jié)序,這是一個錯誤409-410將發(fā)送方的硬件地址寫入路由表結(jié)點中rt_gateway成員指向的sockaddr_dl結(jié)構(gòu)。sockaddr_dl結(jié)構(gòu)的鏈路層地址長度(sdl_alen)也被設(shè)為6。該賦值對于最近創(chuàng)建更新最近解析的ARP411-412 在解析了發(fā)送方的硬件地址后,執(zhí)行以下步驟。如果時限是非零的,則將被復(fù)位成20分鐘(arpt_keep)。arp命令可以創(chuàng)建永久的ARP結(jié)點,即該結(jié)點不會超時。這些ARP結(jié)點限值置為0。在圖21-24中看到,在發(fā)送ARP請求(非永久性ARP結(jié)點)時,0的。413-414清除RTF_REJECT標(biāo)志,la_asked計數(shù)器設(shè)為0。我們將看到,在arpresolve中使用最后兩個步驟是為了防止ARP415-420如果ARP中保持有正在等待ARP解析該目的方硬件地址的mbuf,那么將mbf接口輸出函數(shù)(如圖21-1所示)。由于該mbuf是由ARP保持的,即目的地址肯定是在以太網(wǎng)上,所以接口輸出函數(shù)應(yīng)該是ether_outout。該函數(shù)也調(diào)用arpresolve,但這時硬件地址已被填充,所以允許mbuf加入實際的設(shè)備輸出隊列。如果是ARP回答分組,則421426如果該ARPin_arpinput的剩下部分如圖21-20所示,產(chǎn)生一個對應(yīng)于ARP請求的回答。只有當(dāng)以下兩種情況時才會產(chǎn)生ARP回答:本機就是該請求所要查找的目的主本機是該請求所要查找的目的主機的ARP服務(wù)器函數(shù)執(zhí)行到這個時刻,已經(jīng)接收了ARP請求,但ARP請求是廣播發(fā)送的,所以目的主機427-432如果目的IP地址等于myaddr,那么本機就是所要查找的目的主機。將發(fā)送方硬件地址拷貝到目的硬件地址字段(發(fā)送方現(xiàn)在變成了目的主機), 圖21- in_arpinput函數(shù):形成ARP回答,并發(fā)送出檢測本機是否目的主機的ARP服務(wù)433-437即使本機不是所要查找的目的主機,也可能被配置為目的主機的ARP服務(wù)器。再次調(diào)用arplookup0,第三個參數(shù)設(shè)為SIN_PROXY,這將在路由表中查找SIN_PROXY標(biāo)志為1的結(jié)點。如果查找不到(這是通常情況,本機收到了以太網(wǎng)上其他ARP請求的拷貝),out處的代碼將丟棄mbuf437-442 處理ARP請求時,發(fā)送方的硬件地址變成目的硬件地址,ARP結(jié)點中的以太ARP結(jié)點中的硬件地址可以是以太網(wǎng)中任一臺主機的硬件地址,只要它可以向目的主機轉(zhuǎn)發(fā)IP數(shù)據(jù)報。通常,提供ARP服務(wù)的主機會填入自己的硬件地,然這不要的。AR結(jié)點是由系統(tǒng)管理員用arp命令帶關(guān)鍵字pub創(chuàng)建的,標(biāo)明目的IP地址(這是路由表項的關(guān)鍵值)和在ARP回答中返回的以太網(wǎng)地址。完成構(gòu)造ARP回答分443-444 繼續(xù)完成ARP回答分組的構(gòu)建。發(fā)送標(biāo)的硬件地址已經(jīng)填充好了,現(xiàn)在交換發(fā)送標(biāo)的IP地址。目的IP地址在itaddr中,如果發(fā)現(xiàn)以太網(wǎng)中有其他主機使用同一IP地址,則該值已經(jīng)被填充了(見圖21-18)445-446ARP操作碼字段設(shè)為ARPOP_REPLY,協(xié)議地址類型設(shè)為ETHERTYPE_IP。旁邊加了注釋“你需要確定”,是因為當(dāng)協(xié)議地址類型為ETHERTYPE_IPTRAILERS時arpintr也會調(diào)用該函數(shù),但現(xiàn)在封裝(trailerencapsulation)已不再使用了。用以太網(wǎng)幀首部填充447-452sockaddr結(jié)構(gòu)用14字節(jié)的以太網(wǎng)幀首部填充,如圖21-12所示。目的硬件地址變453455將ARPARP定時器函ARP結(jié)點一般是動態(tài)的—需要時創(chuàng)建,超時時自動刪除。也允許管理員創(chuàng)建永久性結(jié)點,前面我們討論的結(jié)點就是永久性的?;貞浺幌聢D21-1和圖21-10中最后的#define語句,路由度量結(jié)構(gòu)中的rmx_expire成員就是用作ARP如圖21-21所示,該函數(shù)每5分鐘被調(diào)用一次。它查看所有ARP結(jié)點是否超圖21-21arptimer函數(shù):每5分鐘查看所有ARP8 arp_rtrequest函數(shù)使arptimer函數(shù)第一次被調(diào)用,隨后arptimer每隔5查看所有ARP81-86 查看ARP結(jié)點鏈表中的每一個結(jié)點。如果定時器值是非零的(不是一個永久結(jié)點)而且時間已經(jīng)超時,那么arptfree就刪除該結(jié)點。如果rt_expire是非零的,它的值是從結(jié)點超時起到現(xiàn)在的秒數(shù)。如圖21-22所示,arptfree函數(shù)由arptimer函數(shù)調(diào)用,用于從llinfo_dl表項列表中刪除一個超時的ARP結(jié)點使正在使用的結(jié)點無效(不刪除467-47 如果路由表計數(shù)器值大于0,而且rt_gatewary成員指向一sockaddr_dl結(jié)構(gòu),則arptfree執(zhí)行以下步驟將鏈路層地址長度設(shè)為將la_asked計數(shù)器值設(shè)為清除RTF_REJECT標(biāo)志隨后函數(shù)返回。因為路由表計數(shù)器值非零,所以該路由結(jié)點不能刪除。但是sdl_alen值設(shè)為0,該結(jié)點也就無效了。下次要使用該結(jié)點時,還將產(chǎn)生一個ARP圖21-22arptfree函數(shù):刪除或使一個ARP刪除沒有被的結(jié)474-475rtrequest刪除路由結(jié)點,在21.13節(jié)中,看到它調(diào)用了arp_rtrequest。arp_rtrequest函數(shù)釋放所有該ARP結(jié)點保持的mbuf(由la_hold指針?biāo)赶?,并刪除相應(yīng)的llinfo_arp結(jié)點。在圖4-16中,ether_output函數(shù)調(diào)用arpresolve函數(shù)以獲得對應(yīng)某個IP地址的以太arpreslove返回值為1,允許將待發(fā)IP數(shù)據(jù)報掛在接口輸出隊列上。如果不知道該以太網(wǎng)地址,則arpresolve返回值為0,arpsolve函數(shù)利用llinfo_arp結(jié)構(gòu)的la_hold成員指針“保持(held)”待發(fā)IP數(shù)據(jù)報,并發(fā)送一個ARP收到ARP回答后,再將保持的IP數(shù)據(jù)報發(fā)送出去。arpresolve應(yīng)避免ARP洪泛,也就是說,它不應(yīng)在尚未收到ARP回答時高速重復(fù)發(fā)送ARP請求。出現(xiàn)這種情況主要有兩個原因,第一,有多個IP數(shù)據(jù)報要發(fā)往同一個尚未解析硬件地址的主機;第二,一個IP數(shù)據(jù)報的每個分片都會作為獨立分組調(diào)用ether_output。11.9節(jié)討論了一個由分片引起的ARP洪泛的例子及相關(guān)的問題。圖21-23顯示了arpresolve的前半部分。252-26 dst是一個指向sockaddr_in的指針,它包含目的IP(一個6字節(jié)的數(shù)組)圖21-23arpresolve函數(shù):查找所需的ARP262-270如果mbuf的M_BCAST標(biāo)志置位,則用以太網(wǎng)廣播地址填充目的硬件地址字段,函數(shù)返回1。如果M_MCAST標(biāo)志置位,則宏ETHER_MAP_IP_MULTICAST(圖12-6)將D類地址映射為相應(yīng)的以太網(wǎng)地址。得到指向llinfo_arp結(jié)構(gòu)的指271276目的地址是單播地址。如果調(diào)用者傳輸了一個指向路由表結(jié)點的指針,則將la設(shè)置為相應(yīng)的llinfo_arp結(jié)構(gòu)。否則,arplookup根據(jù)給定IP的地址搜索路由表。第二個參數(shù)是1,告訴arplookup如果搜索不到相應(yīng)的ARP結(jié)點就創(chuàng)建一個新的;第三個參數(shù)是0,即277-281如果rt或la中有一個是空指針,說明剛才請求分配內(nèi)存時失敗,因為即使不存在已有結(jié)點,arplookup也已經(jīng)創(chuàng)建了一個,rt和la都不應(yīng)是空值。記錄一個差錯報文,釋圖21-24顯示了arpresolve的后半部分。它檢查ARP結(jié)點是否有效,如無效,則發(fā)送一個ARP請求。圖21-24arpresolve函數(shù):檢查ARP結(jié)點是否有效,如無效,則發(fā)送一個ARP檢查ARP結(jié)點的有282291即使找到了一個ARPARP結(jié)點是結(jié)點是永久有效的(時限值為0),或尚未超時由rt_gateway指向的插口地址結(jié)構(gòu)的sdl_family字段為鏈路層地址長度值(sdl_alen)不等于0arptfree使一個仍被的ARP結(jié)點失效的方法是將sdl_alen值置0。如果結(jié)點是有效的,則將sockaddr_dl中的以太網(wǎng)地址拷貝到desten,函數(shù)返回1。只保持最近的IP數(shù)據(jù)292-299 此時,已經(jīng)有了ARP結(jié)點,但它沒有一個有效的以太網(wǎng)地址,因此,必須發(fā)送一個ARP請求。將la_hold指針指向mbuf,同時也就釋放了剛才la_hold所指的內(nèi)容。這意味著,在發(fā)送ARP請求到收到ARP回答之間,如果有多個發(fā)往同一目的地的IP數(shù)據(jù)報要發(fā)送,只有最近的一個IP數(shù)據(jù)報才被la_hold保留,之前的全部丟棄。NFS就是這樣的一個例子,如果NFS要傳送一個8500字節(jié)的IP數(shù)據(jù)報,需要將其分割成6個分片。如果每個分片都在發(fā)送ARP請求到收到ARP回答之間由ip_output送往ether_output5個分片將被丟棄,當(dāng)收到ARP回答時,只有最后一個分片被保留了下來。這會使NFS超時,并重發(fā)這6發(fā)送ARP請求,但避免ARP300-314RFC1122要求ARP避免在收到ARP回答之前以過高的速度對一個以太網(wǎng)地址重發(fā)Net/3不在同一秒鐘內(nèi)發(fā)送多個對應(yīng)同一目的地的ARP如果在連續(xù)5個ARP請求(也就是5秒鐘)后還沒有收到回答,路由結(jié)點的RTF_REJECT標(biāo)志置1,時限設(shè)為往后的20秒。這會使ether_output在20秒內(nèi)發(fā)往該目的地址的20秒鐘后,arpresolve會繼續(xù)發(fā)送該目的主機的ARP請求如果時限值不等于0(非永久性結(jié)點),則清除RTF_REJECT標(biāo)志,該標(biāo)志是在早些時候為避免ARP洪泛而設(shè)置的。計數(shù)器la_asked記錄的是連續(xù)發(fā)往該目的地址的ARP請求數(shù)。如果計數(shù)器值為0或時限值不等于當(dāng)前時鐘(只需看一下當(dāng)前時鐘的秒鐘部分),那么需要再發(fā)送一個ARP請求。這就避免了在同一秒鐘內(nèi)發(fā)送多個ARP請求。然后將時限值設(shè)為當(dāng)前時鐘的秒鐘部分(time_tv_usec被忽略)。圖21-25顯示了一個例子,進一步解釋了arpresolve和ether_output為了避免ARP時 返請 請時 返打

請圖21-25避免ARP圖中總共顯示了26秒的時間,從10到36。我們假定有一個進程每隔0.5秒發(fā)送一個IP數(shù)據(jù)報,也就是說,一秒鐘內(nèi)有兩個數(shù)據(jù)報等待發(fā)送。數(shù)據(jù)報依次被標(biāo)號為1~52。我們還假定目假定當(dāng)進程寫數(shù)據(jù)報1時la_asked的值為0。la_hold設(shè)為指向數(shù)據(jù)報值設(shè)為當(dāng)前時鐘(10),la_asked值變?yōu)?,發(fā)送ARP請求。函數(shù)返回0進程寫數(shù)據(jù)報2時,丟棄數(shù)據(jù)報1,la_hold指向數(shù)據(jù)報2。由于rt_expire值等于當(dāng)進程寫數(shù)據(jù)報3時,丟棄數(shù)據(jù)報2,la_hold指向數(shù)據(jù)報3。由于當(dāng)前時鐘11不等于rt_expire(10),所以將rt_expire設(shè)為11。la_asked值為1,小于5,所以發(fā)送進程寫數(shù)據(jù)報4時,丟棄數(shù)據(jù)報3,la_hold指向數(shù)據(jù)報4。由于rt_expire值等前時鐘(11),所以無須其他動作,函數(shù)返回0對于數(shù)據(jù)報5~10,情況都是一樣的。在數(shù)據(jù)報9到達(dá)后,發(fā)送ARP請求后,值被設(shè)為進程寫數(shù)據(jù)報11時,丟棄數(shù)據(jù)報10,la_hold指向數(shù)據(jù)報11。當(dāng)前時鐘15)不等于rt_expire(14),所以將rt_expire的值設(shè)為15。此時la_asked的值不再小于5,ARP避免洪泛的算法開始作用:RTF_REJECT標(biāo)志位置1,rt_expire的值被設(shè)為進程寫數(shù)據(jù)報12時,ether_output注意到RTF_REJECT標(biāo)志位為1,而且當(dāng)前時鐘小于rt_expire(35),因此,返回EHOSTDOWN給發(fā)送者(通常是ip_output)。從數(shù)據(jù)報13到50,都返回EHOSTDOWN給發(fā)送者51時,盡管此時的RTF_REJECT標(biāo)志位仍然為1,但當(dāng)前時鐘的值(35)不再小于rt_expire(35),因此不會返回出錯信息。調(diào)用arpresolve,整個過程重5秒鐘內(nèi)發(fā)送5個ARP請求,然后是20秒鐘的等待,直到發(fā)送者放棄或目的主機響應(yīng)ARParplookup函數(shù)調(diào)用選路函數(shù)rtallocl在Internet路由表中查找ARP結(jié)點。我們已經(jīng)看到過3次調(diào)用arplookup的情況:在in_arpinput中,在接收到ARP分組后,對應(yīng)源IP地址查找或創(chuàng)建一個ARP在in_arpinput中,接收到ARP請求后,查看是否存在目的硬件地址的ARP在arpresolve中,查找或創(chuàng)建一個對應(yīng)待發(fā)送數(shù)據(jù)報IP地址的ARP結(jié)點如果arplookup執(zhí)行成功,則返回一個指向相應(yīng)llinfo_arp結(jié)構(gòu)的指針,否則返arplookup帶有三個參數(shù),第一個參數(shù)是目的IP地址;第二個參數(shù)是個標(biāo)志,為真時表示若找不到相應(yīng)結(jié)點就創(chuàng)建一個新的結(jié)點;第三個參數(shù)也是一個標(biāo)志,為真時表示查找或創(chuàng)建ARP結(jié)點。ARP結(jié)點通過定義一個不同形式的Internet插口地址結(jié)構(gòu)來處理,即sockaddr_111-11 前面8個字節(jié)與sockaddr_in結(jié)構(gòu)相同 sin_family被設(shè)為AF_INET。最后:sin_srcaddr、sin_tos和sin_other成員。當(dāng)結(jié)點作為結(jié)點時,只用到sin_other成員,并將其設(shè)為SIN_PROXY(1)。圖21-27arplookup函數(shù):在路由表中查找ARP初始化sockaddr_inarp結(jié)構(gòu),準(zhǔn)備查480-48 sin_addr成員設(shè)為將要查找的IP地址。如果proxy參數(shù)值不為0sin_other成員設(shè)為SIN_PROXY;否則設(shè)為0490-492 rtallocl在Internet路由表中查找IP地址,如果create參數(shù)值不為0建一個新的結(jié)點。如果找不到結(jié)點,則函數(shù)返回值為0(空指針。493 的再被認(rèn)像層一樣“持”由表結(jié),此,路表找時對 t計數(shù)的遞增,在里494-499 如果將標(biāo)志RTF_GATEWAY置位,或者標(biāo)志RTF_LLINFO沒有置位,或者由rt_gateway指向的插口地址結(jié)構(gòu)的地址族字段值不是AF_LINK,說明出了某些差錯,返回一個空指針。如果結(jié)點是這樣創(chuàng)建的,應(yīng)創(chuàng)建一個記錄報文。記錄報文中對arptnew的注釋是針對老版本Net/2中創(chuàng)建ARP結(jié)點的如果rtallocl由于匹配結(jié)點的RTF_CLONING標(biāo)志置位而創(chuàng)建一個新的結(jié)點,那 (21.13節(jié))也要被rtrequest調(diào)用Net/3支持ARP,有兩種不同類型的ARP結(jié)點,可以通過arp命令及pub選項它們加入到路由表中。添加ARP選項會使arp_rtrequest主動發(fā)送動態(tài)聯(lián)編信息(如圖ARP結(jié)點的第一種類型:它允許將網(wǎng)絡(luò)內(nèi)的某一主機的IP地址填入到ARP高速緩存0xffffffff。加掩碼的目的是即使插口地址的SIN_PROXY標(biāo)志位為1,在調(diào)用圖21-27中的rtallocl時能與該結(jié)點匹配。于是在調(diào)用圖21-20中的arplookup時也能與該結(jié)點匹配,目的地址的SIN_PROXY置位。如果本網(wǎng)中的主機H1不能實現(xiàn)ARP,那么可以使用這種類型的ARP結(jié)點。作為的主機代替H1回答所有的ARP請求,同時提供創(chuàng)建ARP結(jié)點時設(shè)定的硬件地址(比可以是H1的以太網(wǎng)地址)。這種類型的結(jié)點可以通過arp-published”符號。第二種類型的ARP結(jié)點用于已經(jīng)存有路由表結(jié)點的主機。內(nèi)核為該目的地址創(chuàng)建另外一個路由表結(jié)點,在這個新的結(jié)點中含有鏈路層的信息 (如以太網(wǎng)地址)。該新結(jié)點中sockaddr_inar構(gòu)(圖21-26)的sin_other員的SIN_PROXY標(biāo)志置位?;叵胍幌?,搜索路由表時是比較12節(jié)的Internet插口址(圖18-39。只有當(dāng)該結(jié)構(gòu)的最后8字節(jié)非零時,才會到SIX_PROXY標(biāo)位。當(dāng)arplookup指定往rtallocl的結(jié)構(gòu)中的sin_other成員中SIN_PROXY的值時,只有路由表中那些匹配的結(jié)點的SIN_PROXY標(biāo)志。這種類型的ARP結(jié)點通常指明了作為ARP服務(wù)器的以太網(wǎng)地址。如果1)服務(wù)器收到來自主機HS的查找HD硬件地址的廣播ARP請求,主機HS認(rèn)為HD在本2)服務(wù)器回答請求,并提供本機的以太網(wǎng)地址HS將發(fā)往HD的數(shù)據(jù)報發(fā)送給服務(wù)器路由器netb使用這種類型的ARP結(jié)點,見卷14.6節(jié)中的例子??梢酝ㄟ^命令arp-apublished(proxyonly)圖21-3簡要顯示了ARP函數(shù)和選路函數(shù)之間的關(guān)系。在ARP中,調(diào)用兩個路由表arplookup調(diào)用rtallocl查找ARP如果在路由表中找到了匹配結(jié)點,且該結(jié)點的RTF_CLONING(即該結(jié)點就是目的主機的結(jié)點),則返回該結(jié)點。如果RTF_CLONING標(biāo)志位被置位,rtallocl以RTM_RESOLVE命令為參數(shù)調(diào)用rtrequest。圖18-2中的140.252.13.33和140.252.13.34140.252.13.32arptfree以RTM_DELETE命令為參數(shù)調(diào)用rtrequest,刪除對應(yīng)ARP結(jié)點的路由表結(jié)點。此外,arp命令通過發(fā)送和接收路由插口上的路由報文來ARP高速緩存。arp以命RTM_RESOLVE、RTM_DELETE和RT_GET為參數(shù)發(fā)布路由信息。前兩個參數(shù)用于2中1402521332在第19章中我們講過,每一個ifaddr結(jié)構(gòu)都有一個指向函數(shù)(ifa_rtrequest員)的指針,函在創(chuàng)建刪一個路表點時被動用。在圖6-1中,對所以太網(wǎng)備,in_ifinit將該指針指向arp_rtreques函數(shù)。因此,當(dāng)調(diào)用路由函數(shù)為ARP創(chuàng)或刪除路由表結(jié)點時,總會調(diào)用arp_rtrequest。當(dāng)任意路由表函數(shù)被調(diào)用時,arp_rtrequest函數(shù)的作用是做各種初始化或退出處理所需的工作。例如:當(dāng)創(chuàng)建新的 ARP結(jié)點時,arp_rtrequest內(nèi)要為llinfo_arp結(jié)構(gòu)分配內(nèi)存。同樣,當(dāng)路由函數(shù)處理完一個RTM_DELETE命令后,arp_rtrequest的工作是刪除llinfo_arp結(jié)構(gòu)。圖21-28顯示了arp_rtrequest函數(shù)的第一部初始化ARPtimeout

圖21-28(續(xù)92-105第一次調(diào)用arp_rtrequest函數(shù)時(系統(tǒng)初始化階段,在對第一個以太網(wǎng)接口賦IP地址時),timeout函數(shù)在一個時鐘滴答內(nèi)調(diào)用arptimer函數(shù)。此后,ARP定時器代碼每5106-107如果將標(biāo)志RTF_GATEWAY置位,則函數(shù)返回。RTF_GATEWAY標(biāo)志表明該路由表108一個帶有三種可能的switch語句:RTM_ADD、RTM_RESOLVE和RTM_DELETE(后兩RTM_ADD109RTM_ADD命令出現(xiàn)在以下兩種情況中:執(zhí)行arp命令手工創(chuàng)建ARP結(jié)點或者rtinit函110117若標(biāo)志RTF_HOST沒有置位,說明該路由表結(jié)點與一個掩碼相關(guān)(也就是說是網(wǎng)絡(luò)路由,而非主機路由)。如果掩碼不是全1,那么該結(jié)點確實是某一接口的路由,因此,將標(biāo)/etc/netstart中令routeadd-net224.0.0.0-interface為圖18-2所示網(wǎng)絡(luò)創(chuàng)建帶有RTF_CLONING標(biāo)志的路由表結(jié)118-126若標(biāo)志RTF_CLONING(in_ifinit為所有以太網(wǎng)接口設(shè)置該標(biāo)志)置位,那么該路由表結(jié)點是由rtinit添加的。rt_setgate為sockaddr_dl結(jié)構(gòu)分配空間,該結(jié)構(gòu)由rt_gateway指針?biāo)?。與圖21-1中140.252.13.32的路由表結(jié)點相關(guān)的就是該數(shù)據(jù)鏈路插口地址結(jié)構(gòu)。sdl_family和sdl_len成員的值是根據(jù)靜態(tài)定義的null_sd而初始化的,sdl_type(可能是IFT_ETHER)和sdl_index成員的值來自接口的ifnet結(jié)構(gòu)。該結(jié)構(gòu)不sdl_alen成員的值為0。127-128最后將時限值設(shè)為當(dāng)前時間,也就是結(jié)點的創(chuàng)建時間,執(zhí)行break后返回。對于在系統(tǒng)初始化時創(chuàng)建的結(jié)點,它們的rmx_expire值為系統(tǒng)啟動的時間。注意,圖21-1中該路由表結(jié)點沒有相應(yīng)的llinfo_arp結(jié)構(gòu),所以它不會被arptimer處理。但是要用它的sockaddr_dl結(jié)構(gòu),對于以太網(wǎng)中特定主機的路由結(jié)點來說,要的是rt_gateway結(jié)構(gòu),用RTM_RESOLVE命令參數(shù)創(chuàng)建路由表結(jié)點時,rtrequest該結(jié)構(gòu)。此外,netstat程序?qū)dl_index的值輸出為link#n,見圖18-2發(fā)送免費ARP130-135 若將標(biāo)志置位,則該結(jié)點是由命令帶(1)sockaddr_inarp結(jié)構(gòu)中sin_other成員的SIN_PROXY標(biāo)志被置位;(2)標(biāo)志RTF_ANNOUNCE被置位。因為標(biāo)志RTF_ANNOUNCE被置位,所以arprequest廣播免費ARP請求。注意,第二個和第三個參數(shù)是相同的,即該ARP請求中,發(fā)送方IP地址和目的方IP地址是一樣的。13 繼續(xù)執(zhí)行針對RTM_RESOLVE命令的case圖21-29顯示了arp_rtrequest函數(shù)的第二部分,處理RTM_RESOLVE命令。當(dāng)rtallocl找到一個RTF_CLONING標(biāo)志位置位的路由表結(jié)點且rtallocl的第二個參數(shù)值(arplookup的create參數(shù))不為0時,調(diào)用該命令。需要分配一個新的llinfo_ar并將其初始化。驗證sockaddr_dl

圖21-29(續(xù)137-144 驗證rt_gateway指針?biāo)傅膕ockaddr_dl結(jié)構(gòu)的sa_family和sa_len成員的值。接口類型(可能是IFT_ETHER)和索引值填入新的sockaddr_dl結(jié)構(gòu)。145146正常情況下,該路由表結(jié)點是新創(chuàng)建的,并沒有指向一個llinfo_arp結(jié)構(gòu)。如果la指針非空,則在路由已發(fā)生了變化時調(diào)用arp_rtrequest。此時llinfo_arp已經(jīng)分初始化llinfo_arp147-158 分配一個llinfo_arprt_llinfo中存有指向該結(jié)構(gòu)的指針。統(tǒng)計值變量arp_inuse和arp_allocated各加1,llinfo_arp結(jié)構(gòu)置0。將la_hold指針置空,la_asked值置0。159-161將rt指針于llinfo_arp結(jié)構(gòu)中,置RTF_LLINFO標(biāo)志位。如圖18-2所示ARP創(chuàng)建的三個結(jié)點140.252.13.33、140.252.13.34和140.252.13.35都有L標(biāo)志,和240.0.0.1樣。arp程序只檢查該標(biāo)志(圖19-36)。最后insque將llinfo_arp加入到表的首部。就這樣創(chuàng)建了一個ARP結(jié)點:rtrequest創(chuàng)建路由表結(jié)點(經(jīng)常為以太網(wǎng)克隆一個網(wǎng)絡(luò)的結(jié)點),arp_rtrequest分配和初始化llinfo_arp結(jié)構(gòu)。剩下只需廣播一個ARP請求,在收到回答后填充主機的以太網(wǎng)地址。事件發(fā)生的一般次序是:arpresolve調(diào)用arplookup,于是arp_rtrequest被調(diào)用(中間可能跟有函數(shù)調(diào)用,見圖21-3)。當(dāng)控制返回到arpresolve時,發(fā)送ARP162-173這是4.4BSD新增的測試特例部分(注釋是老版本留下的)。它創(chuàng)建了圖21-1中最右邊的路由表結(jié)點,該結(jié)點包含了本機的IP地址(140.252.13.35)。if語句檢測它是否等于本機IP174-176時限值設(shè)為0,意味著該結(jié)點是永久有效的—不會超時。從接口的結(jié)構(gòu)中將硬件地址拷貝至rt_gateway所指的sockaddr_dl結(jié)構(gòu)中。177-178 環(huán)回接口。這意味著,如果有數(shù)據(jù)報發(fā)給自己,就送往環(huán)回接口。在4.4BSD以前的版本中,可以通過/etc/netstart文件中令:routeadd140.252.13.35來建立從本機IP地址到環(huán)回接口的路由。4.4BSD第一次有數(shù)據(jù)報發(fā)給本機IP地址時,我們剛才看到的代碼會自動創(chuàng)建一個這樣的路由。此外,這些代碼對于一個接口只會執(zhí)行一次。一旦路由表結(jié)點和永久性ARP結(jié)點創(chuàng)建好后,它們就不會超時,所以不會再次出現(xiàn)對本機IP地址的RTM_RESOLLVE命令。arp_rtrequest函數(shù)的最后部分如圖21-30所示,處理RTM_DELETE請求。從圖21-3中,我們可以看到,該命令是由arp命令產(chǎn)生的,用于手工刪除一個結(jié)點;或者在一個ARP結(jié)點超時時由arptfree產(chǎn)生。驗證la

圖21-30arp_rtrequest函數(shù):RTM_DELETE182183

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論