Các phương pháp trình bày ở trên đều có chung nhược điểm là nếu trong mạng có tồn tại các nút có khả năng đáp ứng thấp hơn hẳn các nút khác sẽ gây giảm thông lượng đạt được trên toàn mạng. Để giải quyết vấn đề này, phương pháp định tuyến thích nghi được đề xuất. Đây cũng là phương pháp gần nhất với giải pháp được nêu ra trong tài liệu này.
Trong phương pháp này, thay vì chọn nút gần với khóa cần tìm nhất, ta chọn ra k nút gần với khóa và theo dõi hiệu năng của các nút đó. Khi gửi đi một truy vấn nút nguồn kiểm tra gói tin trả lời chứa cờ báo hiệu tắc nghẽn h trong header để xác định khả năng sử dụng của mỗi đường định tuyến qua k nút trên.
Để đơn giản ta xét trường hợp k=2, nghĩa là một nút có hai đường định tuyến qua hai nút lân cận. Giả sử ta có mạng DHT như sau:
Hình 14: Mạng DHT với 8 nút.
Bảng dưới thể hiện các đường định tuyến mà P0 có thể sử dụng khi chuyển tiếp gói tin.
Ví dụ với dòng thứ 3, với đích là nút P3 lựa chọn đầu tiên của P0 là chuyển qua nút P2 sử dụng đường dẫn l0-2 và lựa chọn thứ hai là qua P1 sử dụng đường dẫn l0-1. Nếu như nút đích lưu khóa cần tìm thì sẽ không có lựa chọn thứ hai (N/A). Nếu hai nút có cùng khoảng cách đến khóa cần tìm ta chọn nút bên trái làm lựa chọn đầu tiên.
Định tuyến thích nghi: Mỗi nút ghi nhận giá trị của cờ h trong gói trả về trên cả
hai đường định tuyến. Với mỗi cặp đường định tuyến mỗi nút duy trì k (ở đây k=2) giá trị xác suất đã quan sát được (op) của giá trị cờ h trong gói trả về như bảng dưới:
Các giá trị xác suất này là thông tin duy nhất mà mỗi nút cần phải duy trì cho việc định tuyến chống tắc nghẽn. Mỗi nút sẽ chỉ phải lưu thêm O(log(n)) thông tin thêm do đó mạng vẫn sẽ giữ được khả năng mở rộng cao.
Thay đổi lưu lượng: Để đạt được mục đích tăng thông lượng đạt được trên toàn
mạng ta thực hiện việc chuyển lưu lượng chuyển qua các nút. Mỗi nút có thể sử dụng k đường định tuyến để chuyển tiếp gói tin (ở đây k=2). Như ở bảng trên mỗi nút lưu xác suất op1 và op2, giữa vào các xác suất này một nút sẽ chuyển lượng f1 lưu lượng qua đường định tuyến thứ nhất và f2 lưu lượng qua đường thứ hai (f1+f2=1). Một nút cập nhật giá trị f1 và f2 bằng cách sử dụng công thức:
δ = (op1 – op2 ) · φ f1 = f1 − δ, f2 = f2 + δ fmin ≤ fi, fj ≤ 1 – fmin
trong đó δ là lưu lượng chuyển từ đường định tuyến thứ nhất sang đường định tuyến thứ hai. Giá trị φ là một hằng số xác định tốc độ chuyển lưu lượng từ đường định tuyến này sang đường khác. Nếu δ có giá trị âm lưu lượng sẽ được chuyển ngược lại. Các giá trị f được có cận dưới được xác định bởi giá trị fmin
như công thức ở trên nhằm đảm bảo luôn luôn nhận được phản hồi về khả năng của mỗi đường định tuyến.
Với trường hợp k>2 đầu tiên chúng ta tính toán giá trị opmean là giá trị trung bình của tất cả các opi. Sau đó chúng ta sẽ tăng giảm fi dựa vào việc so sánh các giá trị opi và opmean.
Một nút cập nhật các giá trị op mỗi khi có truy vấn mới. Khi một nút chuyển tiếp các truy vấn từ các nút khác, nó sẽ chia lưu lượng theo các hướng dựa vào các tính toán về khả năng của từng đường định tuyến. Do đó trên mỗi nút truy vấn sẽ được định tuyến theo đường tối ưu, qua đó sẽ tăng thông lượng đạt được trên toàn mạng.
Nhược điểm của phương pháp này là khi muốn tăng số lượng các đường định tuyến, ta phải tăng kích thước bảng định tuyến. Sẽ là rất tốn kém tài nguyên nếu như mỗi nút phải duy trì bảng theo dõi trạng thái của nhiều nút khác. Đồng thời việc bỏ phương pháp định tuyến tham lam sẽ làm tăng số lượng gói tin truyền trên mạng.
Chương 4. Điều khiển tắc nghẽn sử dụng phương pháp thay đổi bảng định tuyến