3,484 瀏覽數

Pktgen 封包的傳送與接收

如果你完全不知道什麼是 Pktgen 可以先從這一篇來了解 Pktgen 簡介 – http://benjr.tw/93300

這次的實驗是從 System A 打封包到 System B , pktgen 封包的傳送與接收 架構圖如下
pktgen01
載入 pktgen 模組

ben@ubuntu~$ sudo su -
[sudo] password for ben:
root@ubuntu~# modprobe pktgen

指定網路裝置 eth0 給 CPU 0 來處理封包

root@ubuntu:~# echo "add_device eth0" > /proc/net/pktgen/kpktgend_0

封包要從機器 A 傳送到 B 除了要設定 package size 外我們還要指定對方的 MAC Address (00:0C:29:06:A1:F9 -> 00:0C:29:77:5A:56)

root@ubuntu:~# echo "min_pkt_size 64" > /proc/net/pktgen/eth0
root@ubuntu:~# echo "max_pkt_size 9000" > /proc/net/pktgen/eth0
root@ubuntu:~# echo "dst_mac 00:0C:29:77:5A:56" > /proc/net/pktgen/eth0

設定完成,可以先檢查剛剛設定的內容.

root@ubuntu:~# cat /proc/net/pktgen/eth0
Params: count 1000  min_pkt_size: 64  max_pkt_size: 9000
     frags: 0  delay: 0  clone_skb: 0  ifname: eth0
     flows: 0 flowlen: 0
     queue_map_min: 0  queue_map_max: 0
     dst_min:   dst_max:
        src_min:   src_max:
     src_mac: 00:0c:29:06:a1:f9 dst_mac: 00:0c:29:77:5a:56
     udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
     src_mac_count: 0  dst_mac_count: 0
     Flags:
Current:
     pkts-sofar: 0  errors: 0
     started: 0us  stopped: 0us idle: 0us
     seq_num: 0  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
     cur_saddr: 0x0  cur_daddr: 0x0
     cur_udp_dst: 0  cur_udp_src: 0
     cur_queue_map: 0
     flows: 0
Result: OK: dstmac

開始進行測試

root@ubuntu:~# echo "start" > /proc/net/pktgen/pgctrl

測試完畢!!連線正常的話可以看到封包有被傳送出去,機器 B 透過 ifconfig eth0 應該也會發現封包變多了.

root@ubuntu:~# cat /proc/net/pktgen/eth0
Params: count 1000  min_pkt_size: 64  max_pkt_size: 9000
     frags: 0  delay: 0  clone_skb: 0  ifname: eth0
     flows: 0 flowlen: 0
     queue_map_min: 0  queue_map_max: 0
     dst_min:   dst_max:
        src_min:   src_max:
     src_mac: 00:0c:29:06:a1:f9 dst_mac: 00:0c:29:77:5a:56
     udp_src_min: 9  udp_src_max: 9  udp_dst_min: 9  udp_dst_max: 9
     src_mac_count: 0  dst_mac_count: 0
     Flags:
Current:
     pkts-sofar: 1000  errors: 0
     started: 2015028695039us  stopped: 2015028715432us idle: 98us
     seq_num: 1001  cur_dst_mac_offset: 0  cur_src_mac_offset: 0
     cur_saddr: 0x844d200a  cur_daddr: 0x0
     cur_udp_dst: 9  cur_udp_src: 9
     cur_queue_map: 0
     flows: 0
Result: OK: 20393(c20294+d98) nsec, 1000 (1064byte,0frags)
  49036pps 417Mb/sec (417394432bps) errors: 0

照同樣的設定在 System B 上面,將封包從 System B 打給 System A.

當兩個系統上有多個網路埠時,必須指定不同的 CPU Core 去處理!要不然 Pktgen 只會去處理最後設定的那一個網路裝置.

root@ubuntu:~# echo "add_device eth0" > /proc/net/pktgen/kpktgend_0
root@ubuntu:~# echo "add_device eth1" > /proc/net/pktgen/kpktgend_1

除了兩個系統的對打外, Pktgen 可以用同一個系統自己跟自己的網路埠互相對打,架構圖如下:
pktgen02

那我們可以透過 pktgen 來產生網路的壓力測試或是效能測試嗎??? 答案是可以的.不管是兩個系統的對打,或是同一個系統自己跟自己的網路埠互相對打.
Pktgen 壓力測試 – http://benjr.tw/93413
Pktgen 效能測試 – http://benjr.tw/93416

參考使用方式
http://iori.tw/the-usage-and-introduction-about-the-pktgen/

6 個網友的想法 “Pktgen 封包的傳送與接收

  1. 自動參照通知: Pktgen – Commands | Benjr.tw

  2. 自動參照通知: Pktgen 效能測試 | Benjr.tw

  3. 自動參照通知: Pktgen 壓力測試 | Benjr.tw

  4. Hi Benjr大
    感謝你將我的文章加到你的 Recommend List 內,在谷哥大神查到的文章均為 TX 的部分,至於 RX 的部分比較少,按照 https://people.kth.se/~danieltt/pktgen/ 裡有提到需要額外在指定Kernel版本下重新編譯 pktgen 的 Module,才有辦法生出 /proc/net/pktgen/pgrx 的 file,或是直接使用 Bifrost/Linux 這支 Distribution,進而從 RX Side 觀察 TX Packet Loss 的情況,上述均參考 http://www.ainoniwa.net/ssp/?p=1019
    Thanks for your sharing~

    • 謝謝你的回應,一開始還不太會用 pktgen 參考了你文章很多的說明.

      如果系統有兩個網路埠,就可以互打,也應該可以觀察到 RX 的狀態. < - 無法使用,必須使用 netfilter 才能使用,請參考 http://benjr.tw/93460

  5. 自動參照通知: pktgen 簡介 | Benjr.tw

發表迴響