Thủ tục snoop_ack() giám sát và xử lý các biên nhận (ACKs) do MH gửi trở lại và thực hiện các hành động khác nhau tuỳ thuộc vào loại và số biên nhận nó nhận
được (có ba loại biên nhận). Lưu đồ thuật toán của thủ tục snoop_ack() được thể
hiện trên hình 5.6; nó hoạt động như sau:
1. Trường hợp chung: Biên nhận mới, đây là trường hợp phổ biến, khi kết nối hầu như không có lỗi và người sử dụng di chuyển ít, nó báo hiệu sự tăng của dãy gói số liệu nhận được tại MH. Thủ tục snoop_ack() thực hiện các thao tác sau:
Giải phóng bộ đệm: xoá tất cả các gói số liệu đã được biên nhận khỏi bộ đệm của snoop_data().
Cập nhật ước lượng thời gian khứ hồi: ước lượng cho thời gian khứ hồi của
đường truyền không dây cũng được cập nhật một cách thông minh, nó không được thực hiện đối với từng gói số liệu, mà chỉ được thực hiện với một gói số liệu trong mỗi cửa sổ gửi và chỉđược cập nhật nếu trong cửa sổđó không phải phát lại gói số
liệu nào. Điều kiện thứ hai vừa nêu là cần thiết bởi vì nói chung, không có cách nào xác định được một biên nhận là cho gói số liệu phát đi lần đầu hay cho chính gói số
liệu đó ở lần phát lại.
Chuyển tiếp biên nhận cho người gửi: việc cuối cùng là chuyển tiếp biên nhận tới cho người gửi - FH.
2. Biên nhận giả mạo: là biên nhận cho gói số liệu có số thứ tự nhỏ hơn số thứ
tự gói số liệu đã được biên nhận sau cùng mà snoop agent thấy, tình huống này hiếm khi xảy ra. Biên nhận này sẽ bị loại bỏ và việc xử lý các gói số liệu sẽ tiếp tục.
3. Biên nhận lặp: là biên nhận hoàn toàn giống với một biên nhận tích luỹ cao nhất đã nhận được trước đó. Khi biên nhận lặp đầu tiên đến snoop_ack(), điều đó nói lên rằng MH không nhận được gói số liệu có số thứ tự kế tiếp số thứ tự chỉ ra trong biên nhận lặp. Tuy nhiên, nếu Snoop agent tiếp tục nhận được các biên nhận lặp nữa, điều đó nói lên rằng MH đã nhận được một số gói số liệu có thứ tự tiếp theo gói số liệu mà nó không nhận được. Lý do là vì, MH sẽ gửi một biên nhận lặp cho mỗi gói số liệu nó nhận được nhưng không đúng thứ tự. Một trong các hành
động sau đây sẽ xảy ra tuỳ thuộc vào kiểu của biên nhận lặp và vào trạng thái hiện thời của snoop_data():
Biên nhận lặp đầu tiên (First one? = Yes): nếu gói số liệu cần phát lại không có trong bộ nhớ đệm của Snoop agent, thì nó sẽ phải được FH phát lại, do đó Snoop agent cần chuyển tiếp biên nhận lặp cho FH, bởi vì FH (thực thể gửi của kết nối TCP) cần có các thông tin trạng thái, dựa trên số biên nhận lặp nhận được để quyết
định việc phát lại một gói số liệu. Nếu Snoop agent có gói số liệu tương ứng với biên nhận lặp này trong bộ nhớ đệm, thì nó cần phát lại gói số liệu đó và loại bỏ
biên nhận lặp.
Biên nhận lặp kế tiếp (First one? = No): trường hợp này xảy ra khi một biên nhận lặp nữa đến. Lúc này, gói số liệu bị mất đã được phát lại khi biên nhận lặp thứ
nhất đến. Nếu ước lượng số cực đại các biên nhận lặp cho cùng gói số liệu này bằng không, biên nhận lặp này được loại bỏ ngay. Trong thực tế, gói số liệu được phát lại
đến MH trước hầu hết các gói số liệu có số thứ tự sau nó, bởi vì nó được phát lại với quyền ưu tiên cao hơn, do đó, BS sẽ nhận thấy sự tăng trong dãy biên nhận. Việc phát lại các gói số liệu với quyền ưu tiên cao hơn giúp nâng cao hiệu năng với mọi tỉ suất lỗi đường truyền.
Phát lại một cách thông minh khi nhận được biên nhận lặp đầu tiên
Để làm cho số biên nhận lặp càng ít càng tốt, ngay sau khi phát hiện ra sự mất gói số liệu (khi nhận được biên nhận lặp đầu tiên), nó cần phải được phát lại càng nhanh càng tốt với quyền ưu tiên cao hơn các gói số liệu bình thường. Có thể thực hiện được điều này bằng cách tổ chức hai hàng đợi tại tầng Liên kết dữ liệu, một hàng đợi cho các gói số liệu bình thường, từ FH mới đến, còn hàng đợi kia chứa (bản sao) các gói số liệu đã được phát lại, có quyền ưu tiên cao hơn. Điều đó làm cho các gói số liệu được phát lại đến MH sớm hơn, làm giảm số biên nhận lặp và dẫn đến tăng thông lượng. Snoop_ack() bám sát số lần phát lại cục bộ của một gói số liệu và sẽ đặt lại cho số này bằng không khi nhận được chính gói số liệu đó do bên gửi phát lại sau khi nó bị hết giờ hoặc vào chếđộ phát lại nhanh.