0731-84728105
15116127200
二層交換機原型設計與實現(三)
發布時間:2021-05-10
  &nbs高工p;  二層交換機的主道體要功能就是在端口之間搬移分(fēn)組,當然是行報要根據正确的目标地址來搬移,涉及到以太網幀格式的解析、源和相土目的MAC地址的提取,MAC表的設計、查找和老化火校等等一(yī)系列的系統功能實現。我(wǒ)(wǒ)們開(kāi)始設山站計交換機并不考慮那麽多,從簡單入手,輕裝上兒司陣,你也許會走得更好。
   &nb術業sp; 上一(yī)篇文章我(wǒ)又哥(wǒ)們學會了打印分(fēn)組的基本信息和将分(f畫綠ēn)組發送到指定端口輸出。今天我(wǒ)(wǒ)們就可刀藍以來實現一(yī)個簡單的交換功能,完成兩台主機之間的正常通信了。 姐朋
   &從路nbsp; 1)端口交換
   &n聽月bsp; 顧名思義,就是隻識别判斷端口号就将分(fēn)組進身物行交換轉發,先實現一(yī)個基于端口的交換功能。固定邏輯隻能實現固定的兩個端術件口交換,我(wǒ)(wǒ)們可以将要交換的兩個端口從程序啓動時作爲參數農玩輸入,這樣就可以在啓動命令時按需要指定要交換的兩個端口參空秒數了。
     音員增加兩個端口變量的全局定義,并在main函數的參數輸入開公中(zhōng)獲取輸入的值,如:

/*端口交換要使用的兩個全局端口号變量*/
int port1 = 0,port2 =雨能 0;

/*main函數中(zhōng)添加如下(xià)代碼*/
else if(argc == 5)
{
debug = atoi(argv[1]);
mid = atoi(argv[2]);
port1 = atoi(argv[3]);
port2 = atoi(argv[4]);
}

/*callback函數中(zhōn生哥g)添加如下(xià)代碼*/
if(pkt->um.inport == port1)
pkt->um.outport志歌 = port2;
else
pkt->um.outport = 影一port1;

     照兒; 2)驗證
    內劇; 編譯代碼并執行生(shēng)成文錢聽件命令,觀察打印消息。

root@HNXS:/home/hnxs/l2switch# 商愛make
gcc -o ul2switch main_ul2s明購witch.c -lua -lreg -lpthread
root@HNXS:/home/hnxs/l2sw你身itch# ./ul2switch 1 130 0 習媽2
fastU->REG Version:20180827,O電的penBox HW Version:2020210329
fastU->Register UA to FAST Kernel視爸! Wait Reply......
fastU->UA->pid:短在2132,mid:130,Register OK!
fastU->libua version你視:20180827
fastU->fast_ua_recv......
inport:2,dstmid:130,len:9友自2,dmac:FF:FF:FF:FF:FF:FF,smac:B8志船:27:EB:C1:D1:39
pkt_send_normal->人拍0xb5500470,outport:0,len:92
inport:0,dstmid:130,聽很len:92,dmac:B8:27:EB:C1:D1:39,sm開海ac:B8:27:EB:D8:83:20
pkt_send_normal->0xb5500470,ou市湖tport:2,len:92
inport:2,dstmid:130,len對學:130,dmac:B8:27:EB:D8:83:20,smac:B8:27:子內EB:C1:D1:39
pkt_send_normal->0xb5500小謝470,outport:0,len:130
inport:2,dstmid:130,len房影:130,dmac:B8:27:EB:D8:83:20,sm吧機ac:B8:27:EB:C1:D1:39
pkt_send_normal->0xb5500了拿470,outport:0,len:130

    不花; 同時,在一(yī)個測試主機上內兵ping另一(yī)台測試主機的IP,發現已經ping通了。很老

64 bytes from 192醫會.168.2.117: icmp_seq=10農紙 ttl=64 time=2.02 ms
64 bytes from 192.168.2.117: icmp線錯_seq=11 ttl=64 time=0.742人風 ms
64 bytes from 192.168.2.117: icmp南雨_seq=12 ttl=64 time=0.597 ms

   放但;  3)思考 低秒
    相通 從上述交換打印分(fēn)析,前兩個報文應該是ARP分(fēn)愛車組,32字節metadata加60字節以太幀數據。第1個是廣播請求,第2個是單能老播應答。第3和第4個報文就是第1組ping的交互數據了,标準ping的9下機8字節(130-32=98)。
    美靜; 先不往大(dà)了說,至少民什我(wǒ)(wǒ)們前面添加了幾行代碼就實現了我(wǒ)(wǒ近白)們的一(yī)個最基本的原型交換了,如果要換低相端口測試,隻需要在啓動命令時更改相應的端口号參數就行了。那交換機端口多了,用戶弟海多了之後呢?我(wǒ)(wǒ)們豈不是要不斷回來的啓動程序和設置端購好口來保證他們通信呢?這是不是跟解放(fàn為新g)前的電(diàn)話(huà)接線員(yuán)工(gōng)作問關有點類似?接線員(yuán)接到電(diàn)話(huà)後,先要詢問打電(d場玩iàn)話(huà)的人要打給誰,然後再把線給連過去(qù)。當然,原來的電工飛(diàn)話(huà)通信與分(fēn開現)組交換還是有些較大(dà)區别,隻是類比好舞一(yī)下(xià),不擴展細說。 哥山
   &nb電年sp;  在分(fēn日畫)組交換的頭部攜帶有該分(fēn)組要去站習(qù)往的目的地址,我(wǒ)(wǒ)們管他叫目的MAC地址。在以太房知網網絡中(zhōng),任意一(yī)個通信錢舞終端都必須具備一(yī)個唯一(yī)的MAC地址,用作通信内容土低标識。在基于端口交換的基礎上,我(wǒ)亮有(wǒ)們也可以很容易的實現一(yī)個基于MAC地址的簡單交換功電雪能。至于爲什麽選目的MAC作爲交換判斷參數,大問吧(dà)家細想肯定能明白(bái)。
   秒玩   1)MAC交換
    水兵; 根據以太網幀格式定義,從分(fēn)組土鄉頭部位置提取目的MAC作爲判斷參數,實現一(yī)個基跳車于MAC地址的交換功能。既然要根據目的MAC地畫吧址來做轉發,我(wǒ)(wǒ)們需要知(zhī)道哪一(yī)個MAC地址的主廠男機連接在交換機的哪一(yī)個端口上面,假設我(wǒ)(wǒ)們已經獲房醫取了這些信息如下(xià):

主機MAC地址:B8:27:EB:D8:83:20,國多交換機端口:0
主機MAC地址:B8:27:EB:C1:D1:39,交換做體機端口:2

替換原來端口交換的邏輯代碼,替換代碼如湖雜下(xià):

/*新增兩個MAC的内存格式定義,與S4平台(ARM)相關哦*/
u64 mac1 = 0x2083D8EB27B8,mac2短會 = 0x39D1C1EB27B8;

/*注釋原來端口轉發邏輯,添加MAC轉發邏輯*/
if(!ether_addr_equal(pkt->data,(u8 *)&樹章mac1))
pkt->um.outport = 0;
else if(!ether_addr_equal(pkt->d大車ata,(u8 *)&mac2))
pkt->um.outport = 2; 小國

   爸路  ether_addr_equal函數是判斷兩習門個MAC地址是否相等,詳情參閱代碼。
   &nbs算白p; 兩個MAC地址的定義準确來說要根據M鄉理AC的順序方式表示後再做網絡序轉換,爲簡化邏輯和方便驗證,直接定義成了小(問暗xiǎo)端平台下(xià)反序方式,這樣正好跟網絡序的M厭文AC地址對比相等。關于平台數據的大(dà)小(xiǎo)端的問題或睡到主機序與網絡序問題,請網上搜索學習。
     2)驗子子證
編譯代碼并執行生(shēng)成文件命令,觀察打印消息。 會銀

root@HNXS:/home/hnxs/l2switc山門h# make
gcc -o ul2switch main_ul2switch.c -lua 雪高-lreg -lpthread
root@HNXS:/home/hnxs/l2醫一switch# ./ul2switch
fastU->REG Version:20180827還他,OpenBox HW Version:202國街0210329
fastU->Register UA to FAST K自車ernel! Wait Reply....低鄉..
fastU->UA->pid:2255,mid:129,Regis花相ter OK!
fastU->libua version:20180827
fastU->fast_ua_recv......
inport:0,dstmid:129,len動看:92,dmac:FF:FF:FF:FF:FF:FF,smac:B8:2知地7:EB:D8:83:20
pkt_send_normal->0xb5400470,outport:匠嗎0,len:92
inport:0,dstmid:129,len:92,dmac謝土:FF:FF:FF:FF:FF:FF,smac:B8:2業化7:EB:D8:83:20
pkt_send_normal->0xb5400470,o遠海utport:0,len:92
inport:0,dstmid:129,le好說n:92,dmac:FF:FF:FF:FF:FF:FF,smac關光:B8:27:EB:D8:83:20
pkt_send_normal->0xb5人店400470,outport:0,len:92 明請

   那影  同時,在2端口測試主機上ping另一(yī)台測試時影主機的IP,發現ping不通哦。這是因爲我(wǒ)(wǒ)們現在的邏輯呢東沒有考慮ARP廣播MAC地址的處理邏輯,導緻其無法正常轉發。機吃本節暫不處理廣播的泛洪轉發功能,後續文章中(zhōng)與組播一(y民做ī)起讨論。
     那如何對的讓兩邊主機不發ARP廣播直接發ping的分(fēn)組呢?和低了解網絡通信原理的人都知(zhī)道,這個廣播是在ping日用之前發出的MAC地址學習分(fēn)組,如果沒有學習到對端的說冷MAC地址,則ping的分(fēn)組無法完下是成二層協議的封裝,無法從協議棧發出。使用如下(xià)命令分(fē動城n)别在兩台主機上進行對端IP與對端MA下黑C的靜态綁定設置,ping的分(fēn)組便能正常發出了。 很就

/*192.168.2.115主機執行*/
#arp –s 192.168.2.117 b8:27:eb:d8:83:高廠20
/*192.168.2.117主機執行*做在/
#arp –s 192.168.2.11師劇5 b8:27:eb:c1:d1:39

     現為愛在,在任意一(yī)台主機上執行ping均能可以看到ping通了。 光多
   &視靜nbsp; 3)思考
  &nbs月分p;  我(wǒ)(wǒ)們現在終于可以個看根據主機的MAC地址來進行分(fēn)組交換轉發了友我,但這隻是兩台主機的固定交換轉發,如果機器MAC多了怎麽辦?如又吧果機器連接交換機的端口變了怎麽辦?我(wǒ)(wǒ)們需要有一(y女通ī)張記錄表,能夠記錄哪個MAC地址在哪個端口就好了,通過每司明個分(fēn)組的目的MAC來查找其對應的鄉白輸出端口,這樣就很容易實現分(fēn)組交從信換了。
  &nbs飛到p;  1)交換過程的核心數據字段
     從聽我上述實驗可以看出,目前交換裏面用到的就兩個字段,一(yī)個是端車海口号,另一(yī)個是MAC地址。那目的MAC地拿跳址與輸出端口号從哪獲得?其實就是從分(fēn)組頭的源M和為AC地址和輸入端口轉換變成目的MAC和輸出端口。故在交時匠換過程中(zhōng),其核心數據就2個:端口号和討為MAC地址。
   &nbs腦間p; 2)MAC轉發表設計與驗證 錢笑
   &就還nbsp; MAC轉發表就是我(wǒ)(wǒ)們前面來農提到的記錄表,這張表記錄了一(yī)個MAC地址熱費與其對應端口号的綁定關系,這一(yī)關系要從輸入分(fēn)組數據中(和在zhōng)提取而來,由分(fēn)組的輸入端口與源MAC地美司址組成這一(yī)綁定關系,在查表中(zhōng)便可通過目的MAC來獲線就取其正确的輸出端口了。下(xià)一(yī)篇文章我(wǒ紅間)(wǒ)們聊一(yī)下(xià)MAC轉發表的設計。 秒呢
   &nbs了視p;  歡迎您和學生(s做飛hēng)們加入FAST開(kāi)源項目群溝通與探讨,白樂一(yī)起體(tǐ)驗不一(yī)樣的系統設計過程。請先加微喝黑信号15116127200後邀請入群。

關注FAST開(kāi)源社區
FAST一(yī)一(yī)開(兵林kāi)源、開(kāi)放(fàng)、高速、高效、可編程、可定義!軟硬慢習件協同并行處理。