多連線windows系統的源IP地址選擇策略
原文地址:http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx
下面只是其中翻譯的一部分
當傳送資料報的時候,計算機究竟選擇哪個網絡卡介面卡來使用通常是非常令人困惑的。本部落格描述了在多連線計算機上,計算機為向外的連線選擇網路介面卡的過程,並且討論瞭如何為本次連線選擇本地源IP地址。
什麼是源IP地址選擇?
源IP地址選擇:指協議棧如何選擇一個IP地址的過程。
WindowsXP和Windows Server 2003是基於弱主機模式的。
當Windowssocket程式繫結到一個socket的時候,通常會為向外的資料報指定(源)IP地址,該地址作為呼叫bind()函式的一個引數。大多數的程式並不瞭解網路的拓撲結構,所以更多情況是在他們的bind()函式呼叫中指定IPADDR_ANY而不是特定的IP地址。IPADDR_ANY告訴協議棧程式將由協議棧來選擇最優的本地IP地址使用。
WindowsXP行為
WindowsVista之前的Windows作業系統的TCP/IP元件是基於弱主機模式。當程式開發者設計使用網路並且和微軟產品相容的程式時,這種模式給程式開發者最大的餘地。因為開發者必須指定程式如何訪問TCP/IP協議棧並響應進出的幀,這種模也就將控制網路程式行為的的責任拋給了開發者。
在只有一個網路介面卡的計算機上,選擇的IP地址是計算機上網路介面卡的主IP地址。然而,在多連線計算機上,協議棧必須首先做選擇。協議棧不可能做出一個明智的選擇直到它知道了連線的目標IP地址。
當程式傳送一個connect()呼叫到目的IP地址,或者傳送send()呼叫來發送UDP報文,協議棧參考目的IP地址,之後檢查IP路由表來選擇傳送資料包的最優網路介面卡。當選擇網路介面卡之後,協議棧讀取該網路介面卡的主IP地址,並且使用該IP地址作為向外資料包的源IP地址。
例如:
呼叫中的源請求:IPADDR_ANY
目標IP:192.168.1.5
路由表:
網絡卡介面1-192.168.1.10/32
網絡卡介面1 - 192.168.1.11/32
網絡卡介面2- 10.0.0.10/32
網絡卡介面2 - 10.0.0.11/32
選擇的源IP:192.168.1.10
選擇的源網絡卡介面:網絡卡介面1
如果程式在bind()呼叫中指定了源IP地址,那麼該IP地址就作為連線的socket的源IP地址。然而,依舊需要使用路由表基於目標地址來路由向外的IP資料包。該行為的直接結果就是,源IP地址或許和選擇傳送報文的網路介面卡不相關,即源IP地址並不在選擇的網路介面卡上。
例如:
呼叫中的源請求:10.0.0.10
目標IP:192.168.1.5
路由表:
網絡卡介面1-192.168.1.10/32
網絡卡介面1 - 192.168.1.11/32
網絡卡介面2- 10.0.0.10/32
網絡卡介面2 - 10.0.0.11/32
選擇的源IP:10.0.0.10
選擇的源網絡卡介面:網絡卡介面1 注意:該介面不是源IP地址所在的網絡卡介面卡介面。
總結
如果沒有指定源IP,那麼最匹配目標IP地址的路由中的介面卡的主IP地址將被用來源IP來發送資料報,並且與主IP地址相關聯的介面卡作為源介面卡。
如果指定了源IP,那麼用來發送資料報的介面卡將是最匹配目標IP地址的路由中的介面卡,該介面卡或許並不是源IP的相關聯的介面卡。
Windows Vista/Windows Server 2008行為
WindowsVista和之後的Windows系統都是基於強主機模式的。在強主機模式下,主機只能使用傳送資料報源IP地址對應的網路介面卡介面,當然主IP地址的概念也就不復存在了。
與XP類似,當程式沒有指定源IP地址時,協議棧參考目標IP地址,之後查詢整個IP路由表來選擇傳送資料報的最佳網路介面卡。當網路介面卡選擇之後,協議棧採用RFC 3483中定義的地址選擇程式來選擇向外資料報的源IP地址。
例如:
呼叫中的源請求:IPADDR_ANY
目標IP:192.168.1.5
路由表:
網絡卡介面1 -192.168.1.10/32
網絡卡介面1 -192.168.1.11/32
網絡卡介面2- 10.0.0.10/32
網絡卡介面2 - 10.0.0.11/32
選擇的源IP:10.0.0.10
選擇的源網絡卡介面:網絡卡介面2 注意:該網絡卡介面是源IP所在的介面
注:資料報將會發送到網絡卡介面2上的預設閘道器。
小注:
另外一篇寫的比較的強弱主機模式對比的文章地址為:http://technet.microsoft.com/zh-cn/magazine/2007.09.cableguy.aspx 由於原文不讓隨便複製貼上,我只好把地址貼到這裡了,有需要了解學習的朋友可以去看下,裡面有更詳細的說明以及windows vista以及之後的系統配置強弱主機模式的命令列指令。
採用強主機模式,就可以在Windows下實現類linux系統的繫結網絡卡裝置程式設計了,當然這也和linux下的基於源IP地址路由策略有的一比。