?? 以太地址轉換協議.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0077)http://www.longen.org/E-K/detaile~k/EthernetAddressResolveGeneralProtocol.htm -->
<HTML><HEAD><TITLE>新建網頁 0</TITLE>
<META http-equiv=Content-Language content=zh-cn>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META http-equiv=Content-Type content="text/html; charset=gb2312"></HEAD>
<BODY>
<TABLE id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<H4>一個以太地址轉換協議</H4>
<P>摘要</P>
<P>實現一個協議P,要使S主機通過P協議的路由機器發現目標機T并最終將數據傳送到目標機。這一切要求通過以太網進行,為了完成傳送必須知道以太網上的以太網地址才行,但是P協議中的地址可能并不與以太網地址相兼容,因此必須有一種機制使P協議中的地址A變成以太網地址。本文并不針對某一種協議,而是一個通用的方法。這里使用的數字遵守以太網標準,即高位優先。這與一些機器的地址標準不同,如PDP-11s和VAX機。因此我們必須注意以下要描述的操作碼域(ar$op)。</P>
<P>問題:</P>
<P>------------</P>
<P>在網絡的各層中,有不同的協議可供使用,而以太網標準使得所有的數據可被封裝在一個包中,再加上一個標記就能夠在同一個電纜上傳送。但這也帶來了問題,因為以太網使用的是48位的地址,而其它協議中使用的地址卻不一定與它長度一致。因此我們要求某一個協議X能夠動態地在<protocol,
address>和48位以太網地址之前進行轉換。</P>
<P>提議:</P>
<P>-----------</P>
<P>現在以太網已經成為一種廣泛使用的標準,在如果進行這種地址轉換的問題上有兩種做法:(1)每個廠商自己設置標準,進行自己的地址轉換,或(2)大家遵守一個共同的標準,以便得軟件在轉移到另外的系統時不需要進行變化。本文即希望提出這樣一個標準。</P>
<P>定義:</P>
<P>------------</P>
<P>我們定義下面的一些數值用于填充現有的以太包頭:</P>
<P>ether_type$XEROX_PUP,<BR>ether_type$DOD_INTERNET,<BR>ether_type$CHAOS,
<BR>下面這個域是新加入的域:<BR>ether_type$ADDRESS_RESOLUTION.
<BR>我們也定義下面的一些值:<BR>ares_op$REQUEST (= 1, 高位優先)<BR>ares_op$REPLY (= 2),
<BR>ares_hrd$Ethernet (= 1).</P>
<P>包格式:</P>
<P>--------------</P>
<P>為了將<protocol,
address>映射到48位以太地址,我們需要一個可以包括地址解析協議的包格式。這個包的格式如下:</P>
<P>Ethernet傳輸層(可以不讓用戶訪問這些域)<BR>48.bit: 目的以太地址<BR>48.bit: 源以太地址<BR>16.bit:
Protocol type = ether_type$ADDRESS_RESOLUTION<BR>Ethernet包數據:<BR>16.bit:
(ar$hrd) 硬件地址<BR>16.bit: (ar$pro)
協議地址空間,對于以太網硬件來說,這來自ether_typ$<protocol>的值<BR>8.bit: (ar$hln)
每個硬件地址的字節長度<BR>8.bit: (ar$pln) 每個協議地址的字節長度<BR>16.bit: (ar$op) opcode
(ares_op$REQUEST | ares_op$REPLY)<BR>nbytes: (ar$sha)
發送者硬件地址,n來自ar$hln的值<BR>mbytes: (ar$spa) 發送者協議地址,m來自ar$pln的值<BR>nbytes:
(ar$tha) 目標地址(可能未知)<BR>mbytes: (ar$tpa) 目標機協議地址</P>
<P>產生包:</P>
<P>------------------</P>
<P>在網絡層傳送數據包的時候需要知道如何通過路由機制將數據傳送到目的機,因此我們必須知道如果將當前包傳送到下一個接收單位去。在以太網的情況下,我們必須通過一個地址轉換模塊將<protocol
type, target protocol
address>轉換到以太網地址。這個模塊基本是試圖在一個表中尋找這個這個對應關系。如果找到了,那萬事大吉;如果沒有找到,模塊會通知用戶重新傳送這個包,自己已經將這個包拋棄(因為此模塊假定更高的網絡層會重新傳送這個包),同時模塊會產生一個以太包,這個包中有一個類型域ther_type$ADDRESS_RESOLUTION。地址解析模塊要設置</P>
<P>ar$hrd域=ares_hrd$Ethernet<BR>r$pro=需要被解析的協議類型<BR>ar$hln=6(以太網地址的字節數,48位/8位=6)<BR>ar$pln=協議地址長度<BR>ar$op=ares_op$REQUEST<BR>ar$sha=自己的以太地址<BR>ar$spa=自己的協議地址<BR>ar$tpa=機器試圖訪問的協議地址<BR>模塊不設置ar$tha,因此此值是要求的值,當然為了實現方便可以將它設置為硬件的廣播地址。</P>
<P>接收包</P>
<P>-----------------</P>
<P>當收到地址解析包時,接收方的解析模塊利用下面的算法確定需要的地址,最后一個ELSE代表處理結束,要拋棄這個包。</P>
<P>?Do I have the hardware type in ar$hrd?<BR>Yes: (almost
definitely)<BR>[可以檢查硬件長度ar$hln]<BR>?Do I speak the protocol in
ar$pro?<BR>Yes:<BR>[可以檢查協議長度ar$pln]<BR> Merge_flag :=
false<BR> If the pair <protocol type, sender protocol address>
is already in my translation table, update the sender hardware address
field of the entry with the new information in the packet and set
Merge_flag to true. <BR>[因為接收到的數據包中已經包括發送方的協議地址和硬件地址,這可是寶貴的信息呀]<BR>
?Am I the target protocol address?<BR> Yes:<BR> If
Merge_flag is false, add the triplet <protocol type,sender protocol
address, sender hardware address> to the translation table.<BR>
?Is the opcode ares_op$REQUEST? (NOW look at the
opcode!!)<BR> Yes:<BR>
Swap hardware and protocol fields, putting the local hardware and protocol
addresses in the sender fields. Set the ar$op field to ares_op$REPLY Send
the packet to the (new) target hardware address on the same hardware on
which the request was received.</P>
<P>這里要注意的是在進行操作以前<protocol type, sender protocol address, sender
hardware
address>已經被加入到包中,因為接收方可以利用這個數據包中已經有的協議地址和硬件地址,說不定以后要通信的時候這個可以用得上呢。一般地說,ar$hrd和ar$hln域也可用于非以太網的情況。</P>
<P>為什么這么處理?</P>
<P>-------------------------</P>
<P>定時進行廣播不是不行,假設有100個工作站,每個工作站每10分鐘廣播一次消息,整個網絡每6秒有一個這樣的數據,也不是不行,可這樣的數據有什么用呢?本文中的協議只在需要的時候進行廣播,或者只在啟動的時候進行一次廣播。本文的協議只考慮用一個包進行解析,沒有考慮到一個包進行多個地址的解析,一個為了方便,另一個考慮到需要一個包解析多個地址的情況不多,這樣會造成浪費。本文中的格式考慮到了應答包中的信息可以再次被使用,因為應答包和請示包的長度和格式一樣,因此程序實現起來比較方便。ares_hrd$Ethernet
=
1這個值即是為了以后擴展而使用的。如果以后再有協議需要使用此協議,則可以將這個值設置為其它值。對于以太網,ar$pro指定的是協議類型,它和ar$op一起共用1個域,這使得可指定的協議數減少,而且使得網絡監視變得比較復雜。我們希望不要看到以后出現32768個協議,但我們不能做這個假設。理論上,ar$hln和ar$pln是多余的,因為這兩個長度可以通過硬件類型(在ar$hrd中)和協議類型(在ar$pro中)獲得,包括它們只是為了進行一致性校驗和網絡監視。其中opcode表示這個包是請求還是對原先請求的應答,16位是多了一點,但這個標記還是需要的。其它的一些位是需要的。包中沒有填充位,可以將它看做一個流。</P>
<P>網絡監視:</P>
<P>---------------------------------</P>
<P>這個協議可以讓下層了解上層協議的一些運轉情況。我們可以假設有一個監視機收到一個解析包,它將<protocol type, sender
protocol address, sender hardware
address>輸入一個表。監視機可以通過ar$hln和ar$pln確定硬件地址長度和協議地址長度。如果opcode=REPLY,此包被拋棄,如果opcode=REQUEST而且目標地址與本機的目標地址一致,監視機返回REPLY。監視機也可能會發出自己的REQUEST,在這種情況下,兩臺監視機可能會產生一個REQUEST的循環,這一點要特別注意。</P>
<P>例子:</P>
<P>-----------</P>
<P>有兩臺機器共在一個以太網中,它們的以太網地址分別是:EA(X)和EA(Y)。網絡地址分別是:IPA(X)和IPA(Y),我們設置網絡的以太類型為ET(IP),機器X剛剛啟動,遲早它要與Y機進行通信,它知道Y機的協議地址IPA(Y),現在X機需要通過<ET(IP),IPA(Y)>知道Y機的以太網地址。下面即是它發出的數據包:</P>
<P>(ar$hrd) = ares_hrd$Ethernet<BR>(ar$pro) = ET(IP)<BR>(ar$hln) =
length(EA(X))<BR>(ar$pln) = length(IPA(X))<BR>(ar$op) =
ares_op$REQUEST<BR>(ar$sha) = EA(X)<BR>(ar$spa) = IPA(X)<BR>(ar$tha) =
任意值<BR>(ar$tpa) = IPA(Y)</P>
<P>此包被廣播。</P>
<P>Y機接收到這個包,發現包中的協議地址與自己的協議地址一致,它將X機的協議地址和以太地址先保存在自己的表中。因此此包表示的是請求,因此Y機將自己的硬件寫入到包中,將包設置為REPLY,此時Y已經知道如何將此包返回給X,而X還不知道Y的信息。當X收這個包的時候,它已經從<ET(IP),
IPA(Y)>求得了EA(Y),因為是應答包,因此X機將此包拋棄。下回它再要與Y機進行通信的時候就不用再廣播了,因為已經知道Y機的以太地址了。同樣Y機要與X機進行通信時也不需要進行廣播,因此它已經從X機的請示包中知道了X機的以太地址。</P>
<P>其它問題:</P>
<P>---------------</P>
<P>在這一節里我們要了解如何使對應表中的表項使效。如何進行失效已超出本文的范圍,在這里僅做以介紹。如果一個機器移動,或因為某種原因改變了協議地址與物理地址的對應關系,這時就需要一種失效算法。我們可以假設利用包中的以太地址進行傳輸時如果傳輸延時超過某一個定值,我們就認為這個表項已經失效。我們可以要求改變了的主機在啟動時重新廣播自己的協議地址和硬件地址,也可以利用一個守護進程定時向目標機發出數據包以檢查表中的表項是不是已經不存在。如果因為機器已經更換了網卡,換了以太網地址,這時手工進行設置也是辦法。</P></TD></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -