Trong m t sủ ộ ố trường hợp, các định dạng địa ch khác có ỉthể hoạt động ví dụ: địa chỉ IP ch m-ấ quad, nhưng việc sử ụ d ng các lớp địa chỉ ph i luôn ả hoạt động.. Nó đưa ra rằng 48 tro
Trang 1ĐẠ I HỌC QU C QIA HA N I Ố Ộ TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Lâm Thiên Phong - 20021567
Trang 21
MỤC L C Ụ
1: SDN Controller 2
2: Nox/Pox Controller 2
2.1: Nox Controller 2
2.2: Pox Controller 4
2.2.1: Gi i thi u chung ớ ệ 4
2.2.2: Kh i ch y pox ở ạ 4
2.2.3: Các thành phần c a pox ủ 5
2.2.4: Pox API 5
2.2.5: Openflow in POX 7
2.2.6: M t s hình nh ch ộ ố ả ạy POX th c t ự ế 9
3: Ryu Controller 11
3.1: Gi i thi u chung ớ ệ .11
3.2: So sánh Ryu v i NOX/POX ớ .13
3.3: Các thành ph n c a Ryu ầ ủ .13
3.4: REST API 15
3.5: API ng d ng Ryu ứ ụ .15
3.5.1: Chủ đề, sự kiện và hàng đợ ự kiệ .15 i s n 3.5.2: Mô hình chương trình ứng dựng Ryu 16
3.6: Tham chi u API giao th c OpenFlow ế ứ .17
3.6.1: L ớp cơ sở cho b n tin OpenFlow ả .17
3.6.2: Functions 18
3.7: K t qu ế ả chạ y mô ph ng các module c a ryu ỏ ủ .19
Tài li u tham kh ệ ảo:, 21
Trang 32
1: SDN Controller
SDN controller là một ứng d ng hoụ ạt động
như bộ não của mạng điều khiển mềm, nó
hoạt động như một điểm ki m soát toàn b ể ộ
hoạt động c a m ng ủ ạ
SDN controller là lo i hạ ệ điều hành cho
mạng mà m i giao ti p gi a các ng d ng ọ ế ữ ứ ụ
và thi t b phế ị ải đi qua Bộ điều khi n nể ằm
giữa các thi t bị m ng một bên và lớp ng ế ạ ứ
d ng ụ ở phía bên kia, d ch các yêu c u t lị ầ ừ ớp
ứng d ng và quụ ản lý điều khiển lu ng sang ồ
các thi t b mế ị ạng (thông qua API hướng
nam) và cung c p cho ng d ng SDN ch ấ ứ ụ ế
độ xem trừu tượng về logic m ng và nghiạ ệp
v (thụ ông qua API hướng b c) Bắ ộ điều
khiển SDN xác định các luồng dữ liệu xảy
ra trong m t ph ng d ặ ẳ ữ liệu SDN M i lu ng ỗ ồ
qua mạng trước tiên phải được s cho phép ự
c a b ủ ộ điều khi n theo chính sách m ng Hình 1: ể ạ Kiến trúc c a SDN controllerủ
N u b ế ộ điều khi n cho phép m t lu ng, nó s tính toán m t tuyể ộ ồ ẽ ộ ến đường cho luồng đi và thêm một mục nh p cho lu ng ậ ồ đó trong mỗi switch d c theo ọ đường d n V i t t c các chẫ ớ ấ ả ức năng phứ ạp c tđượ ổc t ng h p b i b ợ ở ộ điều khi n, các thi t b chuy n m ch ch ể ế ị ể ạ ỉ đơn giản là qu n lý các b ng lu ng ả ả ồ
mà các m c nh p ch có th ụ ậ ỉ ể được điền b i b ở ộ điều khi n ể
Giao ti p gi a bế ữ ộ điều khi n và thi t b chuy n m ch s d ng giao thể ế ị ể ạ ử ụ ức và API được tiêu chu n ẩhóa Bộ điều khi n SDN ph c vể ụ ụ như một lo i hạ ệ điều hành cho m ng T t c các giao ti p giạ ấ ả ế ữa các ng d ng và thi t b phứ ụ ế ị ải đi qua bộ điều khi n Giao th c OpenFlow k t n i ph n mể ứ ế ố ầ ềm điều khi n v i các thi t b mể ớ ế ị ạng để ph n m m máy ch có th cho các thi t b chuy n m ch biầ ề ủ ể ế ị ể ạ ết nơi
g i các gói Bử ộ điều khi n s d ng giao thể ử ụ ức OpenFlow để ấ c u hình các thi t b m ng và chế ị ạ ọn đường d n t t nhẫ ố ất cho lưu lượng ứng d ng B i vì kụ ở ế hoạch điều khi n mể ạng được th c hi n trong ự ệ
ph n mầ ềm, lưu lượng m ng có th ạ ể được quản lý năng động hơn và ở ứ m c chi tiết hơn nhiều
2: Nox/Pox Controller
2.1: Nox Controller
NOX là bộ điều khi n ể OpenFlow đầu tiên, được phát tri n b i Nicira và tr thành m t ngu n m ể ở ở ộ ồ ởvào 2008 Sau đó được mở rộng và hỗ trợ bởi ON, hoạt động phòng thí nghiệm tại Đại học Stanford, UC Berkeley và ICSI
Những người xây dựng khung SDN đã tập hợp vào năm 2011 và thành lập Trung tâm nghiên cứu mạng mở (ONRC) và ON Lab (Open Network Lab) để ậ t p trung, phát tri n, tri n khai và hể ể ỗ trợ các công c và n n t ng SDN ngu n m Phiên b n NOX có thụ ề ả ồ ở ả ể được định nghĩa là: 1) NOX Classic: Đây là phiên bản đã có sẵn theo GPL từ năm 2009 2) NOX: "NOX mới." Trước đây là
Trang 43
một n n tề ảng điều khi n m ng d a trên C ++ và hể ạ ự ỗ trợ ngôn ng l p trình Python NOX m i chữ ậ ớ ỉ
hỗ trợ C ++ v i ít ng d ng mớ ứ ụ ạng hơn, nhưng nó nhanh hơn nhiều và cung cấp cơ sở mã tốt hơn
so v i NOX-Classic ớ
NOX v a là bừ ộ điều khi n nguyên th y v a là khung d a trên thành phể ủ ừ ự ần để phát tri n các ng ể ứ
d ng SDN Nó cung c p các mô-ụ ấ đun hỗ trợ ụ thể cho OpenFlow nhưng đã đượ c c m r ng Lõi ở ộNOX cung cấp các phương thức trợ giúp và API để tương tác với các thi t b chuy n m ch ế ị ể ạOpenFlow, bao g m trình x lý k t n i và x lý s ki n Các thành ph n b sung t n dồ ử ế ố ử ự ệ ầ ổ ậ ụng API đó
có s n, bao g m theo dõi máy chẵ ồ ủ, định tuyến, c u trúc liên k t (LLDP) và giao diấ ế ện Python được tri n khai làm trình bao b c cho thành ph n API ể ọ ầ
Hình 2: Kiến trúc c a NOX ControllerủNOX thường được s d ng trong nghiên c u mử ụ ứ ạng h c thuọ ật để phát tri n các ể ứng dụng SDN như nghiên c u giao th c m ng M t tác d ng phứ ứ ạ ộ ụ ụ thực s thú v c a vi c s d ng h c thu t r ng rãi ự ị ủ ệ ử ụ ọ ậ ộ
c a nó mã có sủ ẵn để mô ph ng m t switch h c t p và m t switch toàn m ng, có th ỏ ộ ọ ậ ộ ạ ể được s d ng ử ụlàm mã khởi động cho các d án l p trình và th nghi m khác nhau ự ậ ử ệ
Trang 5NOX b m t s h n chị ộ ố ạ ế, Để giải quy t nh ng vế ữ ấn đề này, m t n n t ng m i dộ ề ả ớ ựa trên NOX đã ra
đời POX, t g i mình là anh chị em c a NOX Bộ ự ọ ủ điều khi n POX là phiên b n Python thu n túy ể ả ầ
của NOX Nó được biết đến như một bộ điều khi n dòng ch y m , mã ngu n m , chung, ể ả ở ồ ở được
vi t bế ằng python Đó là đổi mới để ả c i thi n hi u su t c a Python NOX g c ệ ệ ấ ủ ố
2.2: Pox Controller
2.2.1: Gi i thi u chung ớ ệ
POX là phiên b n mả ới hơn, dựa trên Python c a NOX (hoủ ặc NOX trong Python) Ý tưởng đằng sau s phát tri n cự ể ủa nó là đưa NOX trở lại ngu n gồ ốc C ++ c a nó và phát tri n m t n n t ng dủ ể ộ ề ả ựa trên Python riêng bi t (Python 2.7) Nó có API SDN c p cao bao gệ ấ ồm biểu đồ cấu trúc liên k t có ế
thể truy v n và h ợ ảo hóa ấ ỗtr
Những ưu điểm của POX:
POX có giao di n Pythonic OpenFlow ệ
POX có các thành ph n m u có th tái s dầ ẫ ể ử ụng để lựa chọn đường dẫn, khám phá cấu trúc liên k t ế
POX chạy ở ấ ứ đâu và có thể đi kèm với th i gian ch y PyPy không c b t c ờ ạ ần cài đặt để triển khai d dàng ễ
POX đặc biệt nhắm mục tiêu Linux, Mac OS và Windows
POX h ỗ trợ các công c GUI và tr c quan hóa giụ ự ống như NOX
POX hoạt động t t so v i các ng dố ớ ứ ụng NOX được vi t b ng Python ế ằ
Cả NOX và POX hiện đang giao tiếp với các thi t b chuy n m ch OpenFlow v1.0 và bao g m h ế ị ể ạ ồ ỗtrợ c bi t cho Open vSwitch đặ ệ
Không có GUI chính th c cho POX, m c dù các d án c a bên th ba, ch ng hứ ặ ự ủ ứ ẳ ạn như POXDesk1, tồn tại Đặc bi t, POXDesk cung c p chệ ấ ức năng cơ bản, ch ng hẳ ạn như trực quan hóa các b ng ảluồng, các s kiự ện được ghi l i và c u trúc liên k t m ng Giao ti p gi a POXDesk và lõi c a POX ạ ấ ế ạ ế ữ ủ
sử d ng API REpresentational State Transfer (REST) có s n vụ ẵ ới b ộ điều khi n ể
Trang 6Có th chuyể ển các tùy ch n cho các thành ph n b ng cách chỉ nh các tùy ch n sau tên thành ọ ầ ằ đị ọ
phần Chúng được chuy n n hàm launch() c a mô-ể đế ủ đun tương ứng Ví d : n u mu n ch y POX ụ ế ố ạdưới d ng b ạ ộ điều khiển OpenFlow và địa ch ỉ điều khi n ho c cể ặ ổng mà nó s d ng, có th chuyử ụ ể ển chúng dưới dạng tùy chọn cho thành phần openflow.01:
./pox.py openflow.of_01 address=10.1.1.1 port=6634
Làm vi c v i POX: The POX Core objệ ớ ect
POX có một đối tượng gọi là "core", đóng vai trò là điểm trung tâm cho phần lớn API của POX M t sộ ố chức năng mà nó cung cấp ch là các trình bao b c thu n ti n xung quanh ỉ ọ ậ ệcác chức năng khác và một số chức năng là duy nhất Tuy nhiên, m t trong nhộ ững mục đích chính khác của đối tượng cốt lõi là cung cấp điểm hẹn giữa các thành phần Thông thường, thay vì s d ng các câu lử ụ ệnh import để ộ m t thành ph n nh p m t thành ph n khác ầ ậ ộ ầ
để chúng có th tương tác, các thành phần thay vào đó sẽể tự "đăng ký" trên đối tượng c t ốlõi và các thành ph n khác s truy vầ ẽ ấn đối tượng cốt lõi M t l i th lộ ợ ế ớn cho phương pháp này là s ph thu c gi a các thành phự ụ ộ ữ ần không được mã hóa c ng và các thành ph n khác ứ ầnhau hi n th cùng m t giao di n có th d dàng thay th cho nhau ể ị ộ ệ ể ễ ế Nghĩ theo một cách khác, điều này cung cấp một giải pháp thay thế cho không gian tên mô-đun thông thường
c a Python, có ph n d s p x p lủ ầ ễ ắ ế ại hơn Nhiều mô-đun trong POX sẽ muốn truy c p vào ậđối tượng cốt lõi Theo quy ước, điều này đang thực hi n b ng cách nhệ ằ ập đối tượng c t lõi ốnhư sau:
“from pox.core import core”
Trang 76
Làm vi c v i Addresses: pox.lib.addresses ệ ớ
Địa chỉ IPv4, IPv6 và Ethernet trong POX được đại di n bởi các lớp IPAddr, IPAddr6 và ệEthAddr c a pox.lib.addresses Trong m t sủ ộ ố trường hợp, các định dạng địa ch khác có ỉthể hoạt động (ví dụ: địa chỉ IP ch m-ấ quad), nhưng việc sử ụ d ng các lớp địa chỉ ph i luôn ả
hoạt động Ví d : khi làm vi c vụ ệ ới địa chỉ IP:
“from pox.lib.addresses import IPAddr, IPAddr6, EthAddr
ip = IPAddr("192.168.1.1")
print str(ip) # Prints "192.168.1.1"
print ip.toUnsignedN() # Convert to network-order unsigned integer 16885952 print ip.raw # Returns a length-four bytes object (a four byte string, more or less)
T t c các lấ ả ớp gói trong POX được tìm thấy trong pox / lib / packet Theo quy ước, nhập thư viện gói POX dưới dạng:
vết tcpdump / pcap Thư mục pxpcap cũng chứa m t vài thành ph n POX ti n ích ộ ầ ệ
nh có thỏ ể dùng làm ví dụ n u ế muốn vi t mã c a riêng mình b ng pxpcap Rõ ràng ế ủ ằ
nh t trong s này có thấ ố ể được g i là "pxshark" - nó n m bọ ắ ắt lưu lượng truy c p t ậ ừmột giao di n, m x nó bệ ổ ẻ ằng thư viện gói POX và k t xu t k t qu Có thế ấ ế ả ể chạy điều này như sau: /pox.py pox.lib.pxpcap interface=eth0
Để tìm hi u thêm về các API c a POX có th truy c p: https://noxrepo.github.io/pox-ể ủ ể ậdoc/html/#pox-apis
Trang 87
2.2.5: Openflow in POX
Một trong nh ng mữ ục đích chính của vi c s dệ ử ụng POX là để phát tri n các ng dể ứ ụng điều khiển OpenFlow - nghĩa là nơi POX hoạt động như một bộ điều khi n cho bể ộ ch ểuy n m ch OpenFlow ạ(ho c, theo thu t ng thích hặ ậ ữ ợp hơn, đường d n d u OpenFlow) ẫ ữ liệ
Vì POX thường được sử dụng với OpenFlow, nên có một cơ chế tải nhu cầu đặc biệt, thường sẽ phát hi n khi ệ đang cố gắng s d ng OpenFlow và t i lên các thành ph n liên ử ụ ả ầ quan đến OpenFlow
v i các giá tr mớ ị ặc định N u demand loading không phát hi n ra rế ệ ằng đang cố ắ g ng s d ng nó, ử ụ
có th tinh ch nh thành ph n cể ỉ ầ ủa mình để làm rõ r ng (ch c n truy c p core.openflow trong hàm ằ ỉ ầ ậ
kh i ch y cở ạ ủa ẽ làm điều đó) hoặ s c ch c n ch nh thành ph n "openflow" u dòng l nh ỉ ầ ỉ đị ầ ở đầ ệMột ph n chính cầ ủa API POX OpenFlow là đối tượng "nexus" OpenFlow Thông thường, có một đối tượng duy nhất như vậy được đăng ký là core.openflow như một phần của quá trình tải nhu
cầu được đề ậ ở c p trên
Thành ph n POX th c s giao ti p v i các thi t b chuy n m ch OpenFlow là openflow.of_01 (01 ầ ự ự ế ớ ế ị ể ạ
đề cập đến thự ếc t là thành ph n này nói giao thức dây OpenFlow 0x01) M t l n nầ ộ ầ ữa, tính năng demand-loading thường s khi n thành phẽ ế ần này được khởi t o v i các giá tr mạ ớ ị ặc định (nghe trên
c ng 6633) Tuy nhiên, có th g i nó t ổ ể ọ ự động thay vào đó để thay đổi các tùy ch n ho c n u muọ ặ ế ốn chạy nó nhi u l n (ví dề ầ ụ: để nghe trên TCP và SSL đơn giản hoặc trên nhiều cổng)
Một s ví d v openflow trong pox: ố ụ ề
DPIPS in POX
Đặ ảc t OpenFlow chỉ nh r ng mđị ằ ỗi đường dẫn d li u (switchesữ ệ ) có ID đường dẫn d li u hoặc ữ ệDPID duy nh t, là giá trấ ị 64 bit và được truy n t switch n bề ừ đế ộ điều khi n trong b ng thông báo ể ằofp_switch_features Nó đưa ra rằng 48 trong số các bit đó được dự định là một địa chỉ Ethernet
và 16 bit được "xác định bởi người tri n khai" (trong th c tể ự ế, chúng thường ch b ng không) Vì ỉ ằ
b n thân b chuy n m ch OpenFlow (ch yả ộ ể ạ ủ ếu) là "minh b ch" với m ng, nên không hoàn toàn rõ ạ ạràng chính xác địa chỉ Ethernet nào được cho là nằm trong các bit đó, nhưng chúng ta có thể giả định đó là một cái gì đó dành riêng cho switch Vì các đối tượng Kết nối OpenFlow (được thảo
luận bên dưới) được gắn với một switch cụ ểth, DPID có sẵn trên đối tượng Kết n i b ng thu c ố ằ ộtính dpid Ngoài ra, địa chỉ Ethernet tương ứng có sẵn bằng cách sử dụng thuộc tính eth_addr POX định nghĩa một định dạng DPID cụ thể, được triển khai trong pox.lib.util.dpid_to_str() Khi được truyền DPID trong trường hợp ph biổ ến là 16 bit "do người triển khai xác định" là 0, k t qu ế ả
là m t chu i trông r t giộ ỗ ấ ống địa ch Ethernet ngo i tr thay vì d u hai chỉ ạ ừ ấ ấm phân tách byte (như POX luôn làm cho địa chỉ Ethernet), dấu gạch ngang được sử dụng thay thế
Giao ti p v i Datapath (Switch) ế ớ
Khi b n tin n t switch, chúng hi n thả đế ừ ể ị trong POX dướ ại d ng s ki n có th vi t trình x lý s ự ệ ể ế ử ự
ki n - nói chung có m t lo i s kiệ ộ ạ ự ện tương ứng v i t ng lo bớ ừ ại ản tin mà switch có th g i ể ử
Về cơ bản, có hai cách có th giao ti p vể ế ới đường d n dẫ ữ liệu trong POX: thông qua Connection,
K nết ối cho đường d n dẫ ữ liệu cụ thể đó hoặc thông qua OpenFlow Nexus đang quản lý đường
Trang 98
d n dẫ ữ liệu đó Có một đối tượng K t n i cho mế ố ỗi đường d n dẫ ữ liệu được k t n i v i POX và ế ố ớthường có m t OpenFlow Nexus qu n lý t t c các k t n i Trong cộ ả ấ ả ế ố ấu hình bình thường, có một mối quan h OpenFlow duy nh t có sệ ấ ẵn dưới d ng core.openflow Có r t nhi u s ạ ấ ề ự chồng chéo giữa
K t n i và Nexus M t trong hai có th ế ố ộ ể được s dử ụng để gửi b n tin ả đến một switch và h u h t các ầ ế
sự kiện được nêu ra trên c ả hai Đôi khi nó thuậ tiện hơn để sử dụng cái này hay cái kia n
Openflow Event: Respond to switch
H u h t các s kiầ ế ự ện liên quan đến OpenFlow được nêu ra để ph n h i tr c ti p v i m b n tin ả ồ ự ế ớ ột ảnhận được t mừ ột switch Theo hướng d n chung, các s kiẫ ự ện liên quan đến OpenFlow có ba thuộc tính sau:
attribute Type description
connection Connection Connection to the relevant switch (e.g., which sent message this event corresponds to)
Dpid Long Datapath ID of relevant switch (use dpid_to_str() to form
it for display)
O fp ofp_header subclass OpenFlow message object that caused this evSee OpenFlow Messages for info on these objects
B n tin openflow ả
B n tin OpenFlow là cách các thi t b chuy n m ch OpenFlow giao ti p v i bả ế ị ể ạ ế ớ ộ điều khi n Các ể
b n tin ả được định nghĩa trong Đặc tả OpenFlow Có nhiều phiên bản của đặc điểm kỹ thu t; POX ậ
hi n h trệ ỗ ợ OpenFlow phiên b n 1.0.0 (phiên b n giao th c dây 0x01) POX ch a các l p và h ng ả ả ứ ứ ớ ằ
số tương ứng với các phần tử của giao thức OpenFlow và chúng được định nghĩa trong tệp pox / openflow / libopenflow_01.py (01 đề ập đế c n phiên bản giao thức dây) Đối với hầu h t các ph n, ế ầcác tên giống như trong đặc điểm k thu t Trong mỹ ậ ột vài trường h p, POX có nh ng cái tên mà ợ ữchúng tôi nghĩ là tốt hơn Ngoài ra, POX định nghĩa một số lớp không tương ứng với các cấu trúc
c ụ thể trong đặc t ả (đặc t không mô t các c u trúc ch là mả ả ấ ỉ ột tiêu đề OpenFlow đơn giản ch ỉ được phân bi t b i thu c tính lo i tin nh n - POX làm vi c) ệ ở ộ ạ ắ ệ
Trang 109
Attribute Meaning
in_port Switch port number the packet arrived on
dl_src Ethernet source address
dl_dst Ethernet destination address
dl_vlan VLAN ID
dl_vlan_pcp VLAN priority
dl_type Ethertype / length (e.g 0x0800 = IPv4)
nw_tos IP TOS/DS bits
nw_proto IP protocol (e.g., 6 = TCP) or lower 8 bits of ARP opco
nw_src IP source address
nw_dst IP destination address
tp_src TCP/UDP source port
tp_dst TCP/UDP destination port
Openflow Action
Hành động OpenFlow được áp dụng cho các gói phù hợp với quy tắc được cài đặ ại đườt t ng dẫn
d ữ liệu Các đoạn mã được tìm thấy ở đây có thể được tìm th y trong libopenflow_01.py trong pox ấ/ openflow
Để có th có nhi u thông tin v POX ho c đầy đủể ề ề ặ các thành phần, tính năng và các câu lệnh của POX, truy c p: ậ https://noxrepo.github.io/pox-doc/html/#
2.2.6: M t s hình nh ch y POX th c t ộ ố ả ạ ự ế
Ta t o 1 topology gạ ồm 1 controller , 2 switches và 4 hosts (như hình bên dưới)
Đầu tiên, ping các host với nhau ( khi chưa kích hoạt controller) sử ụ d ng lệnh pingall Ta thấy t ỉ
lệ các packets drop là 100%
Trang 1110
Sau đó ta thử bắt các gói tin bằng Wireshark, ta thấy wireshark không bắt được gói tin nào
Tiếp theo, Ta ping các host với nhau s d ng lử ụ ệnh pingall nhưng lần này đã kích hoạt Pox
controller b ng lằ ệnh “python3 pox.py forwarding.l2_learning” và s dử ụng Wireshark để ắ b t các gói tin