Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.63 MB, 42 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
Hình 2.8 Chạy p4run để triển khai mạng cơ bản ... 18
Hình 2.9 Thơng báo khi hoàn thành triển khai mạng cơ bản ... 18
Hình 2.10 Ping thử h1 qua h2 ... 19
Hình 2.11 Bắt gói tin ở hướng đầu vào s1 ... 19
Hình 2.12 Bắt gói tin ở hướng đầu ra s1 ... 20
Hình 2.13 Bắt gói tin ở hướng đầu vào s2 ... 20
Hình 2.14 Bắt gói tin ở hướng đầu ra khỏi s2 ... 21
Hình 3.1 Cấu trúc mạng để triển khai load balance ... 22
Hình 3.2 Round robin: Chạy p4run để triển khai round robin ... 28
Hình 3.3 Round robin: Thơng báo sau khi hồn thành triển khai ... 28
Hình 3.4 Round robin: Mở các host bằng terminal ... 29
Hình 3.5 Round robin: Gửi gói tin từ host 1 ... 29
Hình 3.6 Round robin: Gói tin nhận được ở host 2 ... 30
Hình 3.7 Round robin: Gói tin được nhận ở host 3 ... 30
Hình 3.8 Round robin: Gói tin được nhận ở host 4 ... 31
Hình 3.9 Round robin: Gói tin được nhận ở host 5 ... 31
Hình 3.10 Weight round robin: Chạy triển khai hệ thống ... 36
Hình 3.11 Weight round robin: Hoàn thành triển khai hệ thống ... 36
Hình 3.12 Weight round robin: Gửi gói tin HTTP từ host 1 ... 37
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 ... 37
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"><b>CHƯƠNG 1. ĐẶT VẤN ĐỀ </b>
Cân bằng tải là một phương pháp phân phối khối lượng tải trên nhiều máy tính hoặc một cụm máy tính để có thể sử dụng tối ưu các nguồn lực, tối đa hóa thơng lượng, giảm thời gian đáp ứng và tránh tình trạng quá tải trên máy chủ.
Trong thời đại bùng nổ của công nghệ thông tin hiện nay, mạng máy tính đóng vai trị ngày càng quan trọng hơn trong hoạt động của các doanh nghiệp, tổ chức cũng như các cơ quan nhà nước. Thậm chí ở một số đơn vị, chẳng hạn như các công ty hàng khơng hoặc các ngân hàng lớn, mạng máy tính có thể ví như hệ thần kinh điều khiển hoạt động của toàn doanh nghiệp. Sự ngừng hoạt động của mạng máy tính hay sự hoạt động kém hiệu quả của mạng máy tính trong những cơ quan này có thể làm tê liệt các hoạt động chính của đơn vị, và thiệt hại khó có thể lường trước được.
Chúng ta đều biết các máy chủ là trái tim của của mạng máy tính, nếu máy chủ mạng hỏng, hoạt động của hệ thống sẽ bị ngưng trệ. Điều đáng tiếc là dù các hãng sản xuất đã cố gắng làm mọi cách để nâng cao chất lượng của thiết bị, nhưng những hỏng hóc đối với các thiết bị mạng nói chung và các máy chủ nói riêng là điều không thể tránh khỏi. Do vậy, vấn đề đặt ra là cần có một giải pháp để đảm bảo cho hệ thống vẫn hoạt động tốt ngay cả khi có sự cố xảy ra đối với máy chủ mạng. Việc lựa chọn một server đơn lẻ có cấu hình cực mạnh để đáp ứng nhu cầu này sẽ kéo theo chi phí đầu tư rất lớn và khơng giải quyết được các vấn đề đặt ra của các tổ chức. Giải pháp hiệu quả được đưa ra là sử dụng một nhóm server cùng thực hiện một chức nǎng dưới sự điều khiển của một công cụ phân phối tải - Giải pháp cân bằng tải. Việc chia tải có thể thực hiện bằng nhiều phương cách, hình thức khác nhau, với các công nghệ khác nhau hoặc kết hợp chúng lại.
Tuy nhiên vẫn có những nhược điểm khi sử dụng các phương pháp hiện tại, ví dụ như chia tải bằng phần mềm cài trên các máy chủ sẽ bị hạn chế về mặt mở rộng, phức tạp khi triển khai…chia tải nhờ proxy thì có nhược điểm lớn nhất là có tính ổn định kém, hiệu năng thấp, dễ mắc lỗi… Trong khi đó, tất cả các yêu cầu về hiệu năng cao, ổn định, mở rộng tốt, tăng tốc tốt và bảo mật là rất quan trọng đối với các hoạt động của ngân hàng, chứng khoán và các nhà cung cấp dịch vụ. GP sẵn có của các hãng chỉ đáp ứng được một phần trong các yêu cầu trên như Module CSS của Cisco, ISA của Microsoft, hay Netscaler của Citrix).
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5"><b>CHƯƠNG 2. LÝ THUYẾT LIÊN QUAN 2.1 Giới thiệu về mạng SDN </b>
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.
<b>2.2 Kiến trúc của mạng SDN </b>
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).
<i>Hình 2.1 Kiến trúc 3 lớp mơ hình mạng SDN </i>
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6"><b>Lớp ứng dụng </b>
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 sốt hồn tồn các dịch vụ và các ứng dụng cho người sử dụng.
<b>Lớp điều khiển </b>
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 số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 tồn bộ các bộ chuyển mạch (Switch) ở lớp dữ liệu (Data Plane).
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><i>Hình 2.2 Bộ điều khiển SDN </i>
<b>Lớp cơ sở hạ tầng </b>
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
<b>2.3 Trung tâm dữ liệu mạng SDN </b>
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 tố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.
<b>2.4 Ngơn ngữ P4 </b>
<b>2.4.1. Giới thiệu ngôn ngữ P4 </b>
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
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">đ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".
<i>Hình 2.3 Switch truyền thống với switch được lập trình bằng P4 </i>
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]:
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">• 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 tố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ả q 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.
<i>Hình 2.4 Lập trình mục tiêu với P4 </i>
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">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 tố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.
<b>2.4.2. Mơ hình kiến trúc </b>
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.
Kiến trúc P4 có thể được coi như một hợp đồng giữa chương trình và mục tiêu [2, 3]. Do đó mỗi nhà sản xuất phải cung cấp cả trình biên dịch P4 cũng như định nghĩa kiến trúc đi kèm cho mục tiêu của họ. (Chúng tơi hy vọng rằng các trình biên dịch P4 có thể chia sẻ một giao diện người dùng chung để xử lý tất cả kiến trúc). Định nghĩa kiến trúc khơng phải để lộ tồn bộ bề mặt có thể lập trình của bình diện dữ liệu — một nhà sản xuất thậm chí có thể chọn cung cấp nhiều định nghĩa cho cùng một thiết bị phần cứng, mỗi định nghĩa có các khả năng khác nhau (ví dụ: có hoặc khơng hỗ trợ đa hướng).
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><i>Hình 2.5 P4 program interfaces </i>
Hình trên minh họa các giao diện mặt phẳng dữ liệu giữa các khối lập trình P4. Nó cho thấy một mục tiêu có hai khối có thể lập trình (# 1 và # 2). Mỗi khối được lập trình thông qua một phân đoạn riêng biệt của mã P4. Mục tiêu giao tiếp với chương trình P4 thơng qua một tập hợp các thanh ghi điều khiển hoặc các tín hiệu. Đầu vào các điều khiển cung cấp thơng tin cho các chương trình P4 (ví dụ: cổng đầu vào mà một gói được nhận từ đó), trong khi các điều khiển đầu ra có thể được ghi bởi các chương trình P4 để tác động đến hành vi mục tiêu (ví dụ: đầu ra cổng nơi một gói tin phải được chuyển hướng). Các thanh ghi / tín hiệu điều khiển được biểu diễn trong P4 dưới dạng nội tại metadata. Các chương trình P4 cũng có thể lưu trữ và thao tác dữ liệu liên quan đến mỗi gói do người dùng xác định metadata.
Hành vi của chương trình P4 có thể được mơ tả đầy đủ dưới dạng các phép biến đổi ánh xạ vectơ của bit thành vectơ của bit. Để thực sự xử lý một gói tin, mơ hình kiến trúc diễn giải các bit chương trình P4 ghi vào siêu dữ liệu nội tại. Ví dụ, để khiến một gói tin được chuyển tiếp trên một cổng đầu ra cụ thể, chương trình P4 có thể cần ghi chỉ số của cổng đầu ra vào một điều khiển chuyên dụng Đăng ký. Tương tự như vậy, để khiến một gói tin bị loại bỏ, một chương trình P4 có thể cần đặt một bit "thả" vào một thanh ghi điều khiển chuyên dụng khác. Lưu ý rằng chi tiết về cách diễn giải siêu dữ liệu nội tại là kiến trúc cụ thể.
<i>Hình 2.6 Chương trình P4 gọi các dịch vụ của một đối tượng chức năng cố định </i>
Các chương trình P4 có thể gọi các dịch vụ được thực hiện bởi các đối tượng và chức năng bên ngoài được cung cấp bởi ngành kiến trúc. Hình trên mơ tả một chương trình P4 gọi các dịch vụ của tính tốn tổng kiểm tra tích hợp đơn vị trên một mục tiêu. Việc triển khai đơn vị tổng kiểm tra không được chỉ định trong P4,
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">nhưng giao diện của nó thì có. Nói chung, giao diện cho một đối tượng bên ngồi mơ tả từng hoạt động mà nó cung cấp, cũng như tham số và kiểu trả về của chúng. Nói chung, các chương trình P4 khơng được mong đợi là có thể di động qua các kiến trúc khác nhau. Ví dụ: thực thi chương trình P4 phát các gói bằng cách ghi vào thanh ghi điều khiển tùy chỉnh sẽ khơng hoạt động chính xác trên mục tiêu khơng có thanh ghi điều khiển. Tuy nhiên, các chương trình P4 được viết cho một kiến trúc nhất định phải có tính di động trên tất cả các mục tiêu triển khai trung thực mơ hình, miễn là có đủ tài nguyên.
2.4.2.1. Giao diện mặt phẳng dữ liệu
Để mơ tả một khối chức năng có thể được lập trình trong P4, kiến trúc bao gồm một khai báo kiểu xác định các giao diện giữa khối và các thành phần khác trong kiến trúc. Đối với ví dụ, kiến trúc có thể chứa một khai báo như sau:
control MatchActionPipe<H>(in bit<4> inputPort, inout H parsedHeaders,
out bit<4> outputPort);
Khai báo kiểu này mơ tả một khối có tên MatchActionPipe có thể được lập trình bằng cách sử dụng chuỗi lệnh gọi đơn vị hành động đối sánh phụ thuộc dữ liệu và các cấu trúc mệnh lệnh khác (được biểu thị bằng từ khóa điều khiển). Giao diện giữa khối MatchActionPipe và các thành phần khác của kiến trúc có thể được đọc từ khai báo này:
• Tham số đầu tiên là một giá trị 4 bit có tên inputPort. Hướng trong chỉ ra rằng tham số này là đầu vào khơng thể sửa đổi.
• Tham số thứ hai là một đối tượng kiểu H có tên là parsedHeaders, trong đó H là một biến kiểu đại diện cho các tiêu đề sẽ được lập trình viên P4 định nghĩa sau này. Hướng inout chỉ ra rằng tham số này vừa là đầu vào vừa là đầu ra.
• Tham số thứ ba là một giá trị 4 bit có tên là outputPort. Hướng ra ngoài chỉ ra rằng tham số này là đầu ra có giá trị khơng được xác định ban đầu nhưng có thể được sửa đổi.
<b>2.4.3. Các thành phần của ngôn ngữ P4 </b>
P4<small>16</small> là một ngôn ngữ được nhập tĩnh. Các chương trình khơng vượt qua trình kiểm tra kiểu được coi là không hợp lệ và bị trình biên dịch từ chối. P4 cung cấp một số kiểu cơ sở cũng như toán tử kiểu xây dựng các kiểu dẫn xuất. Một số giá trị có thể được chuyển đổi thành một kiểu khác bằng cách sử dụng phôi. Tuy nhiên, để làm cho ý định của người dùng rõ ràng, chỉ được phép sử dụng ẩn trong một số trường hợp và phạm vi các phép có sẵn bị hạn chế có chủ ý.
2.4.3.1. Các kiểu cơ sở
P4 hỗ trợ các loại cơ sở tích hợp sau:
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">• Kiểu void: khơng có giá trị và chỉ có thể được sử dụng trong một số trường hợp hạn chế.
• Kiểu error: được sử dụng để truyền đạt lỗi theo cách không phụ thuộc vào đích, do trình biên dịch quản lý.
• Kiểu match_kind: được sử dụng để mơ tả việc triển khai tra cứu bảng.
• Kiểu bool: đại diện cho các giá trị boolean.
• Chuỗi bit có chiều rộng cố định, được biểu thị bằng bit<>.
• Các số ngun có dấu có chiều rộng cố định được biểu diễn bằng int<>.
• Chuỗi bit có chiều rộng được tính tốn động với chiều rộng tối đa cố định varbit<>.
baseType : BOOL | ERROR | BIT
| BIT '<' INTEGER '>' | INT '<' INTEGER '>' | VARBIT '<' INTEGER '>' ;
2.4.3.2. Các kiểu nguồn gốc • enum
• header
• header stacks • struct
• header_union • tuple
• type specialization • extern
• parser • control • package
Các kiểu header, header_union, enum, struct, extern, parser, control và package chỉ có thể được sử dụng trong khai báo kiểu, nơi chúng giới thiệu tên mới cho kiểu. Sau đó, loại có thể được đề cập đến bằng cách sử dụng số nhận dạng này.
Các kiểu khác không thể được khai báo, nhưng được trình biên dịch tổng hợp bên trong để đại diện cho kiểu cấu trúc ngôn ngữ nhất định. Ví dụ, người lập trình khơng thể khai báo một biến có kiểu “set”, nhưng có thể viết
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">một biểu thức có giá trị đánh giá kiểu set. Những kiểu này được sử dụng trong quá trình kiểm tra kiểu.
typeDeclaration
: derivedTypeDeclaration | typedefDeclaration | parserTypeDeclaration ';' | controlTypeDeclaration ';' | packageTypeDeclaration ';' ;
derivedTypeDeclaration : headerTypeDeclaration | headerUnionDeclaration | structTypeDeclaration | headerUnionDeclaration | enumDeclaration
; typeRef : baseType | typeName | specializedType | headerStackType | tupleType
;
prefixedType : TYPE
| dotPrefix TYPE ;
typeName
: prefixedType ;
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">| TYPEDEF derivedTypeDeclaration name ';' | annotations TYPEDEF typeRef name ';'
| annotations TYPEDEF derivedTypeDeclaration name ';' ;
typedef bit<32> u32;
typedef struct Point { int<32> x; int<32> y; } Pt; typedef Empty_h[32] HeaderStack;
Hai kiểu được coi là từ đồng nghĩa và tất cả các thao tác có thể được thực hiện bằng kiểu gốc cũng có thể được thực hiện bằng kiểu mới được tạo.
2.4.1.2. Headers
Định nghĩa tiêu đề mô tả các định dạng packet Định nghĩa tiêu đề mơ tả các định dạng gói và cung cấp tên cho các field trong packet. Ngôn ngữ cho phép tùy chỉnh tên header với độ dài tùy ý, mặc dù nhiều định nghĩa header biết bởi protocol names và fields widths. Ví dụ: Định nghĩa của 802.3 Ethernet header có thể gọi là "Ethernet" và có field 48bit tên là “dest” theo sau là 1 trường 48 bit "src" sau nữa là 16 bit "type". Các tên trong định nghĩa header này được sử dụng sau này trong chương trình P4 để tham chiếu các field này.
header ethernet_t { bit dstAddr; bit srcAddr; bit etherType; }
2.4.1.3. Parsers
P4 parser là một máy trạng thái (pasestate machine) hữu hạn chạy luồng byte đến và trích xuất các header dựa trên biểu đồ phân tích cú pháp được lập trình. Ví dụ: phân tích cú pháp trích xuất nguồn Ethernet và đích và loại field. Sau đó thực hiện trích xuất dựa trên giá trị trong loại field (các giá trị phổ biến có thể là ipv4, ipv6 hoặc MPLS).
parser ParserImpl (packet_in packet, out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
const bit ETHERTYPE_IPV4 = 16w0x0800;
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">state start {
transition parse_ethernet; }
state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) { ETHERTYPE_IPV4: parse ipv4; default: accept;
} }
table mac_da { key = {
meta.fwd_metadata.l2ptr: exact; }
actions = {
set_bd_dmac_intf; my_drop; }
default_action = my_drop; }
2.4.1.5. Actions
Các action trong P4 mô tả các thao tác cho packet và metadata. Trong ngữ cảnh P4, metadata là thông tin về một packet không được lấy trực tiếp từ chương trình phân tích cú pháp, chẳng hạn như đầu vào interface
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">mà frame được mang đến. Mơ tả bằng tiếng Anh của một hành động ví dụ có thể là “decrement the IPv4 TTL field by one” (giảm field IPv4 TTL 1 bước) hay là “copy the MAC address from the output port table into the outgoing packet header.” (sao chép địa chỉ MAC từ bảng cổng output vào packet header). P4 xác định cả metadata tiêu chuẩn phải được cung cấp bởi tất cả các target cũng như metadata dành riêng cho target do tác giả của các mục tiêu cụ thể cung cấp.
action rewrite_mac (bit smac) {
hdr.ethernet.srcAddr = smac; }
table send_frame { key = {
meta.fwd_metadata.out_bd: exact; }
actions = {
rewrite_mac; my_drop; } default_action = my_drop; }
apply {
send_frame.apply(); }
2.4.1.6. Control Flow
Luồng điều khiển trong P4 xác định trình tự tương đối của các bảng và cho phép thực thi các bảng dựa trên cấu trúc if / then / else.
<b>2.4.2. Chương trình cơ bản </b>
Chương trình mơ triển khai trên cấu trúc liên kết mạng cơ bản như sau
<i>Hình 2.7 Cấu trúc liên kết mạng cơ bản </i>
Simple switch sẽ thực hiện các chức năng sau:
• Phân tích các tiêu đề Ethernet và IPv4 từ gói tin.
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">• Tìm điểm đến trong bảng định tuyến IPv4. • Cập nhật địa chỉ MAC nguồn và đích.
• Giảm thời gian tồn tại (TTL) trong tiêu đề IP. • Thiết lập cổng ra thích hợp cho gói tin.
• Đóng gói tiều đề trở lại gói tin
<b>Mơ tả liên kết trong mạng: </b>
"links": [["h1", "s1", {"delay":"20ms", "bw": 20, "queue_length": 100, "weight":5}], ["h2", "s2"], ["s1", "s2"], ["h3", "s3"], ["s1", "s3"]]
<b>Mô tả các host trong cấu trúc liên kết mạng: </b>
"hosts": { "h1": { }, "h2": { }, "h3": { }
<b> } </b>
<b>Mô tả các switch: </b>
"switches": { "s1": { 28
"cli_input": "s1-commands.txt", "program": "forwarding.p4" },
"s2": {
"cli_input": "s2-commands.txt", "program": "forwarding.p4" },
"s3": {
"cli_input": "s3-commands.txt", "program": "forwarding.p4" }
}
Thêm các file tệp quy tắc cho các switch forward từ ipv4 về địa chỉ vật lý.
<b>File tệp quy tắc cho switch s1: </b>
table_set_default ipv4_lpm drop
table_add ipv4_lpm ipv4_forward 10.0.1.1/32 => 00:00:0a:00:01:01 1 table_add ipv4_lpm ipv4_forward 10.0.2.2/32 => 00:00:00:02:01:00 2 table_add ipv4_lpm ipv4_forward 10.0.3.0/24 => 00:00:00:03:01:00 3
<b>File tệp quy tắc cho switch s2: </b>
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">table_set_default ipv4_lpm drop
table_add ipv4_lpm ipv4_forward 10.0.1.1/32 => 00:00:00:01:02:00 2 table_add ipv4_lpm ipv4_forward 10.0.2.2/32 => 00:00:0a:00:02:02 1 table_add ipv4_lpm ipv4_forward 10.0.3.0/24 => 00:00:00:01:02:00 2
<b>File tệp quy tắc cho switch s3: </b>
table_set_default ipv4_lpm drop
table_add ipv4_lpm ipv4_forward 10.0.1.0/24 => 00:00:00:01:03:00 3 table_add ipv4_lpm ipv4_forward 10.0.2.0/24 => 00:00:00:01:03:00 3 table_add ipv4_lpm ipv4_forward 10.0.3.3/32 => 00:00:0a:00:03:03 1 table_add ipv4_lpm ipv4_forward 10.0.3.4/32 => 00:00:0a:00:03:04 2
bit<13> fragOffset; bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum; ip4Addr_t srcAddr; ip4Addr_t dstAddr; }
• Kiến trúc của các header struct headers {
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">ethernet_t ethernet; ipv4_t ipv4;
actions = { ipv4_forward; drop;
NoAction; }
size = 1024;
default_action = NoAction(); }
• Cập nhật địa chỉ MAC nguồn và đích
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) { hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr; }
• Giảm thời gian tồn tại
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) { hdr.ipv4.ttl = hdr.ipv4.ttl -1;
• Đóng tiêu đề vào gói tin
control MyDeparser(packet_out packet, in headers hdr) { apply {
packet.emit(hdr.ethernet); packet.emit(hdr.ipv4);
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">} }
<b>Triển khai chương trình P4 </b>
Chạy p4run để triển khai hệ thống mạng.
<i>Hình 2.8 Chạy p4run để triển khai mạng cơ bản </i>
<i>Hình 2.9 Thơng báo khi hoàn thành triển khai mạng cơ bản </i>
</div>