Tất cả ý tưởng giải thuật “Best QoS” đều được hiện thực trong class này. Do đó, có thể nói rằng đây chính là “phần lõi” của cả chương trình.
Như đã trình bày tại mục “ý tưởng lập trình” thì class LoadBalancer sẽ được thực thi trong trong một thread riêng. Chính vì lý do này mà class LoadBalancer đã hiện thực interface Runnable bằng cách “implement Runnable” và “override” phương thức run() của interface này.
Trong class này bao gồm các phương thức sau: findBestGateway() getCurrentBandwidth() checkInterfaceHasAvailabeBW() parseDest() run()
Và chức năng của từng phương thức như sau:
a) Phương thức findBestGateway(): Dùng để lấy danh sách các interface được
xếp theo thứ tự giảm dần “QoS đến một IP đích chỉ định”.
Tham số: địa chỉ IP dùng để đánh giá QoS giữa các kết nối (String)
Giá trị trả về: danh sách các interface được xếp theo thứ tự giảm dần QoS (Vector)
Hình 3.14: Phương thức findBestGateway() của class Loadbalancer
b) Phương thức getCurrentBandwidth(): Dùng để lấy băng thông hiện tại của
một interface.
Tham số: Tên interface cần lấy giá trị băng thông in/out (String)
Hình 3.15: Phương thức getCurrentBandwidth() của class Loadbalancer
c) Phương thức checkInterfaceHasAvailabeBW(): Dùng để kiểm tra băng thông
sử dụng của một interface có vượt quá băng thông tối đa (Hằng MAX_BW) hay không.
Tham số: Tên interface cần đánh giá về băng thông hiện tại (String)
Giá trị trả về: Boolean
o “true”: nếu băng thông hiện tại của interface chỉ định nhỏ hơn băng thông tối đa
Hình 3.16: Phương thức checkIntefaceHasAvailableBW() của class Loadbalancer
d) Phương thức parseDest(): Dùng để lấy giá trị IP đích trong kết quả của lệnh
dump
Tham số: một dòng trong kết quả xuất của lệnh dump (String)
Giá trị trả về: địa chỉ IP đích xuất hiện trong kết quả dump (String)
Hình 3.17: Phương thức parseDest() của class Loadbalancer
e) Cuối cùng là phương thức quan trọng nhất của class Loadbalancer. Đó là phương
thức run(). Trong phương thức này sẽ thực hiện các công việc sau:
Đầu tiên, chương trình sẽ dump gói tin tại interface nối với mạng LAN. Sau đó lấy thông tin IP đích mà gói tin đang cần gởi đến (phương thức parseDest()).
Tiếp theo, chương trình kiểm tra file database xem thử có từng ghi nhận trạng thái QoS của IP đích này hay chưa (phương thức lookupDatabase())? Nếu chưa thì tính toán và sắp xếp cấp độ QoS (tức tỉ lệ rớt gói, độ trễ, biến thiên độ trễ) của từng đường (phương thức findBestGateway()).
Nếu QoS các đường đều bằng nhau thì chương trình sẽ route tĩnh gói tin đi hướng có băng thông trống (theo tỉ lệ) nhiều nhất (phương thức getBestRatedAvailableBW()). Ngược lại, thread này sẽ lần lượt quét từng interface theo đúng thứ tự xét từ interface có QoS cao nhất đến QoS thấp nhất. Nếu tìm được interface nào còn trống băng thông thì vòng lặp sẽ dừng lại mà không cần kiểm tra các interface còn lại (phương thức checkInterfaceHasAvailableBW()). Trong trường hợp này, chương trình sẽ route tĩnh địa chỉ IP đích về hướng kết nối có “QoS cao và băng thông trống” vừa tìm được. Còn trong trường hợp tất cả các interface đều không còn trống băng thông thì chương trình sẽ để hệ điều hành chọn hướng đi theo luật định tuyến hiện tại.
Vì chương trình chỉ dump gói tin, phân tích rồi đưa ra các lệnh route tĩnh hợp lý, nên trong lúc chương trình tính toán thì gói tin vẫn đi bình thường theo luật định tuyến hiện tại.