《部署IPv6网络(修订版)》一2.4 邻居发现协议
本節書摘來自異步社區《部署IPv6網絡(修訂版)》一書中的第2章,第2.4節,作者【美】Ciprian Popoviciu , Eric Levy-Abegnoli , Patrick Grossetete,更多章節內容可以訪問云棲社區“異步社區”公眾號查看
2.4 鄰居發現協議
部署IPv6網絡(修訂版)
大約在10年以前,RFC 1970初步設計并公布了IPv6鄰居發現。從那時之后在RFC 2461中進行了修改,一個新的版本(重點在改錯而不是修改)是在RFC 2461bis中進行的。一些擴展已經在反向鄰居發現(RFC 3122)、缺省路由器選擇(RFC 4191)和自動配置(RFC 2462)中描述。
在這10年當中,Internet團體的重點發生了重大轉變,原來沒有得到很多關注的領域,如安全性和移動性,現在是大多數努力的重點。該重點的轉變導致了許多擴展、修正和相互影響,這在許多RFC和Internet草案中作了描述:在MIPv6中的移動性擴展(RFC 3775)、在安全鄰居發現中的安全特征(SEND)(RFC 3971)、檢測網絡連接(DNA)(RFC 4135)、網絡訪問的攜帶認證協議(PANA)(RFC 4058)和優化的DAD(draft-ietf-ipv6-optimistic-dad)。
當連接到相同鏈路時,IPv6 NDP為路由器和主機運行提供了許多集成的關鍵特征。這些特征中的某些特征,如地址解析和重定向,在IPv4中出現過,但分別在不同的具體協議如ARP和ICMP中重定向。其他特征——如前綴發現和鄰居不可達性檢測——是新的,雖然有些可以使用IPv4中的其他方式也能做到。表2-12列出這些特征和在IPv4中的對應特征。
NDP以不同方式應用到主機和路由器。依據前面列表中的特征,表2-13試圖將主機和路由器角色分開。
IPv6 ND和其相應的IPv4協議組(ARP、IPCP等)之間的本質差別之一是,在IP協議棧中的位置不同。雖然IPv4相同鏈路相關的協議在ARP/RARP(正好在鏈路層之上)和ICMP(運行于IP之上)之間分割,而IPv6 ND完全在ICMPv6之內實現。圖2-20重點突出了協議棧之間的差別。
ND在協議棧中的位置,其原因是多方面的,但如果僅有一個原因應該提出的話,那就是簡單性。如果能夠避免的話,為什么要將地址解析作為一個特例(在IPv4中的ARP和RARP)?當是ICMP內部,而不是與IP并列時,這種特性能夠從IP所提供的任何服務中受益,包括安全性(認證頭部)、多播等。
為了確保NDP中各種功能的安全,安全鄰居發現引入了一組特定的ND選項,它們用來保護NDP消息。雖然在回顧IPv6時沒有深入討論這些選項的細節,但您可以參考RFC 3971獲得SEND的更多信息。
2.4.1 協議操作總結
NDP使鏈路上的每個節點能夠運行ND,建立必要的做出正確判定的知識,這些知識在發送IPv6分組到一個鄰居時用到。這種知識代表了從路由器和節點接收到的公告的匯總。這些公告可以是請求的或非請求的。這種信息存儲在由節點維護的下列列表中:
在線IPv6地址和相應的鏈路層地址列表;
鄰居狀態(可達的,不可達的);
特定主機:
在線前綴列表;
在線路由器列表;
缺省路由器列表(樂意成為缺省路由器的在線路由器)。
為了得到上述信息,在NDP中用到下列消息:
路由器請求(RS);
路由器公告(RA);
鄰居請求(NS);
鄰居公告(NA);
重定向;
反向鄰居請求(INS);
反向鄰居公告(INA)。
NDP直接位于IPv6/ICMP之上產生了一系列值得澄清的問題。
當進行匹配的一個給定目的地址的鏈路層地址不知道時,尋求該關聯的節點必須將其請求發送到更廣大的偵聽節點。在IPv4中,使用MAC層廣播做到這點。在IPv6中,節點在這個請求中使用多播。使用的多播組是被請求節點多播組(具有鏈路本地范圍),如2.1節所描述。
注釋:
注意當知道一個前綴的鏈路層地址之后,鄰居請求可能再次發送,以確認關聯信息(IP地址,鏈路層地址)。在此情況下,請求直接單播到目的地。
當一個節點使用NDP獲得其自己的地址時(參見“自動配置”部分),出現了另一個問題。它需要用于其請求的一個源地址,但還沒有這樣的地址。在這樣的情況下,它能夠將IPv6非指定地址(::)用做分組的SA。
鑒于地址解析消息發送到被請求節點多播地址(具有鏈路本地范圍),其他NDP消息則意圖到達所有節點或所有路由器。同時,SA可能是發送者的一個全局的或鏈路本地地址:后者總是優先使用,以最小化節點對重新編址的依賴。下面是所有特殊地址的列表,在NDP消息交換中節點能夠將之用做源和目的地地址:
所有節點多播地址(FF02::1,目的地);
所有路由器多播地址(FF02::2,目的地);
被請求節點多播地址(目的地);
鏈路本地地址(源或目的地);
非指定地址(::,源)。
最后,IPv6節點使用兩個算法來處理通過NDP搜集的信息:
下一跳確定算法;
缺省路由器選擇。
2.4.2 與IPv4的比較
在相應的IPv4協議之上,IPv6 NDP提供了許多功能提升,如下所示:
路由器發現成為協議的不可分割部分,使主機能夠確定它們的缺省路由器。
在ND消息中插入了附加信息,如MTU或鏈路層地址,這減少了鏈路上需要的信息交換數量,卻取得IPv4中相同的結果。下面是一些示例:
在RA消息中攜帶路由器的鏈路層地址。因此鏈路上的所有節點,在沒有任何額外的消息流的情況下,知道了這個地址;
目標鏈路層地址,插入在重定向消息中,為接收者(被重定向的)節省了任何額外的地址解析信息交換;
MTU,在RA中攜帶,使鏈路上的所有節點使用一致的MTU。
地址解析使用多播組(被請求節點多播地址),內嵌目標地址的一部分。因此,大多數情況下可能只有少數(大部分時間僅有目標地址所有者)節點將被這個地址解析請求打斷。將此與IPv4 ARP比較,其中除了廣播(鏈路層廣播)地址解析請求(因為ARP直接位于鏈路層之上)之外別無他法。人們希望解析鏈路層地址的IPv6方法將使擁有大量主機的子網更具有管理性,其方式是通過大量限制鏈路層廣播范圍,以使主機軟件層能夠處理。
有些新的功能是基本協議的一部分,如地址自動配置和鄰居不可達性檢測,簡化了配置并提高了分組分發的魯棒性。
路由器公告和重定向消息以鏈路本地地址形式攜帶路由器地址,這使在主機中的路由器關聯信息對重新編址(針對全局前綴)更具有魯棒性。在IPv4中,當網絡每次更改其尋址機制時,在主機上的缺省網關信息必須修改。
地址解析位于ICMP之上,使之在ND消息中可能使用標準的IP認證和安全機制。在IPv4的ARP中不存在這樣的機制。
2.4.3 路由器和前綴發現
路由器發現使主機能夠定位鄰接(在線)的路由器,并學習和地址配置相關的前綴和參數。
為路由器和前綴發現定義了兩條消息:路由器請求(RS)消息和路由器公告(RA)消息。
通過在每個接口發送RA,路由器周期性地公告自身(引入一點隨機性以避免同步,這可能會出現在某些時間段內沒有路由器被公告的情況發生)。這些非請求RA發送到所有節點“鏈路本地范圍多播地址”(FF02::1)。除了提供路由器地址外,RA能夠包含主機執行下一跳判定的有用信息,如下所示:
缺省路由器的候選路由器列表(參見“缺省路由器選擇”部分所描述的算法)。
應該用于自動配置的參數(參見“自動配置”部分)。
在線前綴列表(參見2.4.8小節),該信息使路由器發現消息在前綴發現過程中非常有用。
RA消息也能作為來自主機請求(RS)的一個響應發送。這個選項在移動性中證明非常有用,用來加速自動配置。這些被請求的RA或者發往所有節點地址或發往RS的主機的單播地址。由于RS請求來自在線路由器的一個響應,典型情況下它發往所有路由器多播組。圖2-21給出了一個被請求的和一個非請求的RA信息交換的流程。
注釋:
在一種被請求的RA情況下,當RS沒有提供任何IPv6 SA時(典型情況是依靠RA自動配置自身的主機),RA響應發送到所有節點。
圖2-22給出一個簡單示例,其中一臺Cisco路由器(Valbonne)發送周期性的RA給一臺主機(主機1)。接口配置是灰色的,打開了NDP排錯,debug輸出顯示在RA流程下面。
圖2-22顯示了和RA流程交織在一起的debug跟蹤信息。
show ipv6 routers命令在Cisco路由器上用來顯示從其他在線路由器接收到的RA信息。僅有1臺路由器發送RA,僅有1臺主機將之安裝到它們的數據庫(譯者注:路由數據庫)中。因此在圖2-22的配置中,這條命令僅適用于主機1(在主機模式中的一臺Cisco路由器)。例2-10顯示了該命令的輸出。
例2-10 從主機角度來看被公告的路由器
2.4.4 地址解析
鄰居請求和鄰居公告分組用來執行幾個關鍵的節點操作:
鏈路層地址解析;
重復地址檢測(DAD);
鄰居不可達性檢測(NUD)。
DAD和NUD在下一小節中描述。ND鏈路層解析提供了與IPv4中ARP類似的服務,雖然使用的方法有些不同。
為IPv6地址解析定義了兩條ICMPv6消息:鄰居請求(NS)消息和鄰居公告(NA)消息。NS是請求并包含目標(被請求的)IPv6地址。NA是響應且包含了匹配接口的鏈路層地址。
當一個節點得知一個特定的下一跳或目的IPv6地址在線時(參見2.4.8小節的“下一跳判定”部分),它在確定的鏈路上發送一條NS,以獲得匹配IPv6地址的鏈路層地址。預期的響應是一條NA。
NS是到被請求節點多播組的多播分組,內嵌了被請求IPv6地址的右面24位。潛在地存在多個節點注冊到相同的被請求節點多播地址,該地址的“擁有者”是其中一個。擁有者和多播組的其他成員均收到這個NS,但只有擁有者以NA回答。
注釋:
NDP是一種可靠的協議。在大多數鏈路類型上,這工作得很好,因為“丟失”一條消息(如一條NS或NA)的概率較低。但在無線鏈路上,這可能成為一個問題。特別地,DAD可能斷定一個地址是可以自由使用的,但事實上,NA丟了。
一臺主機也能夠發送一條非請求的NA。當然節點期望通知鏈路上的其他節點,通知它的鏈路層地址發生了變化。非請求的NA發送到所有節點多播地址。
在節點接收到NA之后,斷定從其接收到這條信息的鄰居是“可達的”。監測可達性是NUD的目的。參見2.4.8小節有關“鄰居不可達性檢測”和“可達性的狀態機”部分以了解細節。圖2-23顯示出地址解析過程的流程。
在Cisco路由器上,關聯(第3層地址,鏈路層地址)存儲在鄰居緩存中。在每臺路由器上運行命令show ipv6 neighbor,列出鄰居緩存的內容。在例2-11中,biot鄰居緩存有兩個條目與路由器valbonne相關:地址是2001:200::72b和FE80::A8BB:CCFF:FE01:F600。它們列出的是“可達”狀態,同時還有相應的鏈路層地址。
2.4.5 將一臺主機重定向到一個更合適的下一跳
路由器發送重定向消息,通知主機一個更合適的下一跳,無論是另一臺路由器還是最后的目的地自身,它應該在相同鏈路上。IPv6重定向機制類似于IPv4重定向機制。僅有一條消息,即重定向消息,是獲得重定向功能所必要的。它包含更合適下一跳的IP地址和重定向的目的地IP地址。如果更合適下一跳(R2)的鏈路層地址已知,它能夠插入到由發出重定向消息的路由器(R1)所發送的重定向分組中。
注釋:
在理論上,前面所描述的過程能夠在主機和路由器R2之間節省一次地址解析信息交換。在實際中,這可能受限。路由器R2在某些情況下可能將某些流量路由到主機。如這樣做的話,它將需要發起一個NS/NA交換以確定主機的鏈路層地址。如果主機已經發起過一個尋找R2鏈路層地址的地址解析流,那么這個流就是不必要的。NS發起者的鏈路層地址可能確實作為一個選項已經插入到NS分組中。
圖2-24顯示了重定向消息的流程。
2.4.6 反向鄰居發現
如前所述,ND為IPv6執行了IPv4中ARP的相同功能。在此上下文中,驅使產生反向ARP協議的類似原因導致對IPv6 ND的擴展,稱為IPv6反向鄰居發現(IND)。這個擴展的詳細內容在RFC 3122中規范。
IPv6 IND使一個節點能夠學習已知鏈路層地址的IPv6地址。為了獲得這個信息,它發送請求并接收公告。IND最早是為幀中繼網絡開發的,但也可以應用到其他具有類似行為的數據鏈路層技術。兩條信息——反向鄰居發現請求(INS)和反向鄰居發現公告(INA)——已經定義。INS包含源鏈路層地址和目標鏈路層地址(發送者意圖得到它的IPv6地址)。應答(INA)包含源鏈路層地址、目標鏈路層地址和一個目標地址列表。它包含接口的一個或多個IPv6地址列表,該接口由觸發INA的INS消息中的目標鏈路層地址標識。
請注意,在撰寫本書之時,在Cisco路由器上不支持RFC 3122。
2.4.7 代理鄰居發現
一個IPv4節點具有為不理解子網的主機代理子網(或者被錯誤配置)或缺省路由器的能力。這項功能有時指代理ARP,在RFC 1027中規范。IPv6沒有傳承該概念;相反,它要求IPv6主機處理RA并且在非本地流量能夠發送之處配置一臺缺省路由器。對多數系統而言,代理整個子網可能是不可操作的。它們將接口設置在混雜模式,或所有多播模式以接收所有NS,但是除了可能引發性能問題之外,不是所有系統都支持這些模式。
在一些情況下,對路由器可能證明是有用的,即它代替遠離鏈路的節點,但這些節點不想讓其鄰居知道它們不在線上。一個典型范例是一個移動節點已經離開鏈路。為了獲得這種有限的代理地址解析功能,路由器必須注冊到它想代理的被請求節點多播地址并代替它們應答NS。
2.4.8 鄰居發現算法
已經定義了許多ND算法描述主機和路由器在多種運營環境中的預期行為。下面的小節討論了這些算法。
一、下一跳判定
像在IPv4中一樣,一個需要轉發分組的節點必須判斷目的地是在線還是離線。在后一種情況中,它之后必須找到一個在線鄰居(下一跳),該鄰居能夠將分組轉發到目的地。最后,它必須解析在線目的地地址或在線下一跳,將之解析成一個鏈路層地址。
不像IPv4,一個目的地(或下一跳)能夠是在線的,不必轉發節點具有匹配目的地址的前綴。如果滿足下列情況,節點認為一個地址是在線的:
通過它的鏈路地址前綴之一它將能被覆蓋到;
從那個地址收到一條NA;
從那個地址收到任意ND消息;
它收到一條RA,其中在前綴信息選項中有這個前綴;
它收到一條重定向消息,其目標地址等于那個地址。
用來轉發分組的算法在主機和路由器上有不同設置。一臺路由器有一個路由選擇表和一個鄰居緩存(和IPv4的ARP緩存相同)。前者(路由信息庫或RIB)包含匹配給定目的地的下一跳(最長匹配);后者包含在線節點的鏈路層地址,或者是最終目的地或者是下一跳。Cisco路由器也有一個轉發表(轉發信息庫,或FIB),它將RIB更進一步,通過預解析遞歸表項以加快轉發過程。在路由器中,常規路由機制優先于從鄰居路由器通過前綴發現或路由器發現機制獲得的信息。之后NS/NA消息激活鏈路層解析。
例2-12顯示出圖2-24中一臺路由器的路由選擇表和鄰居。
例2-12 在一臺IPv6路由器上的路由選擇和鄰居信息
另一方面,在主機上,如路由選擇表或路由選擇協議等信息是不必要的。
RFC 2461描述了一組在主機中支持下一跳判定的概念性數據結構:
目的地緩存——包含最近有流量轉發到的目的地,還有下一跳(鄰居)選擇用來提供到鄰居緩存的連接。這個緩存由從重定向消息獲得的信息進行更新。
前綴列表——包含匹配在線地址的前綴列表。這個列表從RA消息構建而來。
缺省路由器列表——包含分組能夠發送到的在線路由器列表。
圖2-25顯示出基于RFC 2461的下一跳判定算法的主機模型。
主機首先在目的地緩存中進行搜索,期望搜索到近期發送分組的目的地。如果是,目的地緩存給出使用的下一跳(可能是目的地自身),對鄰居緩存的后續搜索可能給出鏈路層地址。以粗線表示的路徑,在確定的流程中將最常用到。如果目的地不在目的地緩存中,將在前綴列表中搜索(由來自RA的信息維護)。作為最后的方法,通過缺省路由器選擇從所有在線路由器(通過發送RA獲知)中選擇一臺缺省路由器。
二、缺省路由器選擇
這又是一個針對主機的算法。路由器僅依賴于路由選擇協議(和路由選擇表)做出正確的下一跳判定。
不像IPv4,在一臺IPv6主機上不必定義一個缺省網關。主機為轉發其流量選擇一臺路由器作為下一跳的過程,在Internet草案“缺省路由器優先和更具體的路由”中描述。它確定了3種不同類型的主機如下:
A類——忽略缺省路由器優先級以及在RA選項路由信息中的更具體路由的主機。(參見“路由器和前綴發現”部分以了解詳細信息)。這些主機簡單地運行在RFC 2461中描述的路由器選擇算法。基本情況下,A類主機從其缺省路由器列表中(從和主機共享一條鏈路的路由器收到的RA中構建的)選擇一臺缺省路由器。如果存在任何可達路由器(依據狀態機,稱之為可達的;見“可達性狀態機”部分),它應傾向于選擇之,否則如果存在任何其他在列表中的路由器,則選擇之。如果選中的路由器是不可達的,應從列表中的所有其他路由器中按序選擇(因此,確保列表上的所有路由器由鄰居不可達性檢測算法進行探測)。
B類——類似于A類主機,其中缺省路由器列表由RA中接收到的優先級(低、中、高)獲得增強。缺省路由器選擇能夠基于這個優先級而不是基于輪詢方式。
C類——實現路由選擇表的主機。當它們接收到一條含有多個路由信息選項的RA時,它們安裝一條缺省路由::/0,指向發出RA的路由器;它們也安裝(或如果生命時間為0就卸載)指向在路由信息選項中發現的前綴路由,出現幾次就安裝幾次。當一臺C類主機執行下一跳判定并關于一個離線的目的地查詢它的路由選擇表時,它首先傾向于選擇可達路由器,之后才是不可達路由器;之后它使用最長匹配前綴;再后,它使用路由優先級數值。
注意,不同類型的主機,在接收到相同RA分組時(在鏈路上的多播),選擇缺省路由器時,可能最終作出不同的判定。
注釋:
如前所述,鏈路上的每臺路由器可能公告前綴的一個列表,并建議將自己作為缺省路由器。一臺雙接入的主機可能潛在地從兩臺或多臺路由器接收到不連續的前綴列表,并從一個列表中選擇一個前綴用于自動配置,形成一個SA。它之后可能使用這個地址(使用SAS選定)離開子網(譯者注:發送分組),通過的路由器是不通告形成這個地址的前綴的。
三、重復地址檢測
如在RFC 2462中所描述的,NS和NA消息也用來執行重復地址檢測(DAD)。在將所有單播地址配置到一個接口之前,都要對其執行DAD。基本原則是節點發送一條NS,請求一個IPv6地址所有者,僅在沒有收到關于此請求的響應時才將地址配置到其自身的一個接口上。
優化的DAD正在建議對現有IPv6 ND(RFC 2461)和無狀態地址自動配置(RFC 2462)算法進行修改。其目的是最小化成功情況下的地址配置延遲(被節點選中的地址是唯一的),并在失敗情況下盡可能地減少中斷時間。優化的DAD僅在自動配置地址情況下執行。它是一個有用的優化,因為對于良好分布的隨機地址或從唯一MAC以修改EUI-64格式構建的基于接口ID的地址,DAD成功的幾率遠高于失敗。
注釋:
DAD不必在任意播地址上執行,因為從定義角度而言,一個任意播地址屬于多個節點。
四、鄰居不可達性檢測
與一個鄰居的通信由于多種原因可能失敗。如果到目的地的路徑(在鏈路上)已經出現故障,恢復是可能的。當檢測到故障時所觸發的恢復機制,依據鄰居是否是最終目的地而不同。如果是,應該初始地址解析。否則,應該選擇一個不同的下一跳。這就落在了下一跳判定算法范疇(在“下一跳判定”中已解釋),其中能夠使用兩種機制。路由器通常使用它們的路由選擇表,而主機運行路由器選擇算法(參見“缺省路由器選擇”部分)。
鄰居不可達性檢測(NUD)用來處理檢測故障。一個鄰居的可達性以兩種可能的方式獲得。第一種方法是來自于高層的確認,即與這個鄰居的通信正在進行(例如,接收到TCP分組確認了以前發送的分組)。第二種方法是接收到一條NA,這是對一條NS的響應,由節點發出用于尋求可達性確認。任何其他方法,例如RA,不能用來確認一個鄰居的可達性。除非有新的確認開始,鄰居之后保持一段有限時間的可達性。如果確認不是按照時序方式接收到,鄰居就被認為是不可達的,恢復機制就發生作用。在ND緩存中的鄰居表項的完全狀態圖在下面詳細描述。
五、可達性狀態機
鄰居緩存維持一個鄰居列表,其中流量最近向它們發送過。
圖2-26顯示出鄰居緩存的一個狀態圖。
在圖2-26中,下列事件將產生5個狀態之一的狀態遷移(INCOMPLETE、REACHABLE、DELAY、STALE和PROBE):
NA1——收到一條Solicited=0(被請求=0)的NA。
NA2——收到一條Solicited=1(被請求=1)的NA。
NA3——收到一條NA,其中Solicited=1(被請求=1)且
Override=1(改寫=1);
Override=0(改寫=0),鏈路層地址與緩存的內容相同。
NA4——收到一條NA,其中Solicited=1(被請求=1)、Override=0(改寫=0),鏈路層地址不同于緩存內容。
NA5——收到一條NA,其中Solicited=0(被請求=0)、Override=1(改寫=1),鏈路層地址不同于緩存內容。
O——收到其他ND分組,例如NS、RS、RA、重定向,鏈路層地址不同于緩存內容。
S——發送分組。
T——超時(注意每個狀態有一個定時器,進入狀態時開始計時)。
Te——超時且重試次數。
U——高層可達性確認。
一個表項的典型生命期示于(以雙重方式)圖2-26中的狀態圖中。一個表項是一個IPv6地址和一個鏈路層地址間的映射。表項創建時狀態為INCOMPLETE(鏈路層地址不可知),這時發送一條NS以獲得鏈路層地址。一旦收到響應(NA),表項就移到REACHABLE狀態,并且流量被轉發。如果在某個時間段內(通常為30s)路由器看不到鄰居流量,表項移到STALE狀態。從那里,表項可能直接移回REACHABLE(典型情況下是收到高層可達性確認)或者轉到DELAY(如果有分組發送到這個鄰居),其中要發送一條新的NS,或者在STALE狀態(典型情況以小時計)一段時間之后被刪除(在我們的例子中)。
六、自動配置
地址自動配置用來自動為一臺主機配置地址。在RFC 2462中規范了地址自動配置。它使用NDP(更具體的是RA)來獲得前綴,基于這個前綴構建地址,接著ND(更具體的是NS和NA消息)測試構建的地址是否已經在用。自動配置的缺省機制是無狀態的。另外一種機制,即有狀態的,能夠使用且在RFC 3315中規范。這兩種機制在第3章的3.2.1小節中描述。
2.4.9 鄰居發現一瞥
表2-14總結了ND信息以備快速查閱。
表2-14 NDP一瞥
1SLLA:源鏈路層地址。
2TLLA:目標鏈路層地址。
3必要的選項。
IPv6絲毫不限于本章所提到(回顧)的協議。但本章講到了基礎元素(基本協議),為您提供了理解IPv6和IPv4間大多數差異的工具。牢記這些內容,下一章考察IPv6網絡服務,這些協議全部構建于IPv6尋址、ICMPv6和鄰居發現協議之上。
總結
以上是生活随笔為你收集整理的《部署IPv6网络(修订版)》一2.4 邻居发现协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Visual C++ 开发从入门到精通
- 下一篇: 《Linux设备驱动开发详解 A》一一2