Chương trình cơ bản về chuyển tiếp gói tin và chương trình cân bằng tải với 2 giải thuật round robin và weight round robin. Trong tương lai từ những kết quả đạt được trong đồ án này có thể phát triển tiếp theo một số hướng như sau: • Thực hiện triển khai load balance cho web server. • Kiểm tra tình trạng của server đích có đang hoạt động không. Trong quá trình thực hiện và nghiên cứu đồ án này, sẽ không thể nào tránh được những thiếu sót. Em rất mong nhận được những đóng góp quý báu của các thầy cô để bài nghiên cứu này cang được hoàn thiện một cách tốt hơn.
LÝ THUYẾT LIÊN QUAN
Giới thiệu về mạng SDN
Hiện nay nhu cầu về ứng dụng của các người dùng cuối đang ngày càng gia tăng, kéo theo đó là nhu cầu khác nhau của người dùng về mạng kết nối Mô hình mạng cần phải đáp ứng việc thay đổi nhanh chóng các thông số về trễ, băng thông, định tuyến, bảo mật… theo các yêu cầu của các ứng dụng Một mạng có thể lập trình sẽ đáp ứng được yêu cầu trên, mở ra nhiều cánh cửa mới tới các ứng dụng
Tổ chức phi lợi nhuận ONF (Open Networking Foundation), được thành lập bởi các công ty Deutsche Telekom, Facebook, Google, Microsoft, Verizon, và Yahoo! đã định nghĩa công nghệ SDN như là giải pháp để cung cấp một mạng như vậy SDN là một kiến trúc linh hoạt, dễ quản lý, hiệu suất cao và thích nghi tốt, khiến công nghệ này lý tưởng cho các ứng dụng đòi hỏi băng thông cao và cần sự linh hoạt hiện nay Trong SDN, phần điều khiển mạng được tách ra khỏi phần chuyển tiếp và có thể cho phép lập trình trực tiếp được.
Kiến trúc của mạng SDN
Kiến trúc của SDN [1] gồm 3 lớp riêng biệt: lớp ứng dụng, lớp điều khiển, và lớp cơ sở hạ tầng (lớp chuyển tiếp)
Hình 2.1 Kiến trúc 3 lớp mô hình mạng SDN
Là các ứng dụng được doanh nghiệp triển khai trên mạng, được kết nối tới lớp điều khiển thông qua các API, cung cấp khả năng cho phép lớp ứng dụng lập trình lại (cấu hình lại) mạng (điều chỉnh các tham số trễ, băng thông, định tuyến,
…) thông qua lớp điều khiển
Lớp ứng dụng cung cấp các giao diện có khả năng lập trình mở, cho phép các nhà cung cấp dịch vụ điện toán đám mây cung cấp các dịch vụ đám mây công cộng tự động cho các doanh nghiệp Các tổ chức, doanh nghiệp có thể tạo ra một
“đám mây ảo” cô lập, thông qua hạ tầng cơ sở đám mây công cộng, kiểm soát hoàn toàn các dịch vụ và các ứng dụng cho người sử dụng
Lớp điều khiển là nơi tập trung các bộ điều khiển thực hiện việc điều khiển cấu hình mạng theo các yêu cầu từ lớp ứng dụng Bộ điều khiển trong mạng định nghĩa bằng phần mềm SDN là bộ não của toàn bộ hoạt động trong mạng Đây là ứng dụng hoạt động như điểm kiểm soát chiến lược trong mạng SDN, quản lý kiểm soát lưu lượng tới các Switch / router 'bên dưới' (thông qua API) và lớp ứng dụng 'ở trên' để triển khai mạng thông minh Để truyền thông và điều khiển lớp cơ sở hạ tầng, lớp điều khiển sử dụng các cơ chế như OpenFlow, ONOS, ForCES, PCEP, NETCONF, SNMP hoặc thông qua các cơ chế riêng biệt
Một bộ điều khiển (Controller là một ứng dụng quản lý kiểm soát dòng lưu lượng trong môi trường mạng Bộ điều khiển SDN thực hiện việc cấu hình, giám sát các phần tử mạng qua giao thức OpenFlow
Bộ điều khiển SDN phục vụ giống như một hệ điều hành (OS) cho mạng Tất cả thông tin liên lạc giữa các ứng dụng và các thiết bị phải đi qua bộ điều khiển
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 con đường tốt nhất cho gói tin Cùng với chức năng chính của nó, nó có thể tiếp tục được mở rộng để thực hiện thêm nhiệm vụ quan trọng như định tuyến và truy cập mạng Bộ điều khiển còn có vai trò cung cấp API để có thể xây dựng các ứng dụng cho hệ thống mạng, và thu nhận thông tin từ hệ thống mạng vật lý, điều khiển hệ thống mạng vật lý
OpenFlow là một giao thức sử dụng các API (giao diện lập trình ứng dụng – application programming interfaces) để cấu hình các thiết bị chuyển mạch trong một mạng lưới
Hình 1.8 cho thấy chức năng cơ bản của bộ điều khiển (Control plane) đó là việc điều khiển lưu lượng, thiết lập đường đi, các chính sách cho toàn bộ các bộ chuyển mạch (Switch) ở lớp dữ liệu (Data Plane)
Hình 2.2 Bộ điều khiển SDN
Lớp cơ sở hạ tầng
Là các thiết bị mạng thực tế (vật lý hay ảo hóa) thực hiện việc chuyển tiếp gói tin theo sự điều khiển của lớp điểu khiển Một thiết bị mạng có thể hoạt động theo sự điều khiển của nhiều bộ điều khiển khác nhau, điều này giúp tăng cường khả năng ảo hóa của mạng
Trung tâm dữ liệu mạng SDN
Một trung tâm dữ liệu là một kho lưu trữ tập trung, hoặc là vật lý hay ảo, và sử dụng nhiều tổ chức các máy chủ và các thiết bị mạng mà xử lý yêu cầu và liên kết nối đến máy chủ khác trong mạng hoặc mạng Internet công cộng Các yêu cầu thực hiện một loạt trung tâm dữ liệu phục vụ từ nội dung trang web, email, tính toán phân phối cho nhiều ứng dụng dựa trên đám mây
SDN [2] đã thu hút nhiều nhà khai thác trung tâm dữ liệu đối với nó, và Google đã triển khai cách tiếp cận SDN thành một trong những xương sống của nó Các SDN triển khai mạng đã hoạt động tại Google, và đã cung cấp các lợi ích bao gồm cả việc sử dụng các nguồn lực cao hơn, xử lý thất bại nhanh hơn và nâng cấp nhanh hơn Tuy nhiên, những thách thức của nó bao gồm bộ điều khiển lỗi, chương trình dòng chảy (Open Flow) và cắt các phần tử mạng cho một điều khiển phân tán Tương tự như vậy NEC cũng đã triển khai thành công phương pháp tiếp cận SDN trong trung tâm dữ liệu và mạng đường trục tại nhà máy phần mềm riêng của mình.
Ngôn ngữ P4
P4 là một ngôn ngữ để diễn đạt cách các gói được xử lý bởi mặt phẳng dữ liệu của phần tử chuyển tiếp có thể lập trình được chẳng hạn như bộ chuyển đổi phần cứng hoặc phần mềm, thẻ giao diện mạng, bộ định tuyến hoặc mạng thiết bị Nhiều mục tiêu thực hiện cả mặt phẳng điều khiển và mặt phẳng dữ liệu P4 được thiết kế để chỉ định chức năng mặt phẳng dữ liệu của mục tiêu Các chương trình P4 cũng xác định một phần giao diện mà mặt phẳng điều khiển và mặt phẳng dữ liệu giao tiếp, nhưng P4 không thể được sử dụng để mô tả chức năng mặt phẳng
5 điều khiển của mục tiêu Trong phần còn lại của tài liệu này, khi chúng ta nói về P4 là "lập trình mục tiêu", nghĩa là "lập trình mặt phẳng dữ liệu của mục tiêu"
Hình 2.3 Switch truyền thống với switch được lập trình bằng P4
Là một ví dụ cụ thể về mục tiêu, hình trên minh họa sự khác biệt giữa switch chức năng cố định truyền thống và switch lập trình P4 Trong một switch truyền thống, nhà sản xuất định nghĩa chức năng mặt phẳng dữ liệu Mặt phẳng điều khiển kiểm soát mặt phẳng dữ liệu bằng cách quản lý các mục nhập trong bảng (ví dụ: bảng định tuyến), định cấu hình các đối tượng chuyên biệt (ví dụ: mét) và bằng cách xử lý gói điều khiển (ví dụ: gói giao thức định tuyến) hoặc các sự kiện không đồng bộ, chẳng hạn như thay đổi trạng thái liên kết hoặc thông báo học tập
Switch lập trình P4 khác với switch truyền thống ở hai điểm cơ bản:
• Chức năng của mặt phẳng dữ liệu không được cố định trước mà được xác định bởi chương trình P4 Mặt phằng dữ liệu được định cấu hình tại thời điểm khởi tạo để triển khai chức năng được mô tả bởi chương trình P4 (được hiển thị bằng mũi tên dài màu đỏ) và không có kiến thức tích hợp về các giao thức mạng hiện có
• Mặt phẳng điều khiển giao tiếp với mặt phẳng dữ liệu bằng cách sử dụng các kênh giống như trong một thiết bị chức năng cố định, nhưng tập hợp các bảng và các đối tượng khác trong mặt phẳng dữ liệu không còn cố định nữa, vì chúng được xác định bởi một chương trình P4 Trình biên dịch P4 tạo API mà mặt phẳng điều khiển sử dụng để giao tiếp với mặt phẳng dữ liệu [3]
Do đó, P4 có thể được cho là độc lập với giao thức, nhưng nó cho phép các lập trình viên thể hiện một tập hợp phong phú của giao thức và các hành vi mặt phẳng dữ liệu khác
Các phần tóm tắt cốt lõi được cung cấp bởi ngôn ngữ P4 là [4]:
• Header types mô tả định dạng (tập hợp các trường và kích thước của chúng) của mỗi tiêu đề trong một gói
• Parsers mô tả các chuỗi tiêu đề được phép trong các gói đã nhận, cách xác định các chuỗi tiêu đề đó cũng như các tiêu đề và trường để trích xuất từ các gói
• Tables liên kết các khóa do người dùng xác định với các hành động Tables P4 khái quát các bảng chuyển đổi truyền thống; chúng có thể được sử dụng để triển khai các bảng định tuyến, bảng tra cứu luồng, danh sách kiểm soát truy cập và các các loại bảng do người dùng xác định, bao gồm các quyết định nhiều biến phức tạp
• Actions là các đoạn mã mô tả cách thao tác các trường tiêu đề gói và siêu dữ liệu Các hành động có thể bao gồm dữ liệu, được cung cấp bởi mặt phẳng điều khiển trong thời gian chạy
• Match-action đơn vị thực hiện chuỗi hoạt động sau: o Xây dựng khóa tra cứu từ các trường gói hoặc siêu dữ liệu được tính toán o Thực hiện tra cứu bảng bằng khóa đã xây dựng, chọn một hành động (bao gồm cả dữ liệu được liên kết) để thực thi o Cuối cùng, thực hiện hành động đã chọn
• Control luồng diễn đạt một chương trình mệnh lệnh mô tả quá trình xử lý gói trên một mục tiêu, bao gồm trình tự phụ thuộc dữ liệu của các lệnh gọi đơn vị hành động đối sánh Deparsing (gói tin lại) cũng có thể được thực hiện bằng cách sử dụng một luồng điều khiển
• Extern objects là các cấu trúc dành riêng cho kiến trúc có thể được điều khiển bởi các chương trình P4 thông qua các API được xác định rõ, nhưng có hành vi bên trong là khó có dây (ví dụ: đơn vị tổng kiểm tra) và do đó không thể lập trình bằng P4
• User-defined metadata: cấu trúc dữ liệu do người dùng xác định được liên kết với mỗi gói
• Intrinsic metadata: siêu dữ liệu được cung cấp bởi kiến trúc được liên kết với mỗi gói - ví dụ: cổng đầu vào nơi một gói đã được nhận
Hình 2.4 Lập trình mục tiêu với P4
Hình trên cho thấy quy trình làm việc của công cụ điển hình khi lập trình mục tiêu bằng P4
Các nhà sản xuất mục tiêu cung cấp khung triển khai phần cứng hoặc phần mềm, định nghĩa kiến trúc và trình biên dịch P4 cho mục tiêu đó Lập trình viên P4 viết chương trình cho một kiến trúc cụ thể, xác định một tập hợp các thành phần có thể lập trình P4 trên mục tiêu cũng như bên ngoài của chúng các giao diện mặt phẳng dữ liệu
Việc biên dịch một bộ chương trình P4 tạo ra hai hiện vật:
• Một cấu hình mặt phẳng dữ liệu thực hiện logic chuyển tiếp được mô tả trong chương trình đầu vào
• Một API để quản lý trạng thái của các đối tượng trên mặt phẳng dữ liệu từ mặt phẳng điều khiển
P4 là ngôn ngữ dành riêng cho miền được thiết kế để có thể triển khai trên nhiều mục tiêu bao gồm thẻ giao diện mạng có thể lập trình, FPGA, chuyển mạch phần mềm và ASIC phần cứng Như vậy, ngôn ngữ bị hạn chế đối với các cấu trúc có thể được triển khai hiệu quả trên tất cả các nền tảng này
Giả sử chi phí cố định cho các hoạt động tra cứu bảng và tương tác với các đối tượng bên ngoài, tất cả các chương trình P4 (tức là trình phân tích cú pháp và điều khiển) thực hiện một số lượng không đổi các hoạt động cho mỗi byte của đầu vào đã nhận và phân tích gói tin Mặc dù trình phân tích cú pháp có thể chứa các vòng lặp, miễn là một số tiêu đề được trích xuất trên mỗi chu kỳ, gói tin tự cung cấp một ràng buộc về tổng số thực thi của trình phân tích cú pháp Nói cách khác, theo những giả định này, độ phức tạp tính toán của chương trình P4 là tuyến tính trong tổng kích thước của tất cả các tiêu đề và không bao giờ phụ thuộc vào kích thước của trạng thái được tích lũy trong khi xử lý dữ liệu (ví dụ: số luồng hoặc tổng số gói được xử lý) Những đảm bảo này là cần thiết (nhưng không đủ) để cho phép xử lý gói nhanh trên nhiều mục tiêu
Kiến trúc P4 xác định các khối lập trình P4 (ví dụ: parser, ingress control flow, egress control flow, deparser, v.v.) và các giao diện mặt phẳng dữ liệu của chúng
XÂY DỰNG CHƯƠNG TRÌNH P4 CÂN BẰNG TẢI
Dùng round robin
Cấu hình file p4app.json
Mô tả liên kết trong mạng:
"links": [["h1", "s1", {"delay":"20ms", "bw": 20, "queue_length": 100,
Mô tả các host trong cấu trúc liên kết mạng:
Thêm các file tệp quy tắc cho các switch forward từ ipv4 về địa chỉ vật lý
File tệp quy tắc cho switch s1: table_set_default forward nop table_set_default ecmp_group nop table_set_default ecmp_nhop nop table_set_default send_frame nop table_add forward set_nhop 10.0.1.1/32 => 00:00:00:00:01:01 1 table_add forward set_nhop 10.0.2.2/32 => 00:00:00:00:02:02 2 table_add forward set_nhop 10.0.3.3/32 => 00:00:00:00:03:03 3 table_add forward set_nhop 10.0.4.4/32 => 00:00:00:00:04:04 4 table_add forward set_nhop 10.0.5.5/32 => 00:00:00:00:05:05 5 table_add set_max _max 10.0.0.1/32 => 4 table_add set_status1 _fail1 10.0.0.1/32 => 0 table_add set_status2 _fail2 10.0.0.1/32 => 0 table_add set_status3 _fail3 10.0.0.1/32 => 0 table_add set_status4 _fail4 10.0.0.1/32 => 0 table_add forward read_flowlet_select 10.0.0.1/32 => table_add ecmp_group set_ecmp_select 10.0.0.1/32 => table_add ecmp_nhop set_ecmp_nhop 1 => 00:00:00:00:02:02 10.0.2.2 2 table_add ecmp_nhop set_ecmp_nhop 2 => 00:00:00:00:03:03 10.0.3.3 3 table_add ecmp_nhop set_ecmp_nhop 3 => 00:00:00:00:04:04 10.0.4.4 4 table_add ecmp_nhop set_ecmp_nhop 4 => 00:00:00:00:05:05 10.0.5.5 5 table_add send_frame rewrite_sip 1 => 10.0.0.1
• Tiêu đề ethernet header ethernet_t { bit dstAddr; bit srcAddr;
• Tiêu đề IPv4 header ipv4_t { bit version; bit ihl; bit diffserv; bit totalLen; bit identification; bit flags; bit fragOffset; bit ttl; bit protocol; bit hdrChecksum; bit srcAddr; bit dstAddr;
• Kiến trúc của các header struct headers {
• Tìm đích đến trong bảng định tuyến IPv4
@name(".forward") table forward { actions = {
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
• Cập nhật địa chỉ MAC nguồn và đích
@name(".set_ecmp_nhop") action set_ecmp_nhop(bit nhop_mac, bit nhop_ipv4, bit port) { standard_metadata.egress_spec = port; hdr.ipv4.dstAddr = nhop_ipv4; hdr.ethernet.dstAddr = nhop_mac; hdr.ipv4.ttl = hdr.ipv4.ttl + 8w255;
@name(".set_nhop") action set_nhop(bit dmac, bit port) { standard_metadata.egress_spec = port; hdr.ethernet.dstAddr = dmac; hdr.ipv4.ttl = hdr.ipv4.ttl + 8w255;
@name(".forward") table forward { actions = {
_drop; set_nhop; nop; read_flowlet_select;
} key = { hdr.ipv4.dstAddr: lpm;
• Đóng tiêu đề vào gói tin control DeparserImpl(packet_out packet, in headers hdr) { apply { packet.emit(hdr.ethernet); packet.emit(hdr.arp); packet.emit(hdr.ipv4); packet.emit(hdr.udp); packet.emit(hdr.tcp);
Chạy p4run để triển khai hệ thống mạng
Hình 3.2 Round robin: Chạy p4run để triển khai round robin
Hình 3.3 Round robin: Thông báo sau khi hoàn thành triển khai
Hình 3.4 Round robin: Mở các host bằng terminal
Hình 3.5 Round robin: Gửi gói tin từ host 1
Hình 3.6 Round robin: Gói tin nhận được ở host 2
Hình 3.7 Round robin: Gói tin được nhận ở host 3
Hình 3.8 Round robin: Gói tin được nhận ở host 4
Hình 3.9 Round robin: Gói tin được nhận ở host 5
Dùng weight round robin
Bộ điều khiển sẽ kiểm tra tình trạng kết nối tới máy chủ web Nếu máy chủ web không hoạt động, bộ điều khiển sẽ thông báo cho LB không gửi yêu cầu http đến máy chủ bị trục trặc
Mô tả liên kết trong mạng:
"links": [["h1", "s1" ["h2", "s1", {"delay":"20ms", "bw": 20, "queue_length":
100, "weight":5}],], ["h3", "s1", {"delay":"20ms", "bw": 20, "queue_length":
100, "weight":4}],], ["h4", "s1", {"delay":"20ms", "bw": 20, "queue_length":
100, "weight":3}],], ["h5", "s1", {"delay":"20ms", "bw": 20, "queue_length":
Mô tả các host trong cấu trúc liên kết mạng:
Thêm các file tệp quy tắc cho các switch forward từ ipv4 về địa chỉ vật lý
File tệp quy tắc cho switch s1: table_set_default forward nop table_set_default ecmp_group nop table_set_default ecmp_nhop nop table_set_default send_frame nop table_set_default set_weight nop table_add set_status1 _fail1 10.0.0.1/32 => 0 table_add set_status2 _fail2 10.0.0.1/32 => 0 table_add set_status3 _fail3 10.0.0.1/32 => 0 table_add set_status4 _fail4 10.0.0.1/32 => 0 table_add forward set_nhop 10.0.1.1/32 => 00:00:00:00:01:01 1 table_add forward read_flowlet_select 10.0.0.1/32 =>
#the weight for server1 to server4: 1 2 3 4 table_add set_weight weight 10.0.0.1/32 => 1 2 3 4 table_add ecmp_group set_ecmp_select 10.0.0.1/32 => table_add ecmp_nhop set_ecmp_nhop 1 => 00:00:00:00:02:02 10.0.2.2 2 table_add ecmp_nhop set_ecmp_nhop 2 => 00:00:00:00:03:03 10.0.3.3 3 table_add ecmp_nhop set_ecmp_nhop 3 => 00:00:00:00:04:04 10.0.4.4 4 table_add ecmp_nhop set_ecmp_nhop 4 => 00:00:00:00:05:05 10.0.5.5 5
33 table_add send_frame rewrite_sip 1 => 10.0.0.1
• Tiêu đề ethernet header ethernet_t { bit dstAddr; bit srcAddr; bit etherType;
• Tiêu đề IPv4 header ipv4_t { bit version; bit ihl; bit diffserv; bit totalLen; bit identification; bit flags; bit fragOffset; bit ttl; bit protocol; bit hdrChecksum; bit srcAddr; bit dstAddr;
• Kiến trúc của các header struct headers {
• Tìm đích đến trong bảng định tuyến IPv4
@name(".forward") table forward { actions = {
_drop; set_nhop; nop; read_flowlet_select;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
} key = { hdr.ipv4.dstAddr: lpm;
• Cập nhật địa chỉ MAC nguồn và đích
@name(".set_ecmp_nhop") action set_ecmp_nhop(bit nhop_mac, bit nhop_ipv4, bit port) { standard_metadata.egress_spec = port; hdr.ipv4.dstAddr = nhop_ipv4; hdr.ethernet.dstAddr = nhop_mac; hdr.ipv4.ttl = hdr.ipv4.ttl + 8w255;
@name(".set_nhop") action set_nhop(bit dmac, bit port) { standard_metadata.egress_spec = port; hdr.ethernet.dstAddr = dmac; hdr.ipv4.ttl = hdr.ipv4.ttl + 8w255;
@name(".forward") table forward { actions = {
_drop; set_nhop; nop; read_flowlet_select;
} key = { hdr.ipv4.dstAddr: lpm;
• Đóng tiêu đề vào gói tin
36 control DeparserImpl(packet_out packet, in headers hdr) { apply { packet.emit(hdr.ethernet); packet.emit(hdr.arp); packet.emit(hdr.ipv4); packet.emit(hdr.udp); packet.emit(hdr.tcp);
Chạy p4run để triển khai hệ thống mạng
Hình 3.10 Weight round robin: Chạy triển khai hệ thống
Hình 3.11 Weight round robin: Hoàn thành triển khai hệ thống
Hình 3.12 Weight round robin: Gửi gói tin HTTP từ host 1
Hình 3.13 Weight round robin: Các host 2 3 4 5 lần lượt được kiểm tra trạng thái