Khi hàng đợi tại nút P đầy, thay vì loại bỏ gói tin, nút sẽ tạm ngưng việc đọc gói tin từ socket TCP của các kết nối đến. Khi đó thuật toán điều khiển lưu lượng sẵn có của TCP sẽ tự động làm chậm lại việc các nút gửi truy vấn đến nút P. Nguy cơ hình thành deadlock: Nguyên nhân của việc hình thành deadlock là khi một nút gửi đợi nút nhận xử lý các gói tin trong hàng đợi, trong khi nút nhận cũng đang phải đợi một nút khác. Deadlock xảy ra khi các nút đợi nhau tạo thành vòng kín, dễ thấy trong trường hợp mạng có dạng vòng như Chord.
Có thể thấy khác biệt lớn nhất của BPCC là việc phương thức này không drop gói tin, do đó tăng thông lượng đạt được trên toàn hệ thống. Tuy nhiên phương pháp này có thể sinh ra deadlock và việc phát hiện, xử lý deadlock này là rất khó khăn, đặc biệt là trong môi trường mạng ngang hàng với sự tham gia của nhiều nút tự do, không thể kiểm soát. Ngoài ra việc chờ đợi trên các nút gây tăng thời gian đáp ứng của các truy vấn.
3.3. Phương pháp Marking[3]
Hai phương pháp CSCC và BPCC ở trên có chung một nhược điểm là chỉ thực hiện việc chống tắc nghẽn tức là khi tắc nghẽn đã xảy ra trên mạng. Phương pháp Marking có gắng giải quyết vấn đề này. Để phân tích phương pháp này ta xét lần lượt từng thành phần tham gia vào việc điều khiển tắc nghẽn trong phương pháp này: Layer 3 BPCC Layer 2 Layer 1 - TCP Layer 3 BPCC Layer 2 Layer 1 - TCP Destination Queue state Source
Hàng đợi: Trên mỗi nút duy trì một hàng đợi chứa các truy vấn tới. Ta sử dụng các hàng đợi này để phản hồi tình trạng tắc nghẽn thông qua việc thêm một cờ h vào trong header. Mục đích là giữ cho các nút được chia sẻ tài nguyên đang bị bottleneck một cách công bằng mà không làm quá tải nút đang tắc nghẽn. Cờ h có kích thước 1 bit, mặc định được tắt trong gói tin truy vấn tại nguồn. Cờ h tắt thể hiện tình trạng mạng không tắc nghẽn, h bật thể hiện tình trạng tắc nghẽn. Mỗi nút đặt giá trị x thể hiện tốc độ truy vấn hiện tại của nó vào trong header của gói tin. Ngoài ra mỗi nút lưu số lượng trung bình xavg các gói tin, được tính toán thông qua giá trị x nhận được từ một số gói tin đến trước đó. Cờ h được bật với xác suất q được xác định thông qua việc xét xem gói tin đến có tốc độ nhanh hay chậm hơn giá trị trung bình xavg và giá trị trung bình kích thước của hàng đợi, cụ thể như sau:
s: là số lượng gói tin trong hàng đợi δ: giá trị làm mềm, ví dụ bằng 0.9
s: số lượng trung bình các gói tin trong hàng đợi t: giá trị ngưỡng tối đa sẽ gửi phản hồi
γ: giá trị đảm bảo độ công bằng
s= (1 − δ) · s + δ · s q=min ( ) ,1 avg x x s t t s (10)
Công thức 10 bao gồm 2 phần: phần thứ nhất dùng cho việc điều khiển tắc nghẽn, giá trị số gói tin trung bình scàng gần đến ngưỡng t sẽ làm tăng xác suất q dẫn tới việc khả năng cờ h được bật tăng. Nếu s≥t, q=1 thì cờ h sẽ được bật với xác suất bằng 1. Giá trị ngưỡng t được đặt nhỏ hơn khả năng tối đa mà hàng đợi có thể lưu trữ, để đảm bảo khả năng phục vụ kể cả trong trường hợp có lượng lớn gói tin trong một thời điểm ngắn. Ngoài ra còn có thêm giá trị δ trong việc tính toán giá trị s để tránh việc bật cờ h trong trường hợp tốc độ truy vấn thay đổi đột biến trong thời gian ngắn. Phần thứ hai được dùng cho mục đích đảm bảo công bằng: khi tốc độ truy vấn x của một nút nguồn nhỏ hơn tốc độ trung bình xavg của truy vấn đến mà nút đích nhận được thì q giảm. Ngược lại
nếu x > xavg thì q tăng, thể hiện việc nút nguồn sẽ bị giới hạn tốc độ nếu như chiếm phần lớn tài nguyên của nút đích. Giá trị γ xác định xem mức độ quan trọng của việc chia sẻ công bằng. Nếu γ = 0 sẽ bỏ qua việc đảm bảo công bằng. γ càng lớn thì độ lệch giữa x và xavg sẽ ảnh hưởng càng nhiều đến xác suất p. Một khi cờ h được bật nó sẽ không bị tắt trên suốt quãng đường truyền tới đích cuối cùng. Nút đích sao chép giá trị của h vào gói tin overlay-acknowledgement được gửi trả lại cho nút nguồn kèm với trả lời cho truy vấn.
Nút nguồn: Một nút sẽ nhận được gói tin trả lời truy vấn với overlay-ack có cờ h. Nếu h tắt, tức là không có tắc nghẽn, nút tăng tốc độ truy vấn của nó như sau:
x c x x:
c+ là một hằng số dương nhỏ thể hiện mức độ một nút kiểm tra lượng băng thông còn có thể sử dụng khi nhận được thông báo không tắc nghẽn.
Với cờ h được bật nút giảm tốc độ truy vấn của nó như sau:
x c x:
với 0 < c- < 1 là hằng số, thể hiện mức độ một nút giảm tốc độ truy vấn khi có tắc nghẽn xuất hiện.
Qua hai công thức trên có thể thấy ta tăng tốc độ truy vấn theo cấp số cộng và giảm theo cấp số nhân của một nút tương tự như trong TCP. Giá trị c+ và c- được chọn dựa vào RTT và khả năng phục vụ của mạng.
Lựa chọn giá trị RTT: Mỗi nút lưu một giá trị RTT ước lượng cho các truy vấn: với mỗi truy vấn RTT được tính dựa trên thời gian gửi và thời gian nhận được phản hồi. Giá trị RTT được sử dụng cho toàn mạng nghĩa là không phụ thuộc vào đích đến của truy vấn. Do thông thường mỗi truy vấn đến một nút khác nhau trong mạng do đó giá trị RTT có sự thay đổi rất lớn. Nếu như sau thời gian RTT mà nút không nhận được trả lời cho truy vấn, một nút giảm tốc độ gửi truy vấn và gửi lại truy vấn.
Do không phải loại bỏ gói tin cũng như cơ chế gọn nhẹ trong việc gửi phản hồi tình trạng tắc nghẽn cho nút nguồn nên phương pháp Marking có kết quả về
thông lượng đạt được cũng như thời gian trả lời truy vấn tốt hơn nhiều so với hai phương pháp CSCC và BPCC đã trình bày ở phần trước.
3.4. Phương pháp định tuyến thích nghi[5]
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: