深入浅出多网卡绑定技术
生活随笔
收集整理的這篇文章主要介紹了
深入浅出多网卡绑定技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在存儲系統中為了提高后端設備的吞吐量,往往需要采用多網卡綁定技術。例如,后端存儲最大能夠提供300MB/s的吞吐量,因此需要采用3塊1Gps的網卡并發傳輸才可以達到峰值性能。那么,從研發的角度來看如何實現多網卡綁定呢?這里對提高吞吐量用途的多網卡綁定技術進行深入分析。 多網卡綁定一方面能夠提高網絡吞吐量,另一方面也可以增強網絡高可用。這里對高可用應用的多網卡綁定技術不做討論。從軟件的角度來看,多網卡綁定實際上只需要提供一個額外的bond驅動程序即可,通過該虛擬網卡驅動程序可以將實際多塊網卡屏蔽,對TCP/IP協議層而言只存在一個Bond網卡。在Bond驅動程序中實現網絡流量的負載平衡(load balance),將一個網絡請求重定位到不同的網卡(NIC)上,以此來提高總體網絡的性能。多網卡綁定的軟件層次架構如下圖所示:
?
考慮一下,為了綁定多塊網卡,其技術難點在于什么地方?網絡交換機是通過物理地址進行端口路由的,對于不支持IEEE802.3ab協議的普通交換機而言,其只能連接不同物理地址的網卡,否則交換機將會無法正常工作。每個網絡適配器具備一個IP地址,而每個IP地址又通過ARP協議和一個MAC地址綁定在一起。由此分析,在沒有交換機的配合下,我們很難實現想象中完美的多網卡綁定通信模型:?
如果ARP協議能夠支持將一個IP地址映射到多個MAC地址,那么在Bond驅動層我們完全可以實現上圖所示的多網卡綁定通信模型。在實際IP網絡中,為了達到上述綁定效果,需要交換機的802.3ab協議支持,通過交換機實現round robin方式的網卡綁定,純軟件方法無法做到。基于802.3ab協議的多網卡綁定如下圖所示:?
在802.3ab的支持下,Server端所有網卡的MAC地址全部配置成一個,例如MAC-A,然后在交換機端將這些端口聚合起來。交換機在接收到數據報文之后會輪詢這些端口將數據報文發送給Bond驅動,Bond驅動想發送數據的時候同樣通過輪詢方法將數據報文交給不同網卡進行傳輸。這種方法可以對Client端進行透明,從整體架構上來說比較簡單,唯一缺點是需要交換機的支持。個人認為對于存儲系統而言,這種方案是目前網卡綁定的最佳方式。 除了交換機支持的解決方案之外,當然我們也可以采用純軟件的方法,只不過這種綁定在有些應用中有所局限。一種比較簡單的綁定思想是只對Transmit進行綁定(Linux Bond5 Mode)。該綁定模型如下圖所示:?
在這種模型中,Client向Server發送ARP請求,Server將Bond適配器的MAC地址告訴給Client。Bond適配器驅動程序會選擇一個Slave-NIC的MAC地址作為自己的MAC地址。例如,Client-B向Server發送ARP請求,Server會將MAC-C地址告訴給Client-B。因此,Client端發送的數據報文會全部被MAC-C地址所在的NIC接收。換句話說,所有Client了解到Server的MAC地址都是MAC-C,Client看不到Server端其他NIC的MAC地址。在Server端發送數據報文的時候,Server端封裝的Source-Address都是Bond適配器配置的MAC地址,目的地址是Client NIC所在的MAC地址。在數據發送的時候,Bond驅動程序會根據一定算法將發送報文均勻分配到所有NIC上,由于NIC驅動不會更改以太網報文中的內容,通過這種方式,Bond驅動可以充分利用所有網卡的物理帶寬。這種方法實現簡單,Bond驅動程序不需要截獲傳輸報文的任何數據,只需要選擇網卡進行數據傳輸即可。由于Client只知道一個網卡的物理地址,所以無法實現多網卡的并發數據接收,只能實現并發數據發送。對于只關注數據發送吞吐量的應用,這種解決方案還是非常有效的。 在存儲應用中,需要考慮雙向數據傳輸的吞吐量,上述解決方案存在數據接收瓶頸。那么如何才能使得Server進行高效的雙向數據傳輸呢?其關鍵問題在于需要讓Client知道不同網卡的MAC地址,上述解決方案中,所有的Client只知道一個MAC地址。為了達到雙向傳輸的效果,Bond驅動程序需要截取ARP報文和數據報文,并且修改MAC地址。這種網卡綁定的數據傳輸模型(Linux Bond6 Mode)如下圖所示:?
在Client向Server發送ARP請求的時候,Bond驅動程序會截取返回給Client的ARP應答報文,并且選取一個Slave-NIC的MAC地址,用這個MAC地址修改ARP應答報文。通過這種方式,Server將一塊網卡分配給一個Client,每個Client分配得到不同NIC的MAC地址,從而Client可以通過不同的網卡實現數據傳輸。在多Client的情況下,實現Server端并發數據接收。在Server端數據發送的時候,Bond驅動程序需要截取發送數據報文,并且修改以太網報文中的源MAC地址(bond_alb_xmit函數實現了Bond的數據發送功能),然后通過算法選擇一塊NIC發送數據,實現并發數據傳輸(數據報文發送并不固定在一塊網卡上,上圖的演示模型只是一個特例)。這種方案和上述方案最大的不同是Bond驅動程序需要截獲ARP和正常的數據報文,并進行處理。從Client而言,每個Client的數據發送可以綁定到一個單獨的NIC卡上。 這里對多網卡的綁定技術進行了一些總結,這些技術還是值得慢慢品味的。轉載于:https://blog.51cto.com/alanwu/1095566
總結
以上是生活随笔為你收集整理的深入浅出多网卡绑定技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: M3U8文件IV值及KEY获取
- 下一篇: 时间显示软件SHOW_TIME的设计与实