rdt2.0
5.1.2 Truyền dữ liệu tin cậy thông qua kênh có bít lỗi: rdt 2.0
- Mô hình thực tế hơn là mô hình có kênh truyền mà các gói tin đi qua đó có bít lỗi. Và chúng ta vẫn giả sử rằng các gói tin được truyền đến theo đúng thứ tự mà nó được gửi.
- VD khi ta nghe 1 điện thoại thì nếu mà ta nghe đã rõ và hiểu thì ta sẽ báo với đầu dây bên rằng ta đã nghe rõ và hiểu bằng cách nói ví dụ là OK, còn nếu ta nêu không rõ thì ta có thể yêu cầu đầu dây bên kia nhắc lại bằng cách thông báo với họ bằng cách nói "hãy nói lại". Điều ày cũng được áp dụng trong mạng máy tính, ở phiên bản rdt 2.0. Rdt 2.0 bổ xung 2 cơ chế mới đó là:
+ Bắt lỗi: Có cơ chế cần thiết để cho phép bên nhận bắt được bít lỗi. Như ta đã biết UDP có trường checksum để thực hiện cơ chế này. Ở đây ta chỉ cần nhớ, có các công nghệ để bắt lỗi bằng cách thêm các bít ngoài các bít thông thường của gói tin đặt vào trường checksum của rdt 2.0
+ Phản hồi tường minh: trong giao thức rdt 2.0 có 2 cách phản hồi tường minh:
Biên nhận tích cực - ACK: bên nhận thông báo tường minh cho bên gửi rằng mình đã nhận đúng và chính xác gói tin
Biên nhận tiêu cực - NAK: bên nhận thông báo tường minh chi bên gửi rằng mình nhận gói tin có lỗi xảy ra.
*) Máy hữu hạn trạng thái:
- Máy hữu hạn trạng thái có 2 trạng thái:
+ 1 trạng thái là bên gửi đợi này gọi hàm từ trên xuống để đẩy dữ liệu xuống tầng thấp hơn.
+ 1 trạng thái là bên gửi đợi ACK hoặc NAK từ bên nhận.
- Bên gửi:
+ Nếu bên nhận nhận được lời gọi hàm từ phía trên xuống (sự kiện), nó sẽ chấp nhận dữ liệu thông qua hàm rdt_send(data). Sau đó nó sẽ đóng gói dữ liệu kèm theo trường checksum trong gói tin bằng hàm complete checksum make_packet(sndpkt, data,checksum).Tiếp theo nó gửi qua kênh truyền dữ liệu bằng lệnh udt_send(data). Rồi quay sang trạng thái đợi ACK hoặc NAK.
+ Nếu bên nhận (sự kiện) nhận được gói tin ACK (rdt_rcv(rcvpkt) && isACK(rcvpkt)) thì bên gửi biết rằng gói tin mình gửi gần đây nhất đã đúng thì nó ko làm ji cả và quay về trạng thái đợi lời gọi từ trên xuống.
+ Nếu bên nhận (sự kiện) nhận được gói tin NAK (rdt_rcv(rcvpkt) && isNAK(rcvpkt)) thì bên gửi biết rằng gói tin nó gửi gần đây nhất có lỗi xảy ra thì nó gửi lại gói tin gần đây nhất bằng hàm udt_send(sndpkt) rồi quay về trạng thái đợi ACK và NAK.
- Bên nhận:
+ Nếu nhận được gói tin có lỗi, bên nhận sẽ nhận được 1 lời gọi hàm từ dưới lên (tự viết hàm ra) thì nó sẽ lại 1 gói tin NAK cho bên gửi thông báo rằng nó đã nhận được 1 gói tin lỗi và quay về trạng thái đợi lời gọi hàm tứ dưới.
+ Nếu nhận được gói tin không có lỗi thì bên nhận sẽ bóc tách gói tin, lấy dữ liệu từ gói và gửi cho tần bên trên, sau đó gửi lại 1 gói tin ACK cho bên gửi thông báo rằng nó đã nhận được đúng gói tin. (tự viết hàm ra).
- Chú ý rằng khi bên gửi đang đợi ACK hoặc NAK thì nó không thể thêm bất kì dữ liệu nào từ tầng trên xuống, điều này cư xảy ra liên tục nếu nó liên tục nhận được NAK, do đó bên gửi sẽ ko gửi bất kì mảnh dữ liệu nào cho đến khi nó biết chắ rằng bên nhận đã nhận đúng được gói tin. Bởi vì hành vi này nên rdt 2.0 còn gọi là giao thức dừng và chờ.
- Bây giờ xảy ra trường hợp ACK hoặc NAK bị lỗi thì lúc này xảy ra tình trạng là: bên nhận không biết tình trạng của bên gửi như thế nào để hành xử. Để xử lí tình huống này ta chọn giải pháp là: bên gửi sẽ gửi lại cho bên nhận gói tin gần nhất thời điểm khi bên gửi khooang xác định được ACK hay NAK. 1 vấn đề khác lại nảy sinh là các gói tin có thể bị trùng nhau. Khó khăn cơ bản xảy ra với các gói tin trùng nhau ở đây là: bên nhận không biết là ACK hay là NAK mà nó gửi lần cuối được nhận đúng ở bên gửi. Vì thế mà bên gửi không biết liệu nó nên truyền 1 gói tin mới hay phải truyền lại.
- Để giải quyết vấn đề này là thêm 1 trường mới vào gói dữ liệu đó là trường số thứ tự: bên gửi sẽ đánh sô thứ tự các gói tin mà nó gửi đi, bên gửi chỉ cần kiểm tra số thứ tự này để biết được có hay không gói tin bị truyền lại tức là: nếu bên gửi gửi lại gói tin đã gửi trước đó thì số thự tự của gói tin đến giống (trùng nhau ) với số thứ tự của gói tin gần nhất nó nhận trước đó. Đối với giao thức rdt 2.0 chỉ cần dùng 1 bit cho sô thứ tự là đủ.
Bạn đang đọc truyện trên: AzTruyen.Top