?? rfc1433.txt
字號:
組織:中國互動出版網(http://www.china-pub.com/)
RFC文檔中文翻譯計劃(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
譯者:董士嬋(董士嬋 dsc_0522@sina.com)
譯文發布時間:2001-3-27
版權:本中文翻譯文檔版權歸中國互動出版網所有。可以用于非商業用途自由轉載,但必須保留本文檔的翻譯及版權信息。
Network Working Group J. Garrett
Request for Comments: 1433 AT&T Bell Laboratories
J. Hagan
University of Pennsylvania
J. Wong
AT&T Bell Laboratories
March 1993
直接ARP
(Directed ARP)
本備忘錄狀態
這個備忘錄為internet通信定義了一個實驗的協議。為需求的增長提出討論、建議。標準的說明和協議的狀態請參照“IAB Official Protocol Standards”當前的版本。這個備忘錄的表述是不受限制的。
摘要
路由器的一個接口通過同一個鏈路層接口到達兩個IP網絡時可以觀察到那兩個IP網絡共享了那個鏈路層網絡, 并且能通告信息到主機(via ICMP Redirects)和路由器(via dynamic routing protocols)。然而一個主機或路由器如果在“foreign”IP 網絡到他們的響應鏈路地址不能夠解析IP地址則不能用來與其他主機和路由器在僅僅一個IP網絡上直接通信。直接ARP是一個動態地址解析過程可以使主機和路由器在外部IP網絡到他們的鏈路地址上解決可能的通告到next-hop IP地址。
鳴謝
作者感激Network Ssystems Corporation的Joel Halpern和David O'Leary,他給作者提供了寶貴的評論和見解,而且給予了精神上的支持并通過草稿給予了物質上的支援。IPLPDN工作組的成員通過IPLPDN郵件列表和介紹也提供了有價值的觀點。Rutgers University 的Chuck Hedrick,Bell Communications Research的PaulTsuchiya,AT&T Bell Laboratories的Doris Tillman提供了早期的洞察作為早期的草稿。
1 術語
鏈路層網絡是時常參照子網(e.g.OSIparlance)以上的那層例如IP以下的那層。術語“鏈路層”被用來區別與“IP子網”可能引起的混亂,并傳輸IP數據報識別網絡組地址。
從主機路由器的遠景, 如果主機或路由器沒有IP網絡地址,IP網絡是外部的。
2 介紹
多個IP網絡可以在同一個鏈路層被管理(例如:在大的公共數據網絡)。在兩個IP網絡上的單獨接口的路由器用現行的路由更新過程去通告那兩個IP網絡共享那個鏈路層網絡。Cost/performance的益處是可以實現如果主機和路由器不在同一個IP網絡上也可以通告信息,直接交換數據,不如通過雙重路由地址。但是如果不首先解決IP地址到數據鏈路層地址的映射,主機或路由器不能直接通訊。
控制ARP烘泛的蔓延。路由器執行的直接ARP過程能限制同一ARP請求的數量(例如:同一源IP地址和同一目的IP地址)則他將每隔一小段時間轉發(例如:每秒不超過一個ARP請求)。在[5]中一貫建議的阻止ARP洪泛的過程。
為每一個IP網絡獨立的建立IP地址解決過程。例如:在SMDS網絡,解決地址可以用ARP實現,獨立的SMDS ARP請求地址與每個IP網絡映射。如果主機或路由器沒有配置ARP請求地址,無法知道每個IP網絡的ARP請求地址,不能給正確的ARP請求地址發送ARP請求。以太網的主機或路由器通過發送ARP請求到廣播地址解析IP地址去猜測鏈路層地址。但是如果IP網絡用不同的解析過程(例如:實施地址解析表),ARP回應不回應。
直接ARP是能使路由器在共享的鏈路層網絡能通告一個IP地址也能幫助解決IP地址到鏈路層地址的映射的過程
在解除地址解析的限制,直接ARP能通告和應用動態的路由協議如BGP、OSPF的路由信息中的外部網絡的下一跳地址。另外,直接ARP能使路由器通告(通過ICMP )外部主機的下一跳地址,主機能用直接ARP去解決外部的下一跳地址。
3 直接ARP
直接ARP用正常的ARP包格式,并用ARP過程的協助,在[1],[2]中定義,路由器和主機運行這些過程。
3.1 ARP求助地址
ARP求助地址主機路由器維護路由信息,定位路由表。每個路由表登記一個或多個到目的IP地址的下一跳IP地址和物理接口用來傳輸包到下一跳IP地址。如果目的地址是本地的(例如;沒有路由器的協助可以到達),下一跳IP地址是NULL(或本地設備,如IP地址映射到物理接口)。否則,下一跳IP地址是下一個路由器的地址。主機或路由器貫徹直接ARP過程映射ARP求助地址到路由表的每個記錄。如果主機或路由器已經配置了到鏈路層地址的下一跳IP地址的解析(或如果下一跳IP地址為空,解析目的IP地址),則ARP求助地址的映射為空。否則,ARP求助地址是提供路由信息、指導下一跳地址的路由器的IP地址,是同一鏈路層網絡作為映射的物理接口第四張提供動態路由過程決定ARP求助地址的詳細范例
3.2地址解析過程
傳輸一個IP包,主機路由器搜索路由表的記錄,最優路徑依靠目的IP地址和其他的因素(例如:服務類型)。選擇路由表記錄包括:下一跳路由器的IP地址(可能為空),轉發IP包的物理接口,ARP求助地址(可能為空)和其他信息。路由功能通過下一跳IP地址、物理接口、ARP協助地址完成地址解析功能。地址解析功能必須能解析下一跳IP地址(或目的IP地址,如果下一跳IP地址為空)到鏈路層地址的映射。IP包被轉發的鏈路層地址,及應該被轉發的鏈路層幀地址映射的鏈路層地址封裝IP包,并且轉發幀通過正確的物理接口。此功能的詳細描述通過以下C語言源代碼。
此過程被兩個函數組織。Route()和Resolve()各是路由和地址解決。另外,以下各層函數被應用:
Get_Route(IP_Add,Other) returns a pointer to the routing table
entry with the destination field that best matches IP_Add. If no
matching entry is found, NULL is returned. Other information such
as Type of Service may be considered in selecting the best route.
Forward(Packet,Link_Level_Add,Phys_Int) fragments Packet (if
needed), and encapsulates Packet in one or more Link Level Frames
addressed to Link_Level_Add, and forwards the frame(s) through
interface, Phys_Int.
Look_Up_Add_Res_Table(IP_Add,Phys_Int) returns a pointer to the
link level address associated with IP_Add in the address
resolution table associated with interface, Phys_Int. If IP_Add
is not found in the address resolution table, NULL is returned.
Local_Add_Res(IP_Add,Phys_Int) returns a pointer to the Link Level
address associated with IP_Add, using address resolution
procedures associated with address, IP_Add, and interface,
Phys_Int. If address resolution is unsuccessful, NULL is
returned. Note that different address resolution procedures may
be used for different IP networks.
Receive_ARP_Response(IP_Add,Phys_Int) returns a pointer to an ARP
Response received through interface, Phys_Int, that resolves
IP_Add. If no ARP response is received, NULL is returned.
Dest_IP_Add(IP_Packet) returns the IP destination address from
IP_Packet.
Next_Hop(Entry) returns the IP address in the next-hop field of
(routing table) Entry.
Interface(Entry) returns the physical interface field of (routing
table) Entry.
ARP_Helper_Add(Entry) returns the IP address in the ARP Helper
Address field of (routing table) Entry.
ARP_Request(IP_Add) returns an ARP Request packet with IP_Add as
the Target IP address.
Source_Link_Level(ARP_Response) returns the link level address of
the sender of ARP_Response.
ROUTE(IP_Packet)
{
Entry = Get_Route(Dest_IP_Add(IP_Packet),Other(IP_Packet));
If (Entry == NULL) /* No matching entry in routing table */
Return; /* Discard IP_Packet */
else
{ /* Resolve next-hop IP address to link level address */
If (Next_Hop(Entry) != NULL) /* Route packet via next-hop router */
Next_IP = Next_Hop(Entry);
else /* Destination is local */
Next_IP = Dest_IP_Add(IP_Packet);
L_L_Add = Resolve(Next_IP,Interface(Entry),ARP_Helper_Add(Entry));
If (L_L_Add != NULL)
Forward(IP_Packet,L_L_Add,Interface(Entry));
else /* Couldn't resolve next-hop IP address */
Return; /* Discard IP_Packet */
Return;
}
}
路由功能的C語言源代碼.
Resolve(IP_Add,Interface,ARP_Help_Add)
{
If ((L_L_Add = Look_Up_Add_Res_Table(IP_Add,Interface)) != NULL)
{ /* Found it in Address Resolution Table */
Return L_L_Add;
}
else
{
If (ARP_Help_Add == NULL)
{ /* Do local Address Resolution Procedure */
Return Local_Add_Res(IP_Add,Interface);
}
else /* ARP_Help_Add != NULL */
{
L_L_ARP_Help_Add = Look_Up_Add_Res_Table(ARP_Help_Add,Interface);
If (L_L_ARP_Help_Add == NULL)
/* Not in Address Resolution Table */
L_L_ARP_Help_Add = Local_Add_Res(ARP_Help_Add,Interface);
If (L_L_ARP_Help_Add == NULL) /* Can't Resolve ARP Helper Add */
Return NULL; /* Address Resolution Failed */
else
{ /* ARP for IP_Add */
Forward(ARP_Request(IP_Add),L_L_ARP_Help_Add,Interface);
ARP_Resp = Receive_ARP_Response(IP_Add,Interface);
If (ARP_Resp == NULL) /* No ARP Response (after persistence) */
Return NULL; /* Address Resolution Failed */
else
Return Source_Link_Level(ARP_Resp);
}
}
}
}
}
地址解析功能的C語言源代碼。
3.3轉發ARP請求
主機執行直接ARP過程用標準過程去處理收到的ARP回應。就是說,如果目標IP地址是主機的地址,主機用標準過程響應ARP請求;如果目標IP地址不是主機地址,主機立刻拋棄ARP請求。
如果被路由器收到目標ARP請求的IP地址是路由器的地址,路由器用標準過程響應ARP請求。但是如果目標IP地址不是路由器的地址,路由器可以轉發回ARP請求通過接收的那個接口,到路由表中與鏈路層地址相符的ARP求助地址。以下C語言源代碼描述的過程用來處理ARP請求。函數Receive()描述跟隨主機路由器的過程,函數Direct()描述跟隨路由器的其他過程。另外,以下函數也被用到:
Is_Local_IP_Add(IP_Add,Phys_Int) returns TRUE if Phys_Int has been
assigned IP address, IP_Add. Otherwise, returns FALSE.
Do_ARP_Processing(ARP_Request,Interface) processes ARP_Request
using ARP procedures described in [2].
I_Am_Router returns TRUE if device is a router and False if device
is a host.
Target_IP(ARP_Request) returns the Target IP address from
ARP_Request.
Filter(ARP_Request,Phys_Int) returns TRUE if ARP_Request passes
filtering constraints, and FALSE if filtering constraints are not
passed. See section 3.4.
Forward(Packet,Link_Level_Add,Phys_Int) fragments Packet (if
needed), and encapsulates Packet in one or more Link Level Frames
addressed to Link_Level_Add, and forwards the frame(s) through
interface, Phys_Int.
Look_Up_Next_Hop_Route_Table(IP_Add) returns a pointer to the
routing table entry with the next-hop field that matches IP_Add.
If no matching entry is found, NULL is returned.
Look_Up_Dest_Route_Table(IP_Add) returns a pointer to the routing
table entry with the destination field that best matches IP_Add.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -