桂林 吳夢龍
筆者單位開發刀片式服務器系統,系統包括:1 塊服務器板卡(S)、2 塊客戶端板卡(C1、C2)、1 塊交換機板卡(SW1),拓撲如圖1 所示。

圖1 原始機箱內部拓撲
服務器采用S3C2440 處理器Linux系統、客戶端板卡采用STM32F107 處理器RTThread 系統,交換機采用RTL8316 交換芯片無網管功能。系統工作在同一沖突域下。兩個客戶端板卡與服務器點對點連接、客戶端板卡之間沒有數據交換。
當僅插入板卡S、SW1、C1時工作正常,若插入C2 則會在系統啟動1 分鐘后隨機出現C1、C2 其中一個掉線,客戶端報告原因是“服務器心跳超時”,而在服務器上抓包顯示所有數據均已下發,服務器每10 秒發送一次標準TCP KeepAlive 心跳包。
為分析客戶端上實際收發的數據幀,考慮采用端口鏡像(Port Mirroring)的方法截取來往數據。
端口鏡像功能在交換機或路由器上,將一個或多個源端口的數據流量轉發到某一個指定端口來實現對網絡的監聽,指定端口稱之為“鏡像端口”或“目的端口”,在不嚴重影響源端口正常吞吐流量的情況下,可以通過鏡像端口對網絡的流量進行監控分析。在企業中用鏡像功能,可以很好地對企業內部的網絡數據進行監控管理,在網絡出故障的時候,可以快速地定位故障。
因為所有板卡均插在機箱內采用264公頭彎針代替RJ45連接,不便于修改網絡拓撲,難以滿足抓取客戶端網口上的收發數據。為此,需制作264 公頭彎針轉RJ45 接頭連接各板卡,另外添加一臺帶端口鏡像功能的H3C 交換機。

圖2 修改后的拓撲
SW1 是原系統交換機,SW2 是H3C 交換機,PC 是用于監聽流經SW2 鏡像的數據。S 和C1 連接在S1 的端口1、2 上、C2 連接在SW2 端口2 上、SW1的3 端口與SW2 的3端口相連,PC 連接在SW2 的1 端口上,如圖2 所示。
IP 分配:
S:192.168.0.254/24
C1:192.168.0.5/24
C2:192.168.0.20/24
網關都是192.168.0.1;PC:192.168.1.2/24 網關是192.168.1.1。
SW2 交換機業務配置:端口1、2 屬于VLAN2:192.168.0.1;端口3 屬于VLAN2:192.168.1.1;在端口3 上配置端口鏡像,將端口1、2 的收發數據均轉發到端口3 上。
配置VLAN 的目的是防止外部網絡廣播數據對調試網絡的影響,設置端口鏡像的目的是能夠間接在PC 上抓取S 和C2 的流量,確認S 是否真發送數據,C2 是否真沒收到數據。
PC 通過SSH 登錄S 和C2,輸入“netstat”觀察連接狀態看到只有C2 的IP 與S 連接,S 發送心跳能成功被PC 抓取到,C2 運行良好;開啟C1 后S 上能看到C2 的IP,S 上兩個連接狀態都是ESTABLISHED;S 向兩連接發送心跳,再此期間PC 抓取不到任何從S 流經C2 方向的數據,1 分鐘后PC 抓取到從C2 流經S 方向“斷開連接”數據幀,原因是“服務器心跳超時”。
由以上現象推斷問題可能是SW1 轉發錯誤或S 未發送數據。
C2 上有30 秒自動重連接機制,但都直至4~5 分鐘才能連接成功。當C2 發起重連接成功之后,PC 收到一條S 流經C1 的心跳數據。
由此推斷問題出在SW1 上,按照以太網的最短路由設計,S 和C1 都是SW1 的直連網絡,他們之間的流量不應該通過端口3 發往SW2。
通過Wireshark 查看數據幀,發現S 流經C1 和S 流 經C2 數 據幀目的MAC 地址都是00:80:E1:33:38:33。
由此確認是C1 和C2 的MAC 地址綁定沖突,如圖3、圖4 所示。

圖3 C1:192.168.0.5 的MAC

圖4 C2:192.168.0.20 的MAC
STM32F107 處理器芯片自身攜帶有9 字節表示序列號,MAC 地址僅需要6字節,于是驅動設計者截取部分序列號作為MAC 地址,截取部分恰好是序列號高6 字節,如兩芯片序列號是01:02:03:04:05:06:07:08:09 和01:02:03:04:05:06:07:08:0A,則MAC 地址都是01:02:03:04:05:06。解決方法只要選擇低6 字節即可。
原系統拓撲上電后C2 發起ARP 請求,包含它的IP2 和MAC-a。SW1 和S 收到后有不同的動作:SW1 更新MAC-a 在端口3 方向,S 在自己的ARP 表里添加記錄IP2和MAC-a 映射關系。
接著C1 發起ARP 請求,包含它的IP1 和MAC-a,SW1更新MAC-a 在端口2 方向,S的ARP 表添加IP1 和MAC-a映射關系。
倘若S 向C2 發送心跳數據,數據幀目的MAC 地址是MAC-a,目 的IP 是IP2。SW1收到數據后在MAC 地址表里尋找MAC-a 對應的端口,由于最后一次ARP 請求是由C1發起的,C1 刷新SW1 中MAC地址表,最終SW1 將數據發往端口2,由于C1 的IP 并不是數據幀期望的IP2 不匹配,所以C1 丟棄數據幀,而C2將長時間收不到S 的數據,出現“服務器心跳超時”斷開連接。
ARP 表默認5 分鐘后過期,也就是為什么C2 斷開后10 秒重連接失敗的原因,直至4~5 分鐘ARP 表過期重發起ARP 請求,刷新SW1 的MAC地址表才連接成功。C1 和C2 的MAC 沖突屬于競爭模式,相互刷新SW1 的MAC 地址表和S 的ARP 表,帶來的結果是不定時掉線。