TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ VIỄN THƠNG
---------------------
BÀI THÍ NGHIỆM MƠN HỌC
CƠ SỞ TRUYỀN SỐ LIỆU
Mã học phần
: ET4070 (3-0-1-6)
Họ và tên sinh viên
: Nguyễn Nghĩa Thăng
Mã số SV
: 20182775
Lớp
: ĐTVT 10- K623
Nhóm thí nghiệm
:
Ngày nộp báo cáo
: 08/10/2021
Yêu cầu sinh viên điền đầy đủ các thông tin
HÀ NỘI, 2021
BÀI THÍ NGHIỆM
1
TẠO TOPOLOGY BẰNG MININET
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
I.
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
MỤC ĐÍCH THÍ NGHIỆM
Bài thí nghiệm này giúp sinh viên làm quen với phần mềm Mininet và cách hoạt động của Open
vSwitch. Qua bài thí nghiệm chúng ta tiến hành tạo một topology đơn giản bằng mininet và tạo các
flow-entry cho Open vSwitch để các host có thể ping với nhau.
II.
THẢO LUẬN
Mininet là một hệ thống cho phép thử nghiệm các mạng lớn trên một máy tính. Mininet hỗ trợ việc
nghiên cứu, phát triển, kiểm thử, gỡ lỗi và các nhiệm vụ khác bằng việc giả lập một mạng các
OpenFlow switch trên một máy tính duy nhất, nghĩa là ta có thể triển khai thử nghiệm mạng với
hàng trăm/ngàn node chỉ trên một máy tính cá nhân. Trên mạng đó ta có thể triển khai các giao
thức thử nghiệm trên mạng hoàn toàn giống như việc sử dụng các switch OpenFlow thật. Các
OpenFlow switch mà mininet giả lập được gọi là Open vSwitch.
Một số chức năng của Mininet gồm có:
Công cụ xây dựng môi trường giả lập của các OpenFlow switch, đơn giản và không tốn
kém để phát triển các ứng dụng mạng. Do các OpenFlow switch trong Mininet có tất cả các
tính chất mà OpenFlow switch thật có được nên việc sử dụng mạng giả lập bằng Mininet
cho phép kiểm tra các chức năng của ứng dụng mà không cần thiết bị thật.
Cho phép các nhà phát triển ứng dụng làm việc đồng thời, một cách độc lập trên cùng đồ
hình mà khơng ảnh hưởng đến nhau.
Cho phép kiểm thử các đồ hình phức tạp mà không cần phải nối dây cho mạng vật lý.
Cho phép debug và chạy các phép kiểm thử trên các mạng giả lập lớn, sử dụng CLI.
Hỗ trợ thiết lập các đồ hình tùy biến bất kỳ, gồm tập cơ bản các thơng số đồ hình.
Có thể đem các ứng dụng trên Mininet đi triển khai trên mạng thật với code hồn tồn
khơng cần thay đổi.
Cung cấp Python API dễ dàng sử dụng và có khả năng mở rộng.
Mininet cho ta một phương pháp dễ dàng để thu được chính xác các đặc tính mạng và thử nghiệm
các đồ hình tùy ý. Một trong những đặc điểm quan trọng nhất của mininet là chương trình dùng cho
bộ điều khiển (controller) dùng cho giả lập bằng mininet hoàn tồn có thể đem ra triển khai cho
mạng thật mà không cần sửa đổi.
III.
YÊU CẦU VỀ THIẾT BỊ
Để thực hiện bài thí nghiệm này cần một máy tính chạy Ubuntu 12.04 đã cài sẵn phần mềm mininet.
IV.
TRÌNH TỰ THÍ NGHIỆM
Trong bài thí nghiệm, sinh viên sẽ tiến hành tạo topology bằng mininet, sau đó add flow-entry cho
Open vSwitch.
1. Tạo một topology đơn giản bằng Mininet
Mở Terminal trên Ubuntu, đây là chế độ Shell dùng để gõ các lệnh của hệ điều hành (Shell
Command). Chạy lệnh sau:
sudo mn --topo single,3 --controller remote
Mininet sẽ tạo ra topo gồm có một Open vSwitch (s1) nối với 3 host: h1, h2, h3.
Trên màn hình Terminal sẽ hiện ra thơng tin của topo như sau:
user@machinename:~$ sudo mn --topo single,3 --controller remote
1
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
*** Creating network
*** Adding controller
Unable to contact the remote controller at 127.0.0.1:6633
*** Adding hosts:
h1 h2 h3
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1) (h3, s1)
*** Configuring hosts
h1 h2 h3
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet>
Với lựa chọn --controller remote Mininet sẽ tạo ra các Open vSwitch với cài đặt địa chỉ
controller mặc định tại: IP=127.0.0.1 (localhost), port=6633. Các controller có nhiệm vụ điều khiển
hoạt đơng của mạng do Mininet tạo ra, đảm bảo mạng hoạt động ổn định, chính xác. Tuy nhiên, do
chúng ta chưa có một Controller nào nằm ở địa chỉ IP= 127.0.0.1, port=6633, nên mạng sẽ chưa
thể hoạt động.
Test thử hoạt động của mạng bằng cách gõ lệnh pingall trên màn hình CLI của mininet, ta sẽ
thấy các host không thể ping được với nhau, 100% gói sẽ bị mất.
mininet> pingall
*** Ping: testing ping reachability
h1 -> X X
h2 -> X X
h3 -> X X
*** Results: 100% dropped (0/6 received)
mininet>
Sau khi tạo thành công mininet, giao diện cửa sổ terminal sẽ chuyển thành giao diện của mininet,
khi đó dấu nhắc lệnh có dạng “mininet>”.
Sau đây là một số lệnh có thể sử dụng trong giao diện của mininet:
nodes : Liệt kê tất cả các nút mạng
net : Liệt kê các kết nối trong mạng
dump : Xem thông tin về các nút mạng (địa chỉ ip, các giao diện…)
exit : Hủy mininet, thoát về giao diện ban đầu
sh : Thực hiện lệnh của hệ điều hành (Shell Command) trong giao diện của Mininet
Sinh viên thử dùng các lệnh “nodes”, “net” và “dump” sau đó so sánh với Hình 1.1.
2
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
2. Thêm các flow-entry vào bảng flowtable của Open vSwitch
Hình 1.1. Topology 1 switch kết nối 3 host
Sinh viên tiến hành thêm các flow-entry cho switch s1 để host 1 có thể ping đến host 3.
Để hiểu rõ cơ chế ARP trong mạng, sinh viên xem lại lý thuyết về ARP.
Sinh viên tiến hành add các flow-entry cho switch s1 theo thứ tự các bản tin trao đổi trong quá trình
ping như sau (sinh viên mở một cửa sổ terminal mới để chạy các lệnh bên dưới).
Đầu tiên, host 1 sẽ gửi một bản tin ARP request cho host 3 (h3) để lấy địa chỉ MAC của h3. Vì vậy, ta
cần thêm một flow-entry vào switch 1 (s1) để nó forward gói tin này ra đúng port nối với host 3:
sudo ovs-ofctl add-flow s1 dl_type=0x0806,nw_dst=10.0.0.3,action=output:3
Lệnh ovs-vsctl sẽ thêm trực tiếp các flow-entry vào bảng flowtable của switch 1 (0x0806: ARP).
Chú ý:
o
Lệnh trên và các lệnh thiết lập các flow-entry sau đây được mô tả với giả thiết h1 được nối với
Port 1 và h3 được nối với Port 3 của Switch s1. Tuy nhiên tùy phiên bản Mininet và Ubuntu mà
các Port của Switch đều được kết nối như vậy, để xác định xem các Port của Switch được kết nối
như thế nào ta làm theo hướng dẫn phần cuối của mục này.
o
Trong giao diện của Mininet ta khơng thể dùng trực tiếp lệnh sudo vì vậy phải mở cửa sổ Terminal
mới để thực hiện. Tuy nhiên ta có thể thực hiện trực tiếp lệnh “sudo ovs-ofctl …” trong giao
diện Mininet bằng cách thay sudo bằng sh như sau “sh ovs-ofctl …”
Tương tự, với gói tin ARP reply từ host 3 gửi về host 1, ta sẽ add flow-entry sau:
sudo ovs-ofctl add-flow s1 dl_type=0x0806,nw_dst=10.0.0.1,action=output:1
Sau khi host 1 nhận được gói tin ARP reply, nó sẽ tạo các gói tin ICMP request và ICMP reply. Tương
tự như đối với các gói tin ARP ta sẽ add bằng các lệnh sau:
sudo ovs-ofctl add-flow s1 dl_type=0x0800,nw_dst=10.0.0.3,action=output:3
sudo ovs-ofctl add-flow s1 dl_type=0x0800,nw_dst=10.0.0.1,action=output:1
(0x0800: ICMP)
Sau khi add xong tất cả các flow-entry, ta tiến hành ping từ host 1 đến host 3 bằng lệnh ”h1 ping h3”
trong giao diện CLI của mininet.
F Lưu ý:
3
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Lệnh ping sẽ thực hiện ping liên tục mà không dừng lại, muốn dừng ta dùng tổ hợp phím
“Ctrl+C”. Hoặc ta có thể dùng lệnh ping với tham số -c ví dụ ”h1 ping h3 –c 3” tức là
chỉ ping 3 lần.
Nếu không muốn mở cửa sổ terminal mới, ta có thể thực hiện trực tiếp trong giao diện
mininet (cửa sổ terminnal đã tạo mininet khi đó dấu nhắc lệnh sẽ là “mininet>”) bằng cách
thay “sudo” bằng lệnh “sh”.
Để xác định đúng số port của switch ta chạy lệnh sau:
sudo ovs-ofctl show s1
Tồn bộ thơng tin của switch 1: dpid, kích thước table, kích thước buffer, trạng thái các port, tên các
port sẽ được hiển thị trên terminal.
OFPT_FEATURES_REPLY (xid=0x1): ver:0x1, dpid:0000000000000001
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
1(s1-eth1): addr:0e:cd:fc:f0:cb:1f
config:
0
state:
0
current:
10GB-FD COPPER
2(s1-eth2): addr:f6:95:c5:60:e5:79
config:
0
state:
0
current:
10GB-FD COPPER
3(s1-eth3): addr:ca:7f:49:ba:fb:d0
config:
0
state:
0
current:
10GB-FD COPPER
LOCAL(s1): addr:6e:10:83:64:b5:47
config:
PORT_DOWN
state:
LINK_DOWN
OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal miss_send_len=0
Từ kết quả của lệnh “show s1” trên, ta có thơng tin về các port của Switch s1, cụ thể port 1 tương
ứng với giao diện s1-eth1, port 2 tương ứng với giao diện s1-eth2, và port 3 tương ứng với s1eth3. Từ đó ta có thể xác định port các host kết nối với port nào của switch (Ta có thể kiểm tra các
giao diện của switch kết nối với các host như thế nào bằng lệnh ”net” trong giao diện của mininet).
Câu hỏi: Để cả 3 Host có thể ping được với nhau (sử dụng lệnh pingall), ta cần thực hiện các
câu lệnh nào? (Sinh viên điền tất cả các câu lệnh với số port sau khi đã xác định đúng):
Trả lời:
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.1, action = output:2
4
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
V.
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
THỰC HÀNH
Trong phần này, sinh viên sẽ tự thực hiện tạo một mạng bằng Mininet sau đó thêm các flow-entry
cho các Switch để các host có thể ping được với nhau.
1. Tạo 1 topology bằng Mininet.
Thực hiện lệnh sau (tương tự lệnh tạo Mininet ở phần trên nhưng thay “single” bằng “linear”).
sudo mn --topo linear,3 --controller remote
Mạng được tạo ra bao gồm 3 Host (H1, H2, H3) và 3 Switch (S1, S2, S3).
2. Mô tả chi tiết sơ đồ mạng:
Sử dụng các lệnh net và dump trong giao diện Mininet để liệt kê các nút (cùng với địa chỉ IP), các
giao diện và các kết nối. Ngoài ra cần xác định các kết nối tương ứng với Port nào của các Switch.
Sau đó vẽ chi tiết mơ hình mạng (các host, switch, địa chỉ IP, các giao diện, các kết nối giống với
hình 1.1)
Nếu ta sử dụng lệnh ”pingall” thì như phần trên, các host khơng ping được với nhau.
3. Thêm các flow-entry vào bảng flowtable của các Switch.
Phần này ta thực hiện dùng lệnh “ovs-ofctl add-flow” như phần trên để thêm thông tin của
các Host vào các Switch. Lưu ý là thông tin của các Host phải thêm vào tất cả các Switch có trong
mạng chứ không phải là chỉ 1 Switch nối trực tiếp với nó.
Hãy viết lại tất cả các lệnh trong phần này:
Trả lời:
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.3, action = output:1
5
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0806, nw_dst=10.0.0.1, action = output:2
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.3, action = output:1
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.2, action = output:3
sudo ovs-ofctl add-flow s1 dl=type=0x0800, nw_dst=10.0.0.1, action = output:2
Sau đó ta thực hiện lệnh ”pingall” để xem kết quả.
VI.
KẾT LUẬN
Qua bài thí nghiệm này, sinh viên đã làm quen với phần mềm Mininet, biết cách tạo ra một topology
đơn giản bằng mininet, hiểu cơ chế hoạt động của Open vSwitch.
VII.
CÂU HỎI KIỂM TRA
1. Flow-entry và flowtable là gì?
Flow-entry là các flow giữa các host
Flow table là bảng lưu lại tập hợp các flow entry từ đó cho phép các gói tin được chuyển tiếp từ
nguồn tới đích dựa vào các trường thơng tin của các flow entry
2. Thời gian time-out của flow-entry trong flowtable là gì? Giá trị mặc định bằng bao nhiêu?
Các Flow entry được thêm vào các flow table, sau khoảng thời gian mà flow entry khơng có gói
tin nào phù hợp với cơ chế chuyển tiếp của nó thì flow entry bị xố khỏi flow table. Qng thời
gian đó gọi là time our của flow entry. Nó có giá trị mặc định là 5 phút.
6
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
BÀI THÍ NGHIỆM
2
TAO CÂY BẮC CẦU TỐI THIỂU
I.
MỤC ĐÍCH THÍ NGHIỆM
Bài thí nghiệm này giúp sinh viên hiểu về cơ chế tạo Minimum Spanning Tree (MST), tìm hiểu POX
Controller và cách tạo cây trong POX.
VIII.
THẢO LUẬN
Các bộ điều khiển mạng dùng trong mạng OpenFlow gồm có: bộ điều khiển mạng mặc định, POX,
POX, SNAC (giao diện Web để quản lý các OpenFlow switch), Beacon (Java). Tuy nhiên bộ điều
khiển mạng chính và đáng chú ý nhất là bộ điều khiển mạng POX. POX là bộ điều khiển mở, phát
triển bằng ngôn ngữ Python, cấu trúc đơn giản, gọn nhẹ, dễ dàng tạo và thêm các module mới.
Mục đích chính của POX gồm:
Cung cấp một platform cho phép người lập trình, phát triển mạng triển khai các ý tưởng mới
trong lĩnh vực mạng, sử dụng phần cứng thật. Các nhà phát triển có thể điều khiển tất cả các
kết nối trong mạng gồm có: forwarding, routing… Ngồi ra POX cịn điều khiển cả flow-table
trong switch.
Cung cấp phần mềm quản lý mạng hữu ích cho các tổng đài (operator), gồm có việc quản lý
tập trung cho tất cả các switch trong mạng, điều khiển truy nhập của người dùng.
Phương thức hoạt động của POX:
POX chạy riêng rẽ trên một máy và quản lý việc chuyển tiếp các bản tin giữa nhiều switch
khác nhau. Trong q trình mơ phỏng, giả lập POX được chạy trên cùng một máy với đồ
hình mạng được tạo ra bởi Mininet.
POX cung cấp các giao diện lập trình giúp cho nhà phát triển sử dụng dễ dàng lấy được
thông tin về sự kiện trong mạng, can thiệp vào lưu lượng, điều khiển các quyết định chuyển
mạch của switch và tạo được lưu lượng.
Khi có flow mới xuất hiện trọng mạng, các gói đầu tiên sẽ được gửi đến bộ điều khiển mạng
POX, tại đây có thể thực hiện được: quyết định xem khi nào sẽ chuyển tiếp các gói đi trong
mạng, định tuyến cho gói tin, thu thập các thơng tin thống kê, chỉnh sửa được gói trong flow
đó hoặc có thể xem thêm được về các gói khác trong cùng flow để thu thập được thêm
nhiều thông tin.
POX đơn thuần chỉ là một platform, việc điều khiển mạng được thực hiện bởi các phần tử chức
năng trong POX gọi là POX component, mỗi component thực thi một chức năng riêng biệt như định
tuyến, chuyển mạch, xác thực... Có thể chạy một lúc nhiều POX component với các chức năng điều
khiển khác nhau làm cho việc điều khiển và quản lý mạng trở nên hoàn hảo hơn. Các ứng dụng
trong bộ điều khiển mạng POX có thể kết hợp với nhận biết các sự kiện trong mạng (network
event), can thiệp vào lưu lượng trong mạng, điều khiển định tuyến của các switch và tạo ra lưu
lượng.
Các thành phần của POX:
7
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Các thành phần Stock: POX đi kèm với một số thành phần stock. Một số thành phần cung cấp
chức năng cốt lõi, một số cung cấp tính năng tiện lợi, và một số chỉ là ví dụ. Sau đây là một số
thành phần stock của POX.
forwarding.l2_learning: Thành phần này làm cho OpenFlow switch hoạt động như một thiết bị
switch layer 2. Thành phần này học địa chỉ lớp 2 (địa chỉ MAC), các flow được cài đặt được
match với các nhiều trường của header càng tốt.
forwarding.l3_learning: Thành phần này biến các OpenFlow switch thành thiết bị không hẳn là
một router nhưng cũng không phải là một switch layer 2, nó là một switch layer 3. Nó được
dùng làm ví dụ khá tốt về việc sử dụng thư viện gói tin của POX để kiểm tra và xây dựng các
bản tin ARP request và ARP reply.
openflow.spanning_tree: Được sử dụng để khám phá các phần tử để xây dựng đồ hình mạng,
xây dựng một spanning tree và sau đó disable các port khơng nằm trên spanning tree. Kết quả
là một topo không bị loop. Chú ý là thành phần này không liên quan tới Spanning Tree
Protocol.
openflow.discovery: được sử dụng để khám phá topo mạng bằng việc gửi các bản tin LLDP
tới các switch.
web.webcore: Thành phần webcore khởi động một webserver trong tiến trình POX. Các thành
phần khác có thể giao tiếp với nó để cung cấp nội dung tĩnh hoặc động của riêng chúng.
proto.dhcpd: Nó đơn giản là một DHCP server. Mặc nó lấy địa chỉ 192.168.0.254 và cấp IP
cho các DHCP client trong dải địa chỉ 192.168.0.1 đến 192.168.0.253 với DNS server và
Default Gateway chính là DHCP server.
Phát triển các thành phần tự tạo: Là các thành phần mà ta tự phát triển cho POX. Trong một số
trường hợp, chúng ta có thể phải xây dựng một thành phần làm được những gì chúng ta muốn.
1. Module discovery
POX
Controller
Open vSwitch 1
Open vSwitch 2
Source Port
Destination port
Detect link sw1 (srcPort) à sw2 (dstPort)
Hình 2.1. Hoạt động của POX Controller
POX Controller sử dụng module discovery để phát hiện đồ hình mạng dựa trên cơ chế sau:
a. Các switch khi được bật lên sẽ liên tục sử dụng cơ chế bắt tay ba bước (TCP) để kết nối
đến POX. Nếu POX bật, kết nối sẽ được khởi tạo, lúc này POX sẽ nhận biết được tất cả
các switch ở trong mạng cũng như trạng thái của từng switch. Mặc định Mininet sẽ cài đặt
8
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
địa chỉ Controller mặc định cho switch là IP= localhost và port=6633. Chúng ta hồn tồn
có thể thay đổi bằng cách sử dụng lệnh sau.
sudo ovs-vsctl set-controller [controller-address]
b. Khi POX nhận được đầy đủ các switch, module discovery sẽ tạo các bản tin LLDP và đóng
vào Packet_out gửi xuống các switch, các switch khi nhận được sẽ gửi LLDP ra các port,
khi một switch nhận được một gói tin LLDP nó sẽ gửi lên hỏi POX, lúc này POX sẽ nhận
được một link. Tồn bộ q trình được mơ tả trong hình 2.1.
2. Module spanning_tree
Module spanning_tree giúp tạo cây cho các đồ hình mạng có loop. Cơ chế hoạt động của module
này như sau:
a.
Lưu tất cả các switch vào một danh sách theo thứ tự DPID
b.
Lấy switch đầu tiên làm nút gốc, gọi switch này là current switch
c.
Tất cả các link từ current switch sẽ được kiểm tra để xác định switch đích. Những link được
thêm vào cây spanning_tree có switch đích chưa được xử lý trong lượt này và thỏa mãn
Chỉ có duy nhất 1 link dẫn đến switch đích
Có nhiều link dẫn đến switch đích: chọn ra link nhanh nhất, nếu có nhiều link nhanh nhất
chọn link có chỉ số bé nhất.
IX.
d.
Di chuyển tất cả switch đích vừa mới được thêm vào cây lên đầu của danh sách.
e.
Làm lại bước c cho đến khi khơng cịn switch nào trong danh sách
YÊU CẦU VỀ THIẾT BỊ
Để thực hiện bài thí nghiêm này cần một PC chạy Ubuntu 12.04, đã cài đặt sẵn Mininet và POX
Controller.
X.
TRÌNH TỰ THÍ NGHIÊM
Trong bài thí nghiệm, sinh viên sẽ tiến hành tạo topology đơn giản bằng Mininet sau đó chạy POX
Controller để điều khiển mạng.
1. Tạo một topology đơn giản bằng Mininet
Tạo file “topo.py”
Tạo một file trong thư mục home với tên gọi là topo.py: Mở terminal, tạo file “topo.py”
bằng cách gõ các lệnh sau:
cd
gedit topo.py
Trên cửa sổ hiện ra tiến hành soạn thảo code tạo một topology mới như bên dưới.
from mininet.topo import Topo
“””
Tao mot mang ao co 4 switch duoc noi voi nhau thanh mot vong Ring
“””
class MyTopo(Topo):
"Topo gồm 4 Switch được nối với nhau thành 1 vòng Ring"
def __init__(self):
# Khởi tạo topo
Topo.__init__( self )
# Tạo các host ảo và các link ảo
9
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
h1 = self.addHost(‘h1’)
h2 = self.addHost(‘h2’)
h3 = self.addHost(‘h3’)
h4 = self.addHost(‘h4’)
s1 = self.addSwitch(‘s1’)
s2 = self.addSwitch(‘s2’)
s3 = self.addSwitch(‘s3’)
s4 = self.addSwitch(‘s4’)
# Tạo các kết nối giữa các switch và host
self.addLink(h1, s1)
self.addLink(h2, s2)
self.addLink(h3, s3)
self.addLink(h4, s4)
self.addLink(s1, s2)
self.addLink(s2, s3)
self.addLink(s3, s4)
self.addLink(s4, s1)
topos = { 'mytopo': ( lambda: MyTopo() ) }
Một số phương thức được sử dụng
o Class Topo trong packet mininet.topo cung cấp các phương thức để tạo một topo bằng
mininet.
o Phương thức addHost được sử dụng để tạo ra một host ảo trong mininet. Trong mininet
các host ảo được giả lập từ chính PC mà ta đang chạy mininet.
o Phương thức addSwitch được dùng để tạo ra các switch ảo. Trong mininet các switch ảo
là OpenVSwitch.
o Phương thức addLink được dùng để tạo link ảo giữa 2 switch hoặc giữa switch với host.
Chạy Mininet với topo tự tạo ở trên
sudo mn --custom topo.py --topo mytopo --controller remote
Kết quả thu được
*** Creating network
*** Adding controller
Unable to contact the remote controller at 127.0.0.1:6633
*** Adding hosts:
h1 h2 h3 h4
*** Adding switches:
s1 s2 s3 s4
*** Adding links:
s1)
(h1, s1) (h2, s2) (h3, s3) (h4, s4) (s1, s2) (s2, s3) (s3, s4) (s4,
*** Configuring hosts
h1 h2 h3 h4
*** Starting controller
c0
*** Starting 4 switches
10
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
s1 s2 s3 s4 ...
*** Starting CLI:
mininet>
c0
s1
s4
h1
h2
h4
s3
s2
h3
Hình 2.2. Topology 4 switch - 4 host
Sau khi tạo topology thành công, sinh viên sẽ tiến hành chạy các module của POX ở một cửa sổ
terminal khác.
Sử dụng lệnh cd để vào thư mục pox, sau đó thực hiện thủ tục discovery để các switch thu thập
thông tin các nút mạng (giao thức LLDP – Link Layer Discovery Protocol). Các lệnh thực hiện như
các lệnh sau:
cd pox/
./pox.py openflow.discovery forwarding.l2_learning
Lúc này, khi tiến hành pingall ở giao diện mininet, các host không thể liên lạc với nhau.
Ngun nhân là do đồ hình mạng có loop, để các host có thể ping được ta cần chạy thêm module
spanning_tree.
Dừng tiến trình trên (tổ hợp phím Ctrl+C) và thực hiện lại lệnh như sau (lúc này vẫn đang ở trong
thư mục pox, nếu mở lại cửa sổ Terminal khác thì phải vào lại thư mục pox bằng lệnh “cd pox/”).
./pox.py openflow.discovery forwarding.l2_learning openflow.spanning_tree
Sau khi chạy module spanning_tree, các host đã có thể ping tới nhau bằng lệnh “pingall”.
Như vậy sau khi chạy module spanning_tree, topology của mạng đã khơng cịn vịng lặp nữa. Cụ
thể module spanning_tree đã chặn một số cổng của các switch, để xem những cổng nào bị chặn ta
có thể kiểm tra lại cổng của các switch.
Để kiểm tra các cổng của từng switch ta dùng lệnh “ovs-ofctl show …” như hướng dẫn trong
bài 1. Tuy nhiên ở đây có 4 switch, ta có thể thực hiện lệnh sau để kiểm tra cổng của tất cả các
switch (thực hiện trong giao diện mininet):
dpctl show
11
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Kết quả của lệnh trên như sau (lệnh trên sẽ hiển thị các cổng của cả 4 switch, tuy nhiên dưới đây
chỉ hiển thị kết quả của s1 và s4).
*** s1
-----------------------------------------------------------------------OFPT_FEATURES_REPLY (xid=0x1): ver:0x1, dpid:0000000000000001
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
1(s1-eth1): addr:ce:78:91:38:3e:47
config:
0
state:
0
current:
10GB-FD COPPER
2(s1-eth3): addr:1e:a1:89:e4:b0:4c
config:
NO_FLOOD
state:
0
current:
10GB-FD COPPER
3(s1-eth2): addr:36:79:07:14:9c:96
config:
0
state:
0
current:
10GB-FD COPPER
LOCAL(s1): addr:aa:84:50:c2:dd:4c
config:
PORT_DOWN
state:
LINK_DOWN
OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal miss_send_len=0
*** s4
-----------------------------------------------------------------------OFPT_FEATURES_REPLY (xid=0x1): ver:0x1, dpid:0000000000000004
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
1(s4-eth1): addr:8e:68:58:45:5c:8e
config:
0
state:
0
current:
10GB-FD COPPER
2(s4-eth3): addr:96:4a:8d:40:61:6c
config:
NO_FLOOD
state:
0
current:
10GB-FD COPPER
3(s4-eth2): addr:42:91:33:90:b5:08
config:
0
state:
0
current:
10GB-FD COPPER
LOCAL(s4): addr:0e:47:9a:e9:af:4d
config:
PORT_DOWN
state:
LINK_DOWN
OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal miss_send_len=0
12
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Ta thấy cổng nào có phần “config: NO_FLOOD” tức là đã bị khóa, và có hai cổng bị khóa ở switch
s1 (port 2 (s1-eth3)) và switch 4 (port 2(s4-eth3)). Hai cổng bị khóa trên tương ứng với kết nối giữa
s1 và s4 bị khóa như trên Hình 2.3.
c0
h1-eth0 s1-eth1
s1
s4
s1-eth3
s4-eth3
s1-eth2
h1
h2-eth0 s2-eth1
h
2
s4-eth1 h4-eth0
h
4
s4-eth2
s3-eth3
s2-eth2
s2-eth3
s3-eth2
s3-eth1 h3-eth0
s3
s2
h
3
Hình 2.3. Topology sau khi chạy module spanning_tree
Hình 2.3 là sơ đồ của mạng sau khi chạy module spanning_tree, ta thấy kết nối giữa s1 và s4 đã bị
chặn (tương ứng với giao diện s1-eth3 và s4-eth3), như vậy đồ hình của mạng khơng cịn vịng kín
nữa.
XI.
THỰC HÀNH
Trong phần này, sinh viên sẽ tự thực hiện lại các thao tác ở phần IV nhưng với một đồ hình mạng
khác, bao gồm 5 switch và 5 host như trên Hình 2.4.
Đầu tiên, sinh viện tạo mininet có topology như trên hình 2.4 bằng cách tạo một file “topo2.py” có
phần code tương tự như file “topo.py” trong mục IV (file “topo.py” mơ tả cho mạng có topology như
trên Hình 2.2). Sinh viên điền đoạn code của “cho đầy đủ:
from mininet.topo import Topo
class MyTopo2(Topo):
def __init__(self):
13
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Topo.__init__( self )
h1 = self.addHost(‘h1’)
h2 = self.addHost(‘h2’)
h3 = self.addHost(‘h3’)
h4 = self.addHost(‘h4’)
h5 = self.addHost(‘h5’)
s1 = self.addSwitch(‘s1’)
s2 = self.addSwitch(‘s2’)
s3 = self.addSwitch(‘s3’)
s4 = self.addSwitch(‘s4’)
s5 = self.addSwitch(‘s5’)
# Tạo các kết nối giữa các switch và host
self.addLink(h1, s1)
self.addLink(h2, s2)
self.addLink(h3, s3)
self.addLink(h4, s4)
self.addLink(h5, s5)
self.addLink(s1, s2)
self.addLink(s1, s3)
self.addLink(s1, s4)
self.addLink(s2, s4)
self.addLink(s2, s5)
self.addLink(s3, s4)
self.addLink(s4, s5)
topos = { 'mytopo2': ( lambda: MyTopo2() ) }
14
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
c0
Hình 2.4. Topology 5 switch, 5 host
Sau khi tạo file “topo2.py” ta thực hiện lệnh sau để tạo mininet (sinh viên hồn thành nốt dịng lệnh):
sudo mn --custom topo2.py –-topo mytopo2-—controller remote
Tiếp theo, chạy các module của POX controller để tạo cây bắc cầu tối thiểu như đã làm trong phần
IV. Sau đó kiểm tra lại đồ hình mạng xem những kết nối nào giữa các switch bị chặn.
XII.
KẾT LUẬN
Qua bài thí nghiệm này, sinh viên đã làm quen với POX, một controller rất phổ biển trong SDN,
đồng thời cũng hiểu rõ cơ chế tạo cây trong module Spanning_tree của POX.
XIII.
CÂU HỎI KIỂM TRA
1. Tại sao phải tạo cây MST?
Do 4 switch được dán nối theo vịng lặp khi đó mỗi gói tin ARP Request từ host đến Swicth sẽ bị
broasdcast ra tồn mạng, khi gói tin đến Switch khác, nó lại tiếp tục broasdcast gói tin bị nhân bản
lên rất nhiều lần gây quá tải cho các Switch trong mạng. Cây MST có module spanning tree giúp ta
block ít nhất 1 cổng trong vòng lặp, tránh nguy cơ các Switch bị down, quá tải
2. Giao thức LLDP (Link Layer Discovery Protocol) là giao thức gì? Được sử dụng khi nào? Mô tả
các hoạt động cụ thể của giao thức LLDP.
Giao thức LLDP dùng để các Switch giao tiếp với controller( cụ thể ở đây là POX). Khi đồ hình
mạng( topology) thay đổi hoặc có thiết bị đệm mới vào topology, bản tin LLDP sẽ được sử dụng
cho quá tình trao đổi thông tin giữa Switch với controller.
15
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
3. Trên Hình 2.3, hãy điền các cổng (port) của switch tương ứng với các kết nối của switch với
những thành phần khác trong mạng.
4. Sinh viên ghi các thông tin sau vào Hình 2.4:
Địa chỉ IP của các thành phần trong mạng.
Các giao diện.
Các cổng của các Switch.
Các giao diện bị chặn (gạch chéo lên hình) sau khi thực hiện thủ tục spanning_tree.
16
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
17
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
BÀI THÍ NGHIỆM
3
ĐỊNH TUYẾN SỬ DỤNG THUẬT TỐN DIJKSTRA
I.
MỤC ĐÍCH THÍ NGHIỆM
Bài thí nghiệm này giúp sinh viên làm quen với cách tạo một module trong POX Controller và cách
sử dụng các thuật toán để tạo ra module định tuyến lớp 3 sử dụng thuật toán Dijkstra
XIV.
THẢO LUẬN
Module định tuyến lớp 3 là module sẽ giúp định hình đường đi cho các gói tin trong mạng, khi chạy
module định tuyến lớp 3 sẽ không cần chạy module l2_learning.
Sau đây là các bước thực hiện của module định tuyến lớp 3.
Bước 1: sinh viên tạo một topology bằng Mininet
Bước 2: Khi nhận 1 packet đến, module định tuyến sẽ kiểm tra xem có phải là bản tin
MultiCast khơng, nếu là bản tin multicast thì sẽ gửi lệnh flood gói tin xuống cho switch thực
hiện, nếu khơng thì module sẽ lấy địa chỉ IP nguồn và IP đích của gói tin, sau đó sẽ chạy
thuật tốn Dijkstra để tìm đường đi cho gói tin này. Thuật tốn Dijkstra sẽ lấy thông tin về
topo từ module discovery, giả sử đã biết IP của tất cả các host trong mạng. Sau khi có
đường đi cho gói tin, module định tuyến sẽ tiến hành tạo các gói tin flow_mod để gửi xuống
switch.
Tồn bộ q trình được thể hiện qua lưu đồ thuật tốn sau:
Receive Packets In
Is MultiCast
Yes
Flood
Get srcIP and dstIP
Run Dijkstra
Algorithm
Send Flowmod
Message
Hình 3.1. Lưu đồ thuật toán Dijktra
18
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
Một số hàm cần dùng
connection.send(): hàm để gửi một bản tin OpenFlow xuống switch
ofp_action_output class: Class này cung cấp hai bản tin: ofp_packet_out và ofp_flow_mod.
ofp_packet_out sẽ gửi các bản tin điều khiển switch, ofp_flow_mod sẽ gửi một bản tin yêu
cầu switch thêm một flow-entry vào bảng flow-table của switch. Các bản tin này có định nghĩa port
mà người dùng cần forward gói tin. Ví dụ khi người dùng muốn flood gói tin thì sẽ dùng hàm:
out_action = of.ofp_action_output(port = of.OFPP_FLOOD)
ofp_match_class: lớp này cung cấp các phương thức giúp người dùng định nghĩa các trường
header của gói tin khớp. Một số trường thường dùng
dl_src: địa chỉ MAC nguồn
dl_dst: địa chỉ MAC đích
in_port: port mà gói tin đến
Ví dụ tạo một đối tượng match các packet đến từ port 3
match = of.ofp_match()
match.in_port = 3
Ví dụ hàm gửi gói tin đầy đủ
def send_packet (self, buffer_id, raw_data, out_port,
in_port):
# tạo một đối tượng msg để gửi gói tin
msg = of.ofp_packet_out()
# tạo action flood
action = of.ofp_action_output(port = of.OFPP_FLOOD)
msg.actions.append(action)
# gửi goi tin đến switch
self.connection.send(msg)
ofp_flow_mod: đây là gói tin sẽ gửi các trường header match xuống để switch thêm vào trong flowtable.
Các trường được định nghĩa
idle_timeout: khoảng thời gian trước khi remove một flow-entry khi khơng có bất cứ gói tin nào
match
XV.
hard_timeout: khoảng thời gian trước khi remove một flow-entry
actions: một danh sách các hành động sẽ thực hiện khi có một gói tin khớp
priority: với giá trị cao hơn thì độ ưu tiên cao hơn
in_port: port mà gói tin đến
YÊU CẦU VỀ THIẾT BỊ
Trong bài thí nghiệm này, cần một PC cài sẵn Mininet, POX Controller
XVI.
TRÌNH TỰ THÍ NGHIÊM
Đầu tiên tạo Topo mạng như bài 2.
Sau đó tạo file code tên “l3_routing.py” với nội dung như ở phần dưới đây.
Lưu ý:
19
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
File được tạo trong thư mục /pox/pox/
Sinh viên cần sửa lại phần cổng của các Switch (kết nối với host) cho đúng với đồ hình mạng
( dịng “self.host = { … }” ).
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.lib.util import dpid_to_str
from pox.lib.util import str_to_dpid
from pox.lib.util import str_to_bool
from pox.lib.packet.arp import arp
from pox.lib.packet.ipv4 import ipv4
from pox.openflow.discovery import Discovery
import pox.lib.packet as pkt
import time
log = core.getLogger()
_flood_delay = 0
class L3Routing (object):
def __init__ (self, connection, transparent):
self.connection = connection
self.transparent = transparent
self.graph={}
self.listSWitch=[]
self.listHost=[]
#’switch’:’port’ trong đó ‘port’ là tên port mà host dùng để kết nối
#với switch. Sinh viên cần sửa lại port cho giống với đồ hình mạng
self.host={'1':3, '2':3, '3':3, '4':3}
self.path=[]
self.macToPort = {}
# Lắng nghe các gói tin đến bằng cách lắng nghe kết nối giứa switch và
controller
connection.addListeners(self)
self.hold_down_expired = _flood_delay == 0
def _handle_PacketIn (self, event):
# Xử lý các gói tin đến
packet = event.parsed
def dijkstra(graph,src,dest,visited=[],distances={},predecessors={}):
# a few sanity checks
if src not in graph:
raise TypeError('the root of the shortest path tree cannot be found
in the graph')
if dest not in graph:
raise TypeError('the target of the shortest path cannot be found in
the graph')
# ending condition
20
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
if src == dest:
# Tạo đường đi ngắn nhất
pred=dest
while pred != None:
self.path.append(pred)
pred=predecessors.get(pred,None)
else :
# khởi tạo giá
if not visited:
distances[src]=0
# thăm hàng xóm
for neighbor in graph[src] :
if neighbor not in visited:
new_distance = distances[src] + 1
if new_distance < distances.get(neighbor,float('inf')):
distances[neighbor] = new_distance
predecessors[neighbor] = src
# đánh dấu đã thăm
visited.append(src)
unvisited={}
for k in graph:
if k not in visited:
unvisited[k] = distances.get(k,float('inf'))
x=min(unvisited, key=unvisited.get)
dijkstra(graph,x,dest,visited,distances,predecessors)
def flood (message = None):
""" Floods gói tin """
msg = of.ofp_packet_out()
if time.time() - self.connection.connect_time >= _flood_delay:
if self.hold_down_expired is False:
self.hold_down_expired = True
log.info("%s: Flood hold-down expired -- flooding",
dpid_to_str(event.dpid))
if message is not None: log.debug(message)
#log.debug("%i: flood %s -> %s", event.dpid,packet.src,packet.dst)
# OFPP_FLOOD is optional; on some switches you may need to change
# this to OFPP_ALL.
msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
else:
pass
#log.info("Holding down flood for %s", dpid_to_str(event.dpid))
msg.data = event.ofp
msg.in_port = event.port
self.connection.send(msg)
21
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
if not self.transparent:
if packet.type == packet.LLDP_TYPE or packet.dst.isBridgeFiltered():
drop()
return
if packet.dst.is_multicast:
flood()
else:
for l in core.openflow_discovery.adjacency:
[1].strip()
sw_src = l.__str__().split("->")[0].split(".")[0].split("-")[5]
port_src= l.__str__().split("->")[0].split(".")[1].strip()
sw_dst = l.__str__().split("->")[1].split(".")[0].split("-")[5]
[1].strip()
port_dst=l.__str__().split("->")[1].split(".")[1].strip()
log.debug("SW src: %s SW dst: %s Port src: %s Port dst: %s" %
(sw_src, sw_dst, port_src, port_dst))
if sw_src in self.listSWitch:
list = self.graph[sw_src]
list[sw_dst]=int(port_src)
self.graph[sw_src]=list
else:
tlist={}
tlist[sw_dst]=int(port_src)
self.graph[sw_src]= tlist
self.listSWitch.append(sw_src)
if isinstance (packet.next, arp):
arp_packet = packet.find(pkt.arp)
src_ip = arp_packet.protosrc.toStr().split(".")[3]
dst_ip = arp_packet.protodst.toStr().split(".")[3]
dpid = dpid_to_str(event.dpid).split("-")[5][1]
if isinstance(packet.next, ipv4):
ip_packet = packet.find(pkt.ipv4)
if ip_packet is not None:
src_ip = ip_packet.srcip.toStr().split(".")[3]
dst_ip = ip_packet.dstip.toStr().split(".")[3]
log.debug("IP src= %s IP dst= %s" %(src_ip, dst_ip))
self.path=[]
dijkstra(self.graph, dst_ip, src_ip)
print self.path
dpid = dpid_to_str(event.dpid).split("-")[5][1]
for index in range(len(self.path)):
if dpid is self.path[index]:
if self.path[index] is self.path[-1]:
msg.idle_timeout = 10
msg.hard_timeout = 30
msg.actions.append(of.ofp_action_output(port = self.host[dpid]))
msg.data = event.ofp
self.connection.send(msg)
else:
22
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
msg = of.ofp_flow_mod()
msg.match = of.ofp_match.from_packet(packet, event.port)
msg.idle_timeout = 10
msg.hard_timeout = 30
self.connection.send(msg)
class l3_routing (object):
def __init__ (self, transparent):
core.openflow.addListeners(self)
self.transparent = transparent
def _handle_ConnectionUp (self, event):
log.debug("Connection %s" % (event.connection,))
L3Routing(event.connection, self.transparent)
def launch (transparent=False, hold_down=_flood_delay):
"""
Starts an L3 routing.
"""
try:
global _flood_delay
_flood_delay = int(str(hold_down), 10)
assert _flood_delay >= 0
except:
raise RuntimeError("Expected hold-down to be a number")
core.registerNew(l3_routing, str_to_bool(transparent))
Sau khi điền code, sinh viên chạy thực hiện lệnh tương tự bài 2 để thực hiện định tuyến cho mạng,
nhưng thay vì sử dụng “l2_learning” ta dùng “l3_routing” như sau (lưu ý thực hiện lệnh khi
đang trong thư mục /pox).
./pox.py openflow.discovery l3_routing
Sau đó thực hiện pingall ở giao diện mininet.
XVII.
KẾT LUẬN
Qua bài thí nghiệm này, sinh viên đã làm quen với cách tạo một module trên POX, cách xử lý các
gói tin và tạo flow-entry bằng POX để thêm vào flow-table của switch.
XVIII. CÂU HỎI KIỂM TRA
1. Ở module định tuyến tại sao cần phải xử lý gói tin ARP?
Gói tin ARP giúp các Switch biết được địa chỉ MAC của các host nối đến Switch( do đã biét IP của
các host này). Từ đó controller đưa ra quyết định chuyênr tiếp dữ liệu giữa các host với nhua bằng
địa chỉ MAC.
23
Bài thí nghiệm mơn Cơ sở Truyền số liệu (ET4070)
Viện Điện tử - Viễn thông Đại học Bách khoa Hà Nội
BÀI THÍ NGHIỆM
4
ĐỊNH TUYẾN SỬ DỤNG THUẬT TỐN BELLMAN
I.
MỤC ĐÍCH THÍ NGHIỆM
Bài thí nghiệm này giúp sinh viên làm quen với cách tạo một module trong POX Controller và cách
sử dụng các thuật toán để tạo ra module định tuyến lớp 3 sử dụng thuật toán Bellman
XIX.
THẢO LUẬN
XX.
YÊU CẦU VỀ THIẾT BỊ
Trong bài thí nghiệm này, cần một PC cài sẵn Mininet, POX Controller
XXI.
TRÌNH TỰ THÍ NGHIÊM
Làm tương tự như bài 3, nhưng thay đoạn code trong file “l3_routing.py" bằng đoạn code sau:
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.lib.util import dpid_to_str
from pox.lib.util import str_to_dpid
from pox.lib.util import str_to_bool
from pox.lib.packet.arp import arp
from pox.lib.packet.ipv4 import ipv4
from pox.openflow.discovery import Discovery
import pox.lib.packet as pkt
import time
log = core.getLogger()
_flood_delay = 0
class L3Routing (object):
def __init__ (self, connection, transparent):
self.connection = connection
self.transparent = transparent
self.graph={}
self.listSWitch=[]
self.listHost=[]
#’switch’:’port’ trong đó ‘port’ là tên port mà host dùng để kết nối
#với switch. Sinh viên cần sửa cho giống với đồ hình mạng
self.host={'1':3, '2':3, '3':3, '4':3}
self.path=[]
self.macToPort = {}
# Lắng nghe các gói tin đến bằng cách lắng nghe kết nối giứa switch
# và controller
connection.addListeners(self)
self.hold_down_expired = _flood_delay == 0
24