資源描述:
《arpc源代碼注釋》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Arp.c——源代碼注釋小組成員:李婷1071000114羅雪1071000118史雅萌1071000119古麗布斯1071000301ARPARP,即地址解析協(xié)議,實現(xiàn)通過IP地址得知其物理地址。地址解析協(xié)議ARP是在主機ARP高速緩存(ARPcache)中存放一個從IP地址到硬件地址的映射表,并且這個映射表還經(jīng)常動態(tài)更新?;驹恚寒斨鳈CA要向本局域網(wǎng)上的某個主機C發(fā)送IP數(shù)據(jù)報時,就先在其ARP高速緩存中查看有無主機C的IP地址。如有,就在ARP高速緩存中查出其對應(yīng)的硬件地址,再把這個硬件地址寫入MA
2、C幀,然后通過局域網(wǎng)把該MAC幀發(fā)往此硬件地址。如果在ARP緩存表中沒有找到目標IP地址,可能是主機C才入網(wǎng),也可能是主機A剛加電,其高速緩存還是空的。這種情況下,主機A就自動運行ARP,然后按以下步驟找出主機C的地址。1.ARP進程在本局域網(wǎng)上廣播發(fā)送ARP請求分組。分組內(nèi)容表明:我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18請問IP地址為209.0.0.6的硬件地址是什么?”2.在本局域網(wǎng)上的所有主機上運行的ARP進程都收到此ARP請求分組。3.主機C在ARP請求分組中見
3、到自己的IP地址,就向主機A發(fā)送ARP響應(yīng)分組,并寫入自己的硬件地址。其余的所有主機都不理睬這個ARP請求分組。響應(yīng)分組表明:我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。4.主機A接受到主機C的ARP響應(yīng)分組后,就在其ARP高速緩存中寫入主機C的IP地址到物理地址的映射。在完成以上步驟的同時A和C還同時都更新了自己的ARP緩存表,下次A再向主機C或者C向A發(fā)送信息時,直接從各自的ARP緩存表里查找就可以了。大大增加了網(wǎng)絡(luò)上的通信量。ARP緩存表采用了老化機制(即設(shè)置了
4、生存時間),在一段時間內(nèi)(一般15到20分鐘)如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少ARP緩存表的長度,加快查詢速度。設(shè)想有一種情況,主機A和C通信,A的ARP高速緩存里有C的硬件地址,但C的網(wǎng)絡(luò)適配器突然壞了,C立即更換了一塊,因此C的硬件地址就改變了,A在其ARP緩存中查找原先的硬件地址,因為C原先的硬件地址已經(jīng)失效,所以無法找到C,但是如果過了定時器設(shè)定的時間,A的緩存表中已經(jīng)刪除了C的硬件地址,于是A重新廣播發(fā)送ARP請求分組,又可以找到C.使用ARP的四種典型情況1.發(fā)送方是主機,
5、要把IP數(shù)據(jù)報發(fā)送到本網(wǎng)絡(luò)上的另一個主機。這時用ARP找到目的主機的物理地址。2.發(fā)送方是主機,要把IP數(shù)據(jù)報發(fā)送到另一個網(wǎng)絡(luò)上的一個主機。這時用ARP找到本網(wǎng)絡(luò)上的一個路由器的物理地址。剩下的工作由這個路由器來完成。3.發(fā)送方是路由器,要把IP數(shù)據(jù)報轉(zhuǎn)發(fā)到本網(wǎng)絡(luò)上的一個主機。這時用ARP找到目的主機的物理地址。4.發(fā)送方是路由器,要把IP數(shù)據(jù)報轉(zhuǎn)發(fā)到另一個網(wǎng)絡(luò)上的一個主機。這時用ARP找到本網(wǎng)絡(luò)上的一個路由器的物理地址。剩下的工作由這個路由器來完成。1、Arp_tablearp_tbl是一個類型為stru
6、ctneigh_table的全局變量,它是一個ARP的緩存表,也稱為鄰居表。協(xié)議棧通過ARP協(xié)議獲取到的網(wǎng)絡(luò)上鄰居主機的IP地址與MAC地址的對應(yīng)關(guān)系都會保存在這個表中,以備下次與鄰居通訊時使用,同時,ARP模塊自身也會提供一套相應(yīng)的機制來更新和維護這個鄰居表。下面逐個分析arp_tbl中的重要成員數(shù)據(jù)與函數(shù):1)entry_size,key_len,kmem_cachepentry_size是一個入口的大小,也就是arp_tbl中一個鄰居的大小,鄰居用structneighbour結(jié)構(gòu)體表示,該結(jié)構(gòu)體的最
7、后一個成員是u8primary_key[0],用于存放IP地址,作為這個鄰居的哈希主鍵。entry_size的大小就是sizeof(structneighbour)+4,由于用IP地址作主鍵,所以key_len就是4。kmem_cachep是一個后備高速緩存,創(chuàng)建一個鄰居需要的內(nèi)存從這個后備高速緩存中去取。2)hash_buckets,hash_mask,entries,hashhash_buckets是一個哈希數(shù)組,里面存放了arp_tbl當前維護的所有的鄰居,hash_mask是哈希數(shù)組大小的掩碼,其初
8、始值為1,所以hash_buckets的初始大小為2(0到hash_mask的空間范圍)。entries是整個arp_tbl中鄰居的數(shù)量,當entries大于hash_mask+1的時候,hash_buckets增長為原來的兩部。成員hash是一個哈希函數(shù)指針,用于計算哈希值。3)phash_buckets,PNEIGH_HASHMASK這是用于代理ARP的鄰居哈希表,PNEIGH_HASHMASK固定為0xF,