Giao thức Go-back-N

Một phần của tài liệu Bài giảng mạng máy tính ths nguyễn xuân anh (Trang 88 - 92)

Trong giao thức Go-Back-N, phía gửi cho phép truyền đi đồng thời nhiều gói dữ liệu mà không phải đợi biên nhận. Tuy nhiên tổng số gói dữ liệu không phải là vô hạn mà bị giới hạn bởi giá trị N - tổng số gói dữ liệu tối đa chưa được biên nhận trong đường ống. Hình 3.18 là khoảng số thứ tự trong giao thức Go- Back-N. Định nghĩa base là số thứ tự của gói dữ liệu đã được truyền đi lâu nhất chưa được biên nhận và next seqnum là số thứ tự nhỏ nhất chưa được sử dụng (là số thứ tự của đoạn tiếp theo sẽ gửi). Có bốn khoảng số thứ tự như sau: Khoảng [0,base-1] ứng với số thứ tự của các gói dữ liệu đã được truyền đi và đã được biên nhận. Khoảng [base, nextseqnum-1] ứng với các gói dữ liệu đã được gửi đi nhưng chưa được biên nhận. Khoảng [nextseqnum, base +N- 1] có thể được sử dụng làm số thứ tự cho các gói sẽ được gửi nếu như có dữ liệu từ tầng trên chuyển xuống. Khoảng từ [base+n] trở lên chưa được sử dụng cho đến khi các gói tin đợi biên nhận được biên nhận.

Trong hình 4.12, khoảng cho phép số thứ tự của những gói dữ liệu đã được gửi nhưng chưa được biên nhận có thể xem là một “cửa sổ” kích thước N nằm trong phạm vi số thứ tự. Khi giao thức vận hành, cửa sổ này có thể “trượt” trên toàn bộ khoảng số thứ tự. Vì vậy, N thường được xem là độ lớn cửa sổ (window size) và giao thức GBN là giao thức cửa sổ trượt (sliding- window). tại sao ngay từ đầu chúng ta phải giới hạn số lượng tối đa các gói dữ liệu được gửi mà chưa cần biên nhận bởi giá trị N. tại sao không để giá trị N này là vô hạn.

Chúng ta sẽ thấy trong phần 3.5, kiểm soát lưu lượng là một trong những lý do bắt buộc ta phải đặt giới hạn phía gửi.

Hình 4.12 Khoảng số thứ tự của bên gửi trong giao thức Go-Back-N

Trong thực tế, số thứ tự của đoạn dữ liệu được đặt trong một trường có độ dài cố định trong phần thông tin điều khiển của đoạn dữ liệu. Nếu k là độ lớn trường số thứ tự (tính theo bit) của đoạn dữ liệu thì khoảng số thứ tự sẽ là [0,2k - 1]. Vì khoảng số thứ tự bị giới hạn, nên tất cả các thao tác trên số thứ tự sẽ được thực hiện theo module 2k (khoảng số thứ tự có thể xem là một vòng tròn với 2k giá trị, sau giá trị 2k-1 là giá trị 0). Giao thức rdt 3.0 chỉ sử dụng 1 bit làm số thứ tự nên khoảng số thứ tự là [0,1].

Gọi là FSM mở rộng (extended FSM) vì được thêm vào các biến (base và nextseqnum - giống như biến trong ngôn ngữ lập trình), các thao tác và hành động có điều kiện liên quan đến các biến này. Trong giao thức GBN, phía gửi phải đáp ứng ba sự kiện sau:

- Có dữ liêu từ trên chuyển xuống : khi rdt_send() được phía trên sử dụng để chuyển dữ liệu xuống, phía gửi phải kiểm tra xem cửa sổ đã đầy chưa (tức là đã có N gói dữ liệu gửi đi chưa được biên nhận không). Nếu cửa sổ chưa đầy, phía gửi tạo ra và sau đó gửi gói dữ liệu đồng thời cập nhật các biến. Nếu cửa sổ đầy, phía gửi không chấp nhận dữ liệu từ tầng trên và thông báo cửa sổ đã đầy. Khi đó, tầng trên sẽ phải gửi lại. Trên thực tế, phía gửi sẽ đưa dữ liệu vào vùng đệm (nhưng chưa gửi ngay) hoặc có cơ chế đồng bộ (sử dụng semaphore hay cờ) chỉ cho phép tầng ứng dụng sử dụng rdt_send() khi cửa sổ chưa đầy.

- Nhân được một ACK: trong giao thức GBN, giá trị biên nhận gói tin có số thứ tự n sẽ mang giá trị tích luỹ, nghĩa là toàn bộ gói dữ liệu có số thứ tự nhỏ hơn hoặc bằng n đều đã được phía nhận nhận đúng. Chúng ta sẽ quay lại vấn đề này khi xem xét phía nhận trong giao thức GBN.

- Hết thời gian đợi (timeout): tên giao thức - “Go-Back-N” bắt nguồn từ hành vi của phía gửi khi dữ liệu bị mất hay bị trễ. Giống như trong giao thức stop and wait, đồng hồ định thời được sử dụng để xử lý việc mất gói dữ liệu hay gói phản hồi. Khi hết thời gian đợi (timeout), phía gửi sẽ gửi lại tất cả các gói dữ liệu đã được gửi đi trước đó nhưng chưa được biên nhận. Trong hình 4.13, phía gửi chỉ sử dụng duy nhất một đồng hồ định thời, có thể xem

là thời gian của đoạn dữ liệu đã được truyền đi lâu nhất nhưng chưa được biên nhận. Nếu ACK nào đó được nhận nhưng vẫn còn gói dữ liệu gửi đi chưa được biên nhận thì đồng hồ định thời sẽ được khởi động lại. Nếu tất cả các đoạn dữ liệu đã gửi đều được biên nhận thì có thể ngừng đồng hồ định thời.

Hình 4.13 FSM mở rộng của bên gửi trong GBN

Các hành động của phía nhận trong giao thức GBN đơn giản. Nếu nhận được đúng đoạn dữ liệu và đoạn dữ liệu này đúng thứ tự thì phía nhận gửi ACK cho đoạn dữ liệu nhận được và chuyển dữ liệu trong đoạn dữ liệu này bên trên. Trong tất cả các trường hợp còn lại, phía nhận loại bỏ đoạn dữ liệu và gửi lại ACK cho đoạn dữ liệu đúng thứ tự cuối cùng nó nhận được. Chú ý rằng đoạn dữ liệu được chuyển lên tầng trên một lần duy nhất nên nếu đoạn dữ liệu thứ k được nhận và chuyển lên trên thì nghĩa là tất cả các đoạn dữ liệu có số thứ tự nhỏ hơn k cũng đã được chuyển lên. Sử dụng ACK tích luỹ là sự lựa chọn tốt nhất cho giao thức GBN. Trong giao thức GBN, bên nhận loại bỏ đoạn tin không theo thứ tự.

Dường như lãng phí khi loại bỏ đoạn tin đã nhận đúng nhưng không đúng thứ tự, nhưng có vài nguyên nhân cho hoạt động trên. Bên nhận phải chuyển dữ liệu lên tầng trên theo đúng thứ tự. Giả sử đoạn tin N đang được đợi nhận nhưng đoạn tin thứ (N+1) lại đến trước. Trong trường hợp ấy, để dữ liệu chuyển lên hợp lệ, bên nhận có thể lưu tạm đoạn tin (N+1) và chỉ chuyển đoạn tin này bên tầng trên sau khi đã nhận đúng đoạn tin thứ N. Tuy nhiên theo quy tắc truyền lại của bên gửi, nếu đoạn tin thứ N bị mất thì đoạn tin này và cả đoạn tin N+l sẽ được truyền lại.

Hình 4.14 FSM mở rộng của bên nhận trong GBN

Như vậy, bên nhận có thể loại bỏ đoạn tin N+1. Ưu điểm của giải pháp này là bên nhận triển khai vùng đệm (buffer) đơn giản bởi không cần lưu lại các đoạn tin không đúng thứ tự. Nếu bên gửi phải ghi nhớ các cận của cửa sổ (base, base+n) và vị trí nextseqnum trong cửa sổ, thì bên nhận chỉ phải nhớ số thứ tự của đoạn tin hợp lệ tiếp theo. Giá trị này được giữ trong biến expectedseqnum (số thứ tự được mong đợi). Tất nhiên, nhược điểm của việc loại bỏ đoạn tin đã nhận đúng (nhưng không theo thứ tự) là khi truyền lại đoạn tin có thể bị mất hay lỗi, do đó phải truyền đi truyền lại nhiều lần.

Với độ lớn giới hạn, bên gửi sẽ chỉ được gửi các gói tin tớ 0 đến 3 nhưng sau đó phải đợi biên nhận cho các đoạn tin này trước khi tiếp tục gửi tiếp. Khi nhận được các ACK liên tiếp nhau (ví dụ ACK0 và ACK1), cửa sổ sẽ trượt về phía trước, bên gửi có thể truyền đoạn tin mới (lần lượt là pkt4 và pkt5). Ở phía bên nhận, đoạn tin số 2 bị mất, do đó đoạn tin 3,4,5 gửi đến không theo đúng thứ tự và bị loại bỏ. Với GBN, có một chú ý quan trọng là triển khai GBN tương tự FSM mở rộng. Hình thức triển khai bao gồm nhiều thủ tục khác nhau, mỗi thủ tục thực hiện một nhóm các hành động nào đó đáp lại các sự kiện khác nhau có thể xảy ra. với lập trình hướng sự kiện, các thủ tục sẽ được các thủ tục khác gọi hay là kết quả của việc gọi ngắt. Ở phía bên gửi, sự kiện có thể là: - Thực thể tầng trên truyền dữ liệu xuống qua thủ tục rdt_send() - Ngắt khi thời gian đợi hết

Hình 4.15 Giao thức Go-Back-N trong quá trình hoạt động

Trong thực tế, TCP là giao thức “tựa” GBN. Tuy nhiên có sự khác biệt giữa GBN và TCP. Nhiều phiên bản TCP lưu lại các segment không theo thứ tự nhận đúng. Trong phương án nâng cấp TCP, sử dụng biên nhận có lựa chọn [RFC 258] cho phép bên nhận có thể biên nhận tuỳ ý một đoạn tin không theo thứ tự (chứ không sử dựng giá trị biên nhận tích luỹ). Biên nhận có lựa chọn chính là lớp giao thức gửi liên tiếp thứ hai: Lặp lại có lựa chọn (selective repeat - SR). Có thể xem TCP là sự kết hợp của cả hai giao thức GBN và SR.

Một phần của tài liệu Bài giảng mạng máy tính ths nguyễn xuân anh (Trang 88 - 92)