0731-84728105
15116127200
二層交換機原型設計與實現(三)
發布時(shí)間:2021-05-10
     二層交換機們要的主要功能就是在端口之間搬移分組,當然是要根作視據正确的目标地址來搬移,涉及到以太網幀格式計相的解析、源和目的MAC地址的提取,MAC表的設計、查找和老一線化等等一系列的系統功能實現。我們(men)開(kāi)始設計交換著去機并不(bù)考慮那麼多,從簡單入手,輕裝呢呢上陣,你也許會(huì)走得(de)更好(hǎo)。 老光
     見慢上一篇文章我們(men)學會(huì)了打印分組的東動基本信息和将分組發送到指定端口輸出。今天我們中紙(men)就可以來實現一個簡單的交換功能,完成兩台主機之間的正常頻雨通(tōng)信了。
     1)端口交明筆換
  &nbs小校p;  顧名思義,就是隻識别判斷內高端口号就将分組進行交換轉發,先實現一個基鐵醫于端口的交換功能。固定邏輯隻能實現固定的兩個端口謝到交換,我們(men)可以将要交換的兩個端口從程序啟動都妹時(shí)作為(wèi)參數輸入,這樣就喝森可以在啟動命令時(shí)按需要指定要交換的兩個端口參數呢這了。
     增加月票兩個端口變量的全局定義,并在main函數的老小參數輸入中獲取輸入的值,如(rú):

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

/*main函數中添加如(rú)下代碼*/
else if(argc == 5)
{
debug = atoi(argv[1]);
mid = atoi(argv紅金[2]);
port1 = atoi(argv很關[3]);
port2 = atoi(ar老麗gv[4]);
}

/*callback函數中添加如(rú)下代碼*/房師
if(pkt->um.inport低上 == port1)
pkt->um.outport = port2;
else
pkt->um.outport 月線= port1;

    &nbs體不p; 2)驗證
   &nb音離sp; 編譯代碼并執行生成文件命令,觀察打印消息。

root@HNXS:/home男謝/hnxs/l2switch# make
gcc -o ul2switch main時房_ul2switch.c -lua -lreg -車南lpthread
root@HNXS:/home/hnxs/l2switch# ./子照ul2switch 1 130 0 2
fastU->REG Version藍冷:20180827,OpenBox HW Version:20202103間黃29
fastU->Register UA to FAST K麗紅ernel! Wait Reply......
fastU->UA->pid:21內場32,mid:130,Register OK!
fastU->libua version:票呢20180827
fastU->fast_ua_recv......
inport:2,dstmid:130,l新不en:92,dmac:FF:FF:FF:FF:FF:FF,sm子身ac:B8:27:EB:C1:D1:39
pkt_send_normal->0xb55麗慢00470,outport:0,len:92
inport:0,dstmid:130,le輛理n:92,dmac:B8:27:EB:C1:D1:39,smac:B8工話:27:EB:D8:83:20
pkt_send_normal->0xb5500470,outpo為生rt:2,len:92
inport:2,dstmid:130,len:130請路,dmac:B8:27:EB:D8:83:20,s視術mac:B8:27:EB:C1:D1:39
pkt_send_normal->0友器xb5500470,outport:0,len:130
inport:2,dstmid:130,len:商自130,dmac:B8:27:EB:D8:83:20,smac:坐電B8:27:EB:C1:D1:39
pkt_send_normal->0鐵有xb5500470,outport:0,請上len:130

     同時(s謝東hí),在一個測試主機上ping另一台測試主機的IP,發現已經p相裡ing通(tōng)了。

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=6店得4 time=0.742 ms
64 bytes from 192.海業168.2.117: icmp_seq=12 ttl=64 tim生可e=0.597 ms

   化了;  3)思考
   &話朋nbsp; 從上述交換打印分析,前兩票離個報文應該是ARP分組,32字節metadata加60字節以太幀數據。第1個店鄉是廣播請求,第2個是單播應答(dá)。第3和第4個弟拍報文就是第1組ping的交互數據了,标準pi白雨ng的98字節(130-32=98)。
     先不(bù小花)往大(dà)了說(shuō),至少我們(men)前面添加了幾行麗拿代碼就實現了我們(men)的一個最基本的原型交換了,如(r很器ú)果要換端口測試,隻需要在啟動命令時(shí)更改相應的端口号參數但多就行了。那交換機端口多了,用戶多了之後呢?我們(men)豈不(bù)是要不(b謝議ù)斷回來的啟動程序和設置端口來保證他(tā)們(men)通(tōng)報慢信呢?這是不(bù)是跟解放前的電話接線員工(gōng)作有點類似?接線員長了接到電話後,先要詢問打電話的人要打給誰,近費然後再把線給連過去。當然,原來的電話通(tōng)信與分組交愛家換還是有些較大(dà)區别,隻是類比一下,不(bù)擴展細說(shuō)他討。
   &nb視友sp;  在分組交換的頭部攜帶有該分組要去往的目的地址,暗報我們(men)管他(tā)叫目的MAC地址。在以太網網絡件舞中,任意一個通(tōng)信終端都必須具備一個唯一的MAC地址,用作湖紅通(tōng)信内容标識。在基于端口交換的基礎上,我們(men)也站刀可以很容易的實現一個基于MAC地址的簡單議照交換功能。至于為(wèi)什麼選目的MAC作為(wèi)交理銀換判斷參數,大(dà)家(jiā)細想肯技車定能明白。
      1)M員麗AC交換
    &nbs去醫p;根據以太網幀格式定義,從分組頭部位置提取目的MAC作為(wèi謝輛)判斷參數,實現一個基于MAC地址的交換功能。既然要根據目的MA在我C地址來做轉發,我們(men)需要知道哪一個MAC地址的主機連接在交換機做又的哪一個端口上面,假設我們(men)已經獲取了房電這些信息如(rú)下:

主機MAC地址:B8:27:EB:D8:83:20,交換機端口:0
主機MAC地址:B8:27:EB:C票又1:D1:39,交換機端口:2

替換原來端口交換的邏輯代碼,替換代碼如(rú)下: 我兒

/*新增兩個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-鐵唱>data,(u8 *)&mac2))
pkt->um.outport = 2; 能能

   &n飛開bsp; ether_addr_equal函數是判斷兩關金個MAC地址是否相等,詳情參閱代碼。
   &城行nbsp; 兩個MAC地址的定義準确來說(線了shuō)要根據MAC的順序方式表示後再做網絡序轉換車答,為(wèi)簡化邏輯和方便驗證,直接定義成了小端平台下反序方式,這樣正好(很影hǎo)跟網絡序的MAC地址對比相等。關于平台數事習據的大(dà)小端的問題或主機序與網絡序問題,請網上搜索學習。很的
    &nbs窗費p;2)驗證
編譯代碼并執行生成文件命令,觀察打印消息。

root@HNXS:/home市做/hnxs/l2switch# make
gcc -o ul2switch mai懂媽n_ul2switch.c -lua -lreg -lpthrea說務d
root@HNXS:/home/hnxs/l2switch# ./匠音ul2switch
fastU->REG Version:20180827,OpenBox 大小HW Version:2020210329
fastU->Register UA t不秒o FAST Kernel! Wait Reply..舞理....
fastU->UA->pid:2255,mid:刀國129,Register OK!
fastU->libua version:20180827
fastU->fast_ua_recv......
inport:0,dstmid:129,len:92,dm銀雪ac:FF:FF:FF:FF:FF:FF,smac:B8:27:EB:D8:線大83:20
pkt_send_normal->0xb5師西400470,outport:0,len:92
inport:0,dstmid:129,len:92,dmac:FF:FF兒家:FF:FF:FF:FF,smac:B8:27:EB:D8:8票票3:20
pkt_send_normal->0xb5400470,outpor紅你t:0,len:92
inport:0,dstmid:129,len:92,dmac:FF:FF那坐:FF:FF:FF:FF,smac:B8:27:EB:D8:83:20友紙
pkt_send_normal->0xb5400470,outp靜船ort:0,len:92

    &n好線bsp;同時(shí),在2端口測試主機上ping另一台測試不樹主機的IP,發現ping不(bù)通(tōng)哦。這是因為(w愛錯èi)我們(men)現在的邏輯沒有考慮ARP廣播M見黑AC地址的處理邏輯,導緻其無法正常轉發。本節能人暫不(bù)處理廣播的泛洪轉發功能,後續文章中與組播一起讨論。
    風女 那如(rú)何讓兩邊主機不(bù)發ARP廣播直接發pi身愛ng的分組呢?了解網絡通(tōng)信原理的人高微都知道,這個廣播是在ping之前發出的MAC地址學習分組,如(rú城朋)果沒有學習到對端的MAC地址,則ping的分組無法完成二層協議的封裝我呢,無法從協議棧發出。使用如(rú)下命令分别在兩台主機上進行對端IP體鄉與對端MAC的靜态綁定設置,ping的分組便能正常發出在你了。

/*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.115 b8:27:eb:c1:d1:39銀上

    下科; 現在,在任意一台主機上執行ping均能可以看到ping通(些習tōng)了。
    &n亮去bsp;3)思考
   &nb森學sp; 我們(men)現在終于可以根間工據主機的MAC地址來進行分組交換轉發了,但這隻是兩台主機的固定交換轉發,如(器到rú)果機器(qì)MAC多了怎麼辦?如(數請rú)果機器(qì)連接交換機的端口變了怎麼辦?我們(m睡是en)需要有一張記錄表,能夠記錄哪個MAC地址在哪舊謝個端口就好(hǎo)了,通(tōng)過每個分組的目的MAC來查找其對應的輸出服也端口,這樣就很容易實現分組交換了。
   冷開;  1)交換過程的核心數據字段
    &n站商bsp;從上述實驗可以看出,目前交換裡面用到的就兩個字段,一個是端口号,另們知一個是MAC地址。那目的MAC地址與輸出端口号從哪獲得(de)?其實笑畫就是從分組頭的源MAC地址和輸入端口轉換變成目的M綠業AC和輸出端口。故在交換過程中,其核心數據就2個:端口号著計和MAC地址。
    子高 2)MAC轉發表設計與驗證 腦短
     MAC轉謝水發表就是我們(men)前面提到的記錄表,這張表記錄了一個MAC科醫地址與其對應端口号的綁定關系,這一關系要愛站從輸入分組數據中提取而來,由分組的輸入端口與源MAC地址組成這一紙友綁定關系,在查表中便可通(tōng)過目的MAC來獲取其時明正确的輸出端口了。下一篇文章我們(men)聊一下飛什MAC轉發表的設計。
    &nbs自遠p; 歡迎您和學生們(men)加林好入FAST開(kāi)源項目群溝通(tōng)與探讨,一起哥草體驗不(bù)一樣的系統設計過程。請先加微個去信号15116127200後邀請入群。 會音

關注FAST開(kāi)源社區
FAST一一開(kāi)源、開(kāi)放、高速、高效、可編程、可定錢空義!軟硬件協同并行處理。