Các node Kademlia lưu trữ trông tin liên lạc của nahu để định tuyến các bản tin truy vấn. Với mỗi i sao cho 0≤ i ≤ 160, mọi node sẽ lưu trữ một danh sách về <địa chỉ IP, cổng UDP, Node ID> của các node nằm giữa 2i và 2i+1 tính từ bản thân nó. Tạm gọi danh sách đó là các danh sách k-buckets. Mỗi k-bucket lưu trữ không quá k liên lạc với các node. Và phải có cơ chế quản lý thay thế và xóa liên lạc để tối ưu hóa khả năng duy trì liên lạc của danh sách k-bucket. Giải pháp cho vấn đề đó được đưa ra như sau:Mỗi k-bucket sắp xếp thứ tự các node trong dánh sách theo thời gian quan sát node. Node quan sát thấy lần cuối cùng sẽ được để ở đầu danh sách, node quna sát thấy ở thời điểm gần nhất được để ở cuối danh sách. Với i
tương đối nhỏ thì các danh sách k-bucket dường như là trống rỗng. Ngược lại, với i
đủ lớn thì các danh sách k-bucket có thể lên tới k liên lạc, trong đó k là một tham số dùng chung cho toàn bộ hệ thống và được lựa chọn sao cho bất cứ k node đưa ra thì cứ sau một giời sẽ tồn tại ít nhất một node không bị lỗi (ngắt kết nối). Thông thường giá trị được chọn k nằm trong khoảng từ 20 đến 30.
Khi một node Kademlia nhận bất cứ bản tin nào đó (yêu cầu hoặc đáp trả) từ một node khác, nó cập nhật bản tin k-bucket tương ứng đối với node ID của node gửi. Có một số trường hợp xảy ra.
• Nếu node gửi đã tồn tại trong trong danh sách k-bucket của node nhận, node nhận sẽ đưa node gửi xuống cuối danh sách của node nhận.
• Nếu node gửi không có trong danh sách k-bucket của node nhận và số lượng node trong k-bucket vẫn nhỏ hơn k, khi đó node nhận sẽ thêm node gửi mới vào cuối danh sách k-bucket tương ứng của mình.
• Nếu node gửi không có trong danh sách k-bucket của node nhận và k-bucket đã đầy (bằng k), khi đó node nhận sẽ kiểm tra node nằm ở đầu danh sách bằng lệnh ping để quyết định xem sẽ làm gì tiếp theo. Nếu node đó trả về lỗi thì node nhận sẽ thêm node gửi vào cuối danh sách k-bucket tương ứng. Nếu node được ping trả về không lỗi thì node nhận sẽ chuyển node đó xuống cuối danh sách, đồng thời bỏ qua node gửi.
Để đưa ra được giá trị k thích hợp, cần phải dựa trên số lượng người dùng, tính ổn định về truy nhập của người dùng trong mạng. Tổ chức Sariou đã đưa ra một nghiên cứu đối với mạng Gnutella với kết quả như sau:
Hình 2.3.1: Biểu đồ về khả năng dưy trì sô lượng người dùng trên mạng sau mỗi giờ. Tọa độ y biểu thị cho số node trên mạng, tọa độ x biểu thị thời gian
tính bằng x+60 phút
Theo biểu đồ đưa ra, ta sẽ xác định được số lượng liên lạc còn trên mạng tại mỗi thời điểm và số lượng còn duy trì sau mỗi giờ để từ đó đưa ra được giá trị k phù hợp.
Một lợi ích khác của các danh sách k-bucket là chúng cung cấp khả năng ngăn chặn các tấn công DoS. Một node không thể làm tràn trạng thái định tuyến của các node khác bằng cách làm tràn hệ thống với các node mới. Các node Kademlia chỉ thêm các node mới vào danh sách k-bucket khi các node cũ đã rời khỏi hệ thống.