2.3. Các kiểu QoS trong VyOS [8,9]
Chất lượng dịch vụ (QoS) là một tính năng cho phép người quản trị xác định các luồng lưu lượng khác nhau và sau đó xử lý chúng theo chính sách riêng thay vì chỉ sử dụng cơ chế mặc định. Trên hệ thống VyOS sử dụng câu lệnh “tc” – traffic control làm phụ trợ cho QoS. VyOS cung cấp cho người dùng cấu hình các node cho các quy tắc sau đây: cơ chế QoS mặc định dựa trên mức độ ưu tiên hàng đợi. Ngoài cơ chế xếp hàng mặc định, hệ thống VyOS cung cấp nhiều cơ chế QoS khác nhau để xác định, xử lý các luồng lưu lượng khác nhau đi qua một interface và được phân loại thành các cơ chế áp dụng cho lưu lượng truy cập in và cho lưu lượng truy cập out.
Theo mặc định, tất cả lưu lượng truy cập được gửi bởi hệ thống VyOS được ưu tiên dựa trên giá trị trong trường Type of Service (ToS) của nó. Trong mỗi hàng đợi, tất cả các gói được gửi trên cơ sở First In First Out (FIFO). Lưu lượng dữ liệu được chia theo cách này vì việc cung cấp các mức dịch vụ bằng nhau cho tất cả lưu lượng. Tuy nhiên trên thực tế một số loại lưu lượng, theo bản chất của chúng nên được đối xử khác với những loại khác. Ví dụ: lưu lượng thoại rất nhạy cảm với độ trễ và nếu không được xử lý tương ứng, có thể không thể hiểu được nội dung.
Hệ thống VyOS hỗ trợ các cơ chế QoS sau đây để kiểm soát lưu lượng truy cập in và out:
Cơ chế bỏ đuôi (Drop Tail) là một thuật toán cung cấp hàng đợi thuần túy có độ dài xác định theo thứ tự FIFO (First In First Out); nói cách khác, các gói dữ liệu được truyền theo đúng thứ tự mà chúng đến. Nếu hàng đợi đầy, thì đuôi của hàng đợi (nghĩa là tập hợp các gói đến saukhi hàng đợi được lấp đầy) sẽ bị hủy. Với hàng đợi drop-tail, có một hàng đợi duy nhất và tất cả lưu lượng được xử lý như nhau; lưu lượng truy cập không được ưu tiên như trong trường hợp mặc định và chỉ dùng trong traffic out.
Cơ chế hàng đợi công bằng (Fair Queue) là một cơ chế xếp hàng gói phân tách các luồng lưu lượng dựa trên địa chỉ IP nguồn/đích của chúng và/hoặc giao thức IP. Băng thông được phân bổ công bằng giữa các luồng dựa trên thuật toán xếp hàng công bằng ngẫu nhiên (Stochastic fairness Queuing) sao cho không có luồng nào được phép sử dụng phần lớn băng thông và chỉ dùng trong traffic out.
Cơ chế hàng đợi vòng tròn (Round Robin) là một thuật toán lập lịch đơn giản. Trong hàng đợi vòng tròn, lưu lượng cho các lớp (class) được xác định và băng thông được chia đều cho các lớp đó và chỉ dùng trong traffic out.
Cơ chế điều hoà lưu lượng (Traffic Shaper) cung cấp hàng đợi dựa trên thuật toán Hierarchical Token Bucket để phân bổ lượng băng thông khác nhau cho các lớp lưu lượng khác nhau. Khác biệt giữa Traffic Shaper và Round Robin là Traffic shaper giới hạn phân bổ băng thông theo lớp lưu lượng trong khi Round robin chia tổng băng thông có sẵn giữa các lớp và chỉ dùng trong traffic out.
Cơ chế giới hạn tốc độ (Rate Limiting) là cung cấp hàng đợi dựa trên thuật toán Token Bucket Filter (TBF) để giới hạn lưu lượng gói ở tốc độ đã đặt. Thuật toán này chỉ chuyển các gói đến với tốc độ không vượt quá tốc độ được đặt và chỉ dùng trong traffic out.
Cơ chế giả lập mạng mô phỏng (Network Emulator) cung cấp chính sách giả lập mạng mô phỏng lưu lượng mạng WAN, rất hữu ích cho mục đích thử nghiệmvà chỉ dùng trong traffic out.
Cơ chế phát hiện ngẫu nhiên (Random Detect) là một cơ chế tránh tắc nghẽn bao gồm Phát hiện sớm ngẫu nhiên (RED) và Phát hiện sớm ngẫu nhiên có trọng số (WRED). RED làm giảm khả năng tắc nghẽn mạng sẽ xảy ra bằng cách loại bỏ ngẫu nhiên các gói khi đầu ra interface bắt đầu có dấu hiệu tắc nghẽn, do đó sử dụng băng thông mạng tốt hơn. WRED phân biệt giữa các lớp lưu lượng trong một hàng đợi và gán mức độ ưu tiên khác nhau cho các luồng lưu lượng tương ứng; các gói ưu tiên thấp được loại bỏ khỏi hàng đợi sớm hơn các gói ưu tiên cao. Điều này đạt được bằng cách sử dụng ba bit đầu tiên của trường ToS (Type of services) để phân loại luồng dữ liệu và theo các tham số ưu tiên đã xác định, quyết định được đưa ra và chỉ dùng trong traffic out.
Cơ chế hàng đợi ưu tiên (Priority queue) : Có tối đa bảy hàng đợi với các mức độ trọng số ưu tiên khác nhau từ 1 đến 7 (trong đó 1 là mức ưu tiên thấp nhất) , các gói được đặt vào hàng đợi dựa trên trọng số được gán. Các gói được truyền từ hàng đợi theo thứ tự ưu tiên. Hàng đợi với thứ tự cao hơn được lấp đầy liên tục các gói, các gói từ hàng đợi ưu tiên thấp hơn sẽ chỉ được truyền sau khi lưu lượng truy cập từ hàng đợi ưu tiên cao hơn giảm và chỉ dùng trong traffic out.
Cơ chế giới hạn (Limiter) được sử dụng để kiểm soát lưu lượng đến. Cơ chế gán cho mỗi luồng lưu lượng một giới hạn về băng thông (bandwidth). Có thể định nghĩa lưu lượng cho nhiều class và áp dụng giới hạn lưu lượng cho từngclass. Tất cả lưu lượng đến trong một luồng vượt quá giới hạn băng thông sẽ bị loại bỏ và chỉ dùng trong traffic in.
2.4. Kiến trúc QoS trong VyOS
Quy trình chung cho các cơ chế QoS được cấu hình theo 2 bước như sau:
Bước 1 : Tạo chính sách xác định luồng lưu lượng theo loại QoS.
Bước 2 : Áp dụng chính sách cho đầu vào hay đầu ra của một interface cụ thể.
Ở ví dụ trên hình 11, ta có thể thấy lệnh đầu tiên xác định một chính sách QoS là Fair queue và sử dụng tất cả các giá trị mặc định. Câu lệnh thứ hai áp dụng chính sách đó cho đầu ra của Ethernet eth0.
Chuỗi câu lệnh này được thực hiện theo các templates đã được xây dựng sẵn trong VyOS nằm trong thư mục /opt/vyatta/share/vyatta-cfg/templates (hình 12) và phân cấp theo hình cây thể hiện ở hình 13 [10].
Hình 12: Phân cấp thư mục template hệ thống
Hình 13: Phân cấp thư mục template hệ thống theo dạng hình cây qua 2 Câu lệnh cấu hình QoS là fair queue
Bắt đầu vào các thư mục ở /opt/vyatta/share/vyatta-cfg/templates, tùy theo cấu hình câu lệnh người dùng gõ thì VyOS sẽ thực thi câu lệnh theo phân cấp thư mục của câu lệnh đó. Ở đây theo hình 12 thì câu lệnh chỉ thực thi theo thư mục traffic-policy. Trong các thư mục này sẽ có chứa các thư mục tương đương các thông số hiển thị ra khi ta cấu hình trên hệ điều hành (hình 14).
Hình 14: Hiển thị thông số lúc cấu hình tương đương với các thư mục phân cấp trong template cấu hình
Trong thư mục các cơ chế QoS nào cũng hiển thị file “node.def” và thư mục “node.tag” (chứa các thông số bên trong đã được định nghĩa sẵn). Ví dụ như cơ chế Drop Tail, khi ta chọn cấu hình traffic-policy là droptail sẽ có 2 thông số (hình 15) là “description” và “queue-limit” tương ứng với 2 thư mục trong “node.tag” của droptail trong templates.
Trong các thư mục “description” và “queue-limit” tiếp tục có các file “node.def” theo đúng phân cấp thư mục template hệ thống ở trên. File “node.def” có thể hiển thị các đoạn text hoặc là gọi đến các module trong hệ thống. Ví dụ như đối với thông số “queue-limit” thì chỉ là hiển thị dòng text thông báo dải queue size mà có thể chọn để cấu hình (hình 16).
Hình 16: Hiển thị thông số lúc cấu hình queue-limit trong droptail
Ở đây tôi thử nghiệm thêm thử thông số “test” trong thư mục “node.tag” của droptail và hiển thị dòng thông báo “this is test”. Khi cấu hình trong VyOS sẽ hiển thị thêm phần thông số “test” so với trước khi thử nghiệm (hình 17). Đây cũng là nơi có thể cấu hình hiển thị thông số của các tính năng mới cài đặt thêm.
Trở lại với phân cấp thư mục template hệ thống theo dạng hình cây qua 2 Câu lệnh cấu hình QoS là fair queue thì cụ thể ở file “traffic-policy/fair- queue/node.def” (hình 18) đưa ra một giá trị text và gọi một kịch bản Perl cụ thể là file “/opt/vyatta/sbin/vyatta-qos.pl”để thực hiện công việc là thêm, xóa hoặc thay đổi chính sách vớitên biến phản ánh nội dung của node hiện tại $VAR(@) và $VAR(.) là Fair queue.
Hình 18: Nội dung file traffic-policy/fair-queue/node.def
Còn lệnh thứ 2 khi gán vào cho Ethernet eth0 thì trong file “interfaces/ethernet/node.tag/traffic-policy/out/node.def” (hình 19), thư mục ngoài của nút $VAR(../../@) đề cập đến tên của thiết bị ethernet (eth0) còn traffic thì luôn luôn là out và đã được định nghĩa theo các kiểu Qos trong mục 2.3 ở trên.
Hình 19: Nội dung file interfaces/ethernet/node.tag/traffic-policy/out/node.def
Khi liên quan đến traffic-policy thì đều gọi đến file perl ở đường dẫn /opt/vyatta/sbin/vyatta-qos.pl. Trong file “vyatta-qos.pl” này có định nghĩa các kiểu Qos và đối với với từng kiểu qos thì sẽ gọi đến các module .pm tương ứng (hình 20). Các module QoS sẽ thực hiện hiển thị nội dung các thông số mà câu lệnh cấu hình chất lượng dịch vụ tương ứng với các kiểu QoS mà ta chọn. Ngoài ra tùy theo interfaces in hay out mà nó sẽ chạy với tham số tương ứng và gọi các hàm như delete-interface, update-interface để cập nhật lại trạng thái interface. Như đã trình bày ở mục 2.2, Với việc sử dụng QoS, cụ thể là phân loại các gói tin, gán các giá trị ưu tiên và đưa vào hàng đợi, thì việc cấu hình thêm các tính năng mới cho router để tăng chất lượng dịch vụ có thể viết ở đây nối tiếp theo các chức năng có sẵn, hoặc tạo các file con kế thừa từ file này hoặc thêm các
thông số tạo thêm ở phần template bên trên. Ngoài ra trong các module QoS .pm được gọi đến này cũng sẽ là nơi cấu hình khai báo thêm các thông số của các tính năng mới cài đặt thêm khi đã thêm ở trong thư mục template thì lệnh mới có thể thực hiện được vì thư mục template mới chỉ là nơi để hiển thị khi thực thi câu lệnh.
Hình 20: Nội dung file vyatta-qos.pl định nghĩa các loại Qos và gọi đến module QoS tương ứng
Hình 21 là cơ chế chính sách cụ thể của Vyatta::Qos::FairQueue thể hiện qua module FairQueue.pm. Tuy nhiên các module Qos .pm này chỉ thực hiện tạo ra một cơ chế chính sách QoS cụ thể (FairQueue cho ví dụ này) và sau đó là chính sách tạo danh sách các lệnh “tc – traffic control” thay đổi trạng thái của qdisc (queue disciplines – quy tắc hàng đợi) cho QoS tương ứng và trên interface được thiết lập áp dụng chính sách QoS [11]
Hình 21: Nội dung module FairQueue.pm
Ví dụ khi cấu hình traffic policy là droptail và fairqueue, interface eth1 sẽ thay đổi trạng thái qdisc tương ứng theo danh sách (hình 22). Do vậy, muốn can thiệp vào giải thuật sẵn có hoặc thêm các giải thuật mới sẽ được phân tích ở phần tiếp theo.
Hình 22: Trạng thái qdisc thay đối khi cấu hình QoS
2.5. Xác định mã nguồn giải thuật QoS trong kernel VyOS
Như đã trình bày ở mục 2.4, các module QoS .pm chỉ thực hiện thay đổi trạng thái qdisc của interface qua các câu lệnh “tc” theo các giải thuật đã được
định nghĩa sẵn. Do đó để có thể can thiệp vào các giải thuật quản lý hàng đợi để có thể chống tấn công trong các thiết bị mạng ta sẽ tiếp tục tìm hiểu trong kernel của VyOS. VyOS sử dụng kernel của linux và được chia sẻ ở trang
https://github.com/vyos/vyos-kernel. Hiện tại phiên bản mới nhất 1.2 của VyOS đang sử dụng kernel linux phiên bản 4.19.32 (hình 23) còn phiên bản 1.1.x cũ VyOS thì sử dụng kernel phiên bản 3.13.xx (phiên bản 1.1.x của VyOS không còn được hỗ trợ nữa).
Hình 23: Thông tin phiên bản kernel VyOS 1.2
Trong các cơ chế QoS thì cơ chế Random Early Detection (RED) trên thực tế có rất nhiều phiên bản cải tiến, do đó trong phạm vi luận văn tập trung vào xác định mã nguồn giải thuật của RED. Sau khi tìm hiểu, tôi đã xác định được nơi chứa mã nguồn cho giải thuật RED và giải thuật Adaptive-RED trong kernel hệ điều hành (hình 24, 25, 26) và giải thuật sẽ được thực hiện với id qdisc=“red” trong thư mục net/sched. Đây cũng là nơi chúng ta có thể chỉnh sửa giải thuật cải tiến hoặc viết thêm các giải thuật của các cơ chế quản lý dịch vụ khác như mục tiêu lâu dài của luận văn đề ra.
Hình 25: Mô tả giải thuậtRED trong mã nguồn kernel
Hình 26: Mô tả giải thuật AdaptiveRED (A-RED) trong mã nguồn kernel
Các module QoS .pm tạo ra một cơ chế chính sách QoS cụ thể và sau đó là chính sách tạo danh sách các lệnh “tc” thay đổi trạng thái của qdisc (queue disciplines) cho QoS tương ứng và trên interface được thiết lập áp dụng chính sách QoS. Vì VyOS sử dụng kernel của linux nên câu lệnh “tc” đối với riêng cơ chế RED , được định nghĩa như sau [12] :
tc qdisc ... red limit bytes [ min bytes ] [ max bytes ] avpkt
bytes [ burst packets ] [ ecn ] [ harddrop] [ bandwidth rate ]
[probability chance ] [ adaptive ]
Trong đó chi tiết các tham số được mô tả ở dưới:
Kích thước hàng đợi tối thiểu (Min) tính bằng byte, ở đây có thể có xác suất đánh dấu – marking (có thể có khả năng là bị drop). Mặc định là = max/3
Kích thước hàng đợi tối đa (Max) tính bằng byte, ở đây xác suất đánh dấu là tối đa và ít nhất phải gấp 2 lần min. Mặc định là = limit/4
Giới hạn (Limit) là giới hạn cứng đối với kích thước hàng đợi thực (không phải kích thước hàng đợi trung bình) và tính bằng byte. Khi vượt qua giới hạn cứng đó thì các gói tiếp theo sẽ được bỏ.
Xác suất tối đa (Probability) được chỉ định là số dấu phẩy động từ 0,0 đến 1,0. Giá trị đề xuất là 0,01 hoặc 0,02 (tương ứng 1 hoặc 2%). Mặc định là: 0,02
Kích thước hàng đợi trung bình (Avpkt – average packet size) được tính bằng byte. Được sử dụng để xác định hằng số thời gian cho các tính toán kích thước hàng đợi trung bình. Thường cấu hình = 1000.
Lưu lượng bùng nổ (Burst) được sử dụng để xác định kích thước hàng đợi trung bình bị ảnh hưởng bởi kích thước hàng đợi thực nhanh như thế nào. Các giá trị lớn hơn làm cho phép tính chậm chạp hơn, cho phép các luồng lưu lượng bùng nổ dài hơn trước khi bắt đầu đánh dấu. Các thí nghiệm thực tế chỉ ra burst nên được tính = (min + min + max) / (3 * avpkt)
Thông báo tắc nghẽn tường minh – ECN (Explicit Congestion Notification) : RED có thể lựa chọn 'đánh dấu' hoặc 'loại bỏ'. Khi vượt quá lượng băng thông có sẵn, nếu không cấu hình ECN thì chỉ có thể thực hiện là loại bỏ gói tin. Nếu tham số này được chỉ định, các gói sẽ được đánh dấu và không bị loại bỏ, trừ khi kích thước hàng đợi đạt byte giới hạn. Khuyến nghị nên cấu hình ECN.
Băng thông (Bandwidth): Nên được cấu hình băng thông trên interface. Mặc định: 10Mbit
Adaptive: Mục tiêu của A-RED là tạo ra giá trị động Probability trong khoảng từ 1% đến 50% để đạt được hàng đợi trung bình của mục tiêu: (max - min) / 2
2.6. Kết chương
Trong chương này luận văn đã tìm hiểu được cấu trúc phân cấp hệ thống, cách thức thực hiện gọi các hàm, module khi thực hiện cấu hình các cơ chế QoS trên VyOS, xác định được nơi chứa mã nguồn các giải thuật về QoS trong nhân hệ điều hành VyOS cũng như phân tích những nơi có thể can thiệp để cài đặt thêm những tính năng mới và mô tả cơ chế RED được gọi ra như thế nào và các tham số của RED được định nghĩa ra sao, từ đó ta có thể áp dụng cài đặt các giải pháp tăng chất lượng dịch vụ chống tắc nghẽn vì mã nguồn của thiết bị định tuyến có thể truy cập vào, thì việc đưa thêm các tính năng mới hỗ trợ cho việc