Dù giao thức rdt3.0 đảm bảo được các gói tin không bị lỗi và mất, nhưng nó lại không hoạt động hiệu quả trong môi trường mạng tốc độ cao. Nguyên nhân chủ yếu là vì giao thức này là giao thức “dừng và chờ”.

Example

Giả sử cho một đường truyền có kích thước mỗi gói tin là L = 8000 bit, tốc độ truyền gói tin là R = bps. Thời gian để đẩy gói tin lên đường truyền sẽ là . Tuy nhiên, tổng thời gian tính từ lúc gói tin được đẩy lên đường truyền cho đến lúc bên gửi nhận được gói tin phản hồi, sẽ là 30.008 ms.

Có thể thấy, thời gian đẩy gói tin lên đường truyền chỉ bằng 0.00027 % của tổng thời gian vận chuyển. Cụ thể hơn, nếu chúng ta gửi đi bit trong thời gian 30.008 ms, tốc độ truyền tải mà ta sử dụng chỉ có 267 kbps, mặc dù tốc độ của đường truyền là 1 Gbps ( bps).

Như vậy, với giao thức “dừng và chờ”, băng thông mà bên gửi sử dụng chỉ chiếm một phần nhỏ so với băng thông của đường truyền. Trong trường hợp này, giao thức đã làm giảm sức mạnh của phần cứng.

Để tối ưu hóa, ta cần gửi đi nhiều gói tin liên tiếp thay vì chỉ một. Kỹ thuật này được gọi là pipeline (hay ống dẫn).

Có hai giao thức áp dụng kỹ thuật pipeline phổ biến là: Go-Back-NSelective Repeat.

Go-Back-N

Trong giao thức Go-Back-N (hay giao thức quay lui), bên gửi được phép gửi N gói tin mà không cần chờ báo nhận, với N là số gói tin tối đa được gửi đi trong một cửa sổ (lý do cần giới hạn gói tin là vì flow control, xem thêm TCP).

Giả sử cửa sổ có kích thước N = 4, bên gửi gửi bốn gói tin có số thứ tự lần lượt là 0, 1, 23. Sau khi gói tin 0 đến bên nhận và bên nhận phản hồi lại ACK cho bên gửi, bên gửi sẽ trượt cửa sổ qua một gói tin.

Lúc này, chỉ có gói tin số 4 là chưa được gửi, trong khi cả ba gói tin còn lại vẫn đang chờ ACK. Bên gửi sẽ gửi đi gói tin số 4.

Tương tự, sau khi gói tin số 1 có ACK phản hồi, bên gửi sẽ gửi gói tin số 5.

Giả sử ACK của gói tin số 2 bị mất, bên gửi sẽ phải chờ hết timeout rồi mới được thực thi hành động tiếp theo.

Sau khi hết timeout, bên gửi quay lui về gói tin số 2 và gửi lại tất cả gói tin có trong cửa sổ. Hai gói tin số 45 trước đó ở bên nhận sẽ bị loại bỏ.

Bên nhận có nhiệm vụ lưu các gói vào buffer để chờ chuyển lên tầng trên. Ngoài ra, nó còn theo dõi số thứ tự của gói tin thành công để gửi lại ACK phù hợp.

Xét trường hợp bên gửi bị mất gói, chẳng hạn bị mất gói số 2 như hình dưới đây:

![[Go-Back-N-example-2.webp|#small]]

Khi bên gửi gửi gói tin số 3, bên nhận chỉ biết là nó mới nhận đến gói tin số 1 và cần gói tin số 2, chứ không phải gói tin số 3. Gói tin số 3 sẽ bị hủy, ACK của gói tin số 1 sẽ được gửi lại. Tuy nhiên, gói tin ACK bị trùng này sẽ bị bỏ qua. Hai gói tin số 4 và số 5 đến sau cũng được xử lý tương tự gói tin số 3.

Khi hết thời gian timeout, bên gửi chưa nhận được đầy đủ ACK cho các gói tin 23, nó sẽ gửi lại tất cả các gói tin có trong cửa sổ (tương tự trường hợp mất gói tin ACK ở trên).

Có thể thấy, các gói tin phản hồi được gửi lại dựa trên việc tích lũy những gói tin mà bên nhận nhận được. Nếu có hai gói tin được gửi đến thành công, bên nhận sẽ gửi lại ACK cho gói tin thứ hai khi có sự mất gói xảy ra, thay vì gửi ACK cho tất cả các gói tin. Kỹ thuật này được gọi là ACK tích lũy (cumulative ACK).

Selective Repeat

Giao thức Selective Repeat (gửi lại có chọn lọc) cũng sử dụng một cửa sổ trượt để kiểm soát việc gửi các gói tin giống giao thức Go-Back-N. Tuy nhiên, giao thức này chỉ gửi lại gói tin bị mất thay vì gửi lại tất cả các gói tin có trong cửa sổ như giao thức Go-Back-N.

Giả sử gói tin số 2 bị mất, bên nhận vẫn chấp nhận tất cả các gói tin đến sau bằng cách lưu chúng vào buffer. Sau khi hết thời gian timeout, do vẫn chưa nhận được ACK cho gói số 2, bên gửi sẽ gửi lại gói tin số 2. Do mỗi gói sẽ có một bộ đếm thời gian riêng, nên bên gửi chỉ gửi lại gói tin khi nào quá thời gian timeout của gói tin đó.

![[Selective-Repeat-example.webp|#small]]

Sau khi bên gửi nhận được ACK cho gói tin số 2, cửa sổ bên gửi sẽ trượt qua một gói tin, gói tin số 6 sẽ được gửi đi.

Có thể sử dụng gói tin NAK thay thế cho gói tin ACK của gói tin số 3 để thông báo cho bên gửi biết rằng bên nhận vẫn chưa nhận được gói tin số 2. Khi đó, bên gửi có thể gửi lại gói tin số 2 ngay mà không cần phải chờ hết timeout.

#x-small

Trường hợp gói tin ACK bị mất, bên gửi cần phải chờ hết thời gian timeout để gửi lại gói tin.

Go-Back-N and Selective Repeat

Resources