- vừa được xem lúc

Kỹ thuật báo nhận, phát lại Stop and wait ARQ

0 0 1

Người đăng: Viblo Fundamentals

Theo Viblo Asia

I. Mở đầu

Chúng ta đã được tìm hiểu về các phương pháp phát hiện lỗi như parity check, checksum, ... giúp kiểm tra các gói tin bị lỗi trong quá trình truyền. Sau khi phát hiện lỗi, cần có thêm cơ chế báo nhận, phát lại, còn được gọi chung là ARQ (Automatic Repeat reQuest). Hai kỹ thuật phát hiện lỗi và báo nhận, phát lại kết hợp với nhau tạo thành cơ chế kiểm soát lỗi đóng vai trò quan trọng trong việc đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu truyền qua mạng.

Trong môi trường truyền thông, lỗi có thể xảy ra do nhiều nguyên nhân như nhiễu, suy giảm tín hiệu, hoặc va chạm dữ liệu. ARQ giúp giảm thiểu tác động của những vấn đề này bằng cách đảm bảo rằng mọi gói tin đều được nhận một cách chính xác trước khi tiếp tục quá trình truyền. Không chỉ cải thiện độ tin cậy và chất lượng của dịch vụ truyền thông mạng, ARQ còn góp phần tăng cường hiệu suất tổng thể bằng cách giảm thiểu cần thiết phải truyền lại dữ liệu, qua đó tiết kiệm được băng thông và giảm độ trễ.

ARQ là một phương pháp kiểm soát lỗi trong truyền thông dữ liệu, trong đó bên nhận phản hồi lại với bên gửi thông qua việc gửi các tín hiệu báo nhận (acknowledgements - ACKs) hoặc thông báo lỗi (negative acknowledgements - NACs/NACKs). Dựa trên phản hồi này, bên gửi quyết định có cần thiết phải gửi lại gói tin bị lỗi hoặc mất mát hay không. Có nhiều biến thể của ARQ như Stop and wait ARQ, Go back N ARQ, Selective reject ARQ. Trong khuôn khổ tầng liên kết dữ liệu chúng ta sẽ tìm hiểu kỹ thuật Stop and wait ARQ, hai kỹ thuật khác thuộc về tầng giao vận.

II. Stop and wait ARQ

1. Định nghĩa Stop and wait ARQ

Kỹ thuật kiểm soát lỗi Stop and wait ARQ yêu cầu bên gửi (sender) và bên nhận (receiver) tuân thủ quy tắc như sau:

  • Bên gửi mỗi lần chỉ gửi một gói tin, và chỉ gửi tiếp gói tin khác khi nhận được ACK của gói đã gửi trước đó. Trong trường hợp timeout mà chưa nhận được ACK thì gửi lại gói đã gửi.
  • Bên nhận bắt buộc gửi lại ACK báo nhận cho bên gửi khi nhận gói tin hợp lệ (tốt).

2. Nguyên tắc hoạt động

Nguyên tắc hoạt động của Stop and wait ARQ dựa trên một quy trình truyền thông hai chiều giữa bên gửi và bên nhận. Dưới đây là các bước cơ bản trong quy trình này:

  • Gửi dữ liệu: Bên gửi thực hiện gửi một gói dữ liệu và dừng lại, chờ phản hồi từ bên nhận.
  • Chờ phản hồi: Sau khi nhận được gói tin, bên nhận kiểm tra tính toàn vẹn thông qua các phương pháp như checksum. Nếu dữ liệu được xác nhận là không có lỗi, bên nhận gửi một ACK về cho bên gửi. Ngược lại, nếu phát hiện lỗi, bên nhận có thể gửi một NAK/NACK, hoặc không gửi phản hồi nào cả, tùy thuộc vào thiết kế cụ thể của hệ thống.
  • Nhận phản hồi và xử lý: Bên gửi sau khi nhận được ACK, sẽ tiến hành gửi gói tin tiếp theo. Nếu nhận được NACK hoặc không nhận được phản hồi trong một khoảng thời gian nhất định (timeout), bên gửi sẽ gửi lại gói dữ liệu trước đó.
  • Lặp lại quy trình: Quy trình này lặp lại cho đến khi tất cả dữ liệu được truyền thành công.

Bên nhận sau khi nhận gói tin thực hiện công việc kiểm soát luồng dữ liệu:

  • Flow control (kiểm soát luồng): cơ chế ngăn chặn bên gửi gửi quá nhiều dữ liệu mà bên nhận không thể xử lý kịp thời. Nó đảm bảo rằng bên gửi chỉ gửi lượng dữ liệu mà bên nhận có thể xử lý, tránh làm tràn bộ đệm của bên nhận và gây mất mát dữ liệu. Trong mô hình Stop and wait ARQ, kiểm soát luồng thực hiện thông qua việc bên gửi chờ đợi một ACK cho mỗi gói tin trước khi gửi gói tiếp theo.
  • After Consumption (sau tiêu thụ): chỉ việc bên nhận chỉ gửi một tín hiệu ACK sau khi nó đã xử lý (tiêu thụ) gói tin dữ liệu nhận được. Điều này đảm bảo rằng bên nhận đã đủ không gian và tài nguyên để tiếp nhận và xử lý gói tin dữ liệu mới trước khi báo hiệu cho bên gửi rằng họ đã sẵn sàng nhận thêm dữ liệu.

III. Các trường hợp lỗi và xử lý

1. Các trường hợp lỗi

Trong kỹ thuật Stop and wait ARQ, có ba trường hợp lỗi chính có thể xảy ra:

  • Lost Data: dữ liệu được gửi từ bên gửi nhưng không bao giờ đến được bên nhận do các vấn đề như sự cố trên đường truyền, lỗi phần cứng, hoặc mất mạng.
  • Lost Acknowledgement: Trong tình huống này, dữ liệu đến bên nhận thành công, nhưng ACK mà bên nhận gửi trở lại bị mất trên đường truyền.
  • Delayed Acknowledgement/Data: Trường hợp này xảy ra khi có sự chậm trễ trong việc truyền ACK hoặc dữ liệu, khiến chúng đến muộn hơn so với thời gian dự kiến.

2. Xử lý lỗi

2.1. Xử lý Lost Data (Dữ liệu bị mất)

Khi dữ liệu bị mất, Timer được sử dụng để xác định khoảng thời gian chờ phản hồi từ bên nhận. Nếu không nhận được ACK trong khoảng thời gian đã định (khi Timer hết hạn), bên gửi sẽ giả định rằng dữ liệu đã bị mất và sẽ tự động gửi lại dữ liệu đó. Việc sử dụng số thứ tự (Sequence Number) cho dữ liệu giúp bên gửi nhận biết đó là dữ liệu mới hay là dữ liệu được gửi lại.

2.2. Xử lý Lost ACK (ACK bị mất)

Tương tự như trường hợp mất dữ liệu, khi ACK bị mất, Timer sẽ hết hạn và kích hoạt để bên gửi gửi lại dữ liệu. Tuy nhiên, để phòng tránh việc gửi lại dữ liệu không cần thiết (nếu dữ liệu ban đầu thực sự đã đến được bên nhận), Sequence Number cho ACK cũng quan trọng, giúp bên gửi nhận biết được phản hồi cho dữ liệu cụ thể nào.

2.3. Xử lý Delayed ACK (ACK bị trễ)

Trong trường hợp ACK bị trễ, có thể xảy ra tình huống bên gửi đã gửi lại dữ liệu do nghĩ rằng nó đã bị mất. Để ngăn chặn việc này, việc sử dụng số thứ tự cho cả dữ liệu và ACK là rất quan trọng, giúp đảm bảo rằng mỗi bản sao của dữ liệu có thể được phân biệt và giúp bên nhận xác định xem gói dữ liệu đã được xử lý trước đó hay chưa. Nếu nhận được dữ liệu trùng lặp, bên nhận sẽ bỏ qua và không xử lý nó.

IV. Ưu, nhược điểm của Stop and wait ARQ

1. Ưu điểm

  • Đơn giản và dễ triển khai: Do cơ chế hoạt động đơn giản, việc triển khai Stop and wait ARQ không đòi hỏi phần cứng phức tạp hay thuật toán lập trình phức tạp.
  • Độ tin cậy cao: Kỹ thuật này đảm bảo rằng mỗi gói tin đều được xác nhận trước khi gửi gói tiếp theo, giúp đảm bảo rằng không có gói tin nào bị mất mà không được phát hiện.
  • Phù hợp với các kênh truyền có băng thông thấp: Kỹ thuật này hoạt động tốt trên các kênh truyền mà việc truyền dữ liệu không thường xuyên và băng thông là một hạn chế.
  • Khả năng kiểm soát luồng: Kỹ thuật này cung cấp khả năng kiểm soát luồng một cách tự nhiên vì người gửi không thể gửi gói tin tiếp theo cho đến khi nhận được ACK cho gói tin hiện tại.

2. Nhược điểm

  • Hiệu suất thấp: Kỹ thuật này có hiệu suất kém trên các kênh truyền có băng thông cao hoặc độ trễ truyền lớn vì phải chờ đợi ACK cho mỗi gói tin trước khi gửi gói tiếp theo.
  • Sử dụng kém hiệu quả băng thông: Vì người gửi phải chờ ACK sau mỗi gói tin, phần lớn thời gian kênh truyền không được sử dụng.
  • Tăng độ trễ tổng thể: Việc phải chờ đợi xác nhận cho mỗi gói tin gửi đi có thể làm tăng độ trễ tổng thể trong truyền thông.

V. Minh họa kỹ thuật Stop and wait ARQ

Chúng ta sẽ thực hiện minh họa kỹ thuật Stop and wait ARQ bằng chương trình Python, có thể tạo một ví dụ đơn giản với hai hàm: sender() cho người gửi (sender) và receiver() cho người nhận (receiver).

import time
import threading # Biến toàn cục để mô phỏng việc gửi và nhận dữ liệu qua mạng
network_buffer = None
ack_received = threading.Event() def sender(data_packets): global network_buffer for sequence_number, packet in enumerate(data_packets): while True: print(f"Sender: Gửi gói tin {sequence_number}") network_buffer = (sequence_number, packet) # Gửi gói tin ack_received.clear() # Reset event cho ACK ack_received.wait(timeout=2) # Đợi ACK với timeout if ack_received.is_set(): print(f"Sender: Nhận được ACK cho gói tin {sequence_number}") break else: print(f"Sender: Không nhận được ACK, gửi lại gói tin {sequence_number}") print("Sender: Hoàn thành việc gửi tất cả gói tin.") def receiver(): global network_buffer while True: if network_buffer: sequence_number, packet = network_buffer print(f"Receiver: Nhận được gói tin {sequence_number}") time.sleep(1) # Mô phỏng việc xử lý gói tin print(f"Receiver: Gửi ACK cho gói tin {sequence_number}") ack_received.set() # Gửi ACK network_buffer = None # Xóa buffer # Tạo và khởi chạy các luồng
data_to_send = ['packet1', 'packet2', 'packet3']
receiver_thread = threading.Thread(target=receiver)
sender_thread = threading.Thread(target=sender, args=(data_to_send,)) receiver_thread.start()
sender_thread.start() sender_thread.join()
receiver_thread.join()

Chương trình mô phỏng một kênh truyền thông đơn giản qua việc sử dụng một biến network_buffer để truyền dữ liệu từ sender đến receiver. Sự kiện ack_received được sử dụng để đợi và thông báo ACK từ receiver đến sender. Mỗi gói tin được gửi kèm với một số thứ tự.

Trong ví dụ này, chúng ta giả định rằng không có lỗi truyền thông và mạng là đáng tin cậy để tập trung vào cơ chế ARQ. Khuyến khích bạn đọc tiếp tục xây dựng các trường hợp lỗi minh họa cho các lỗi trong quá trình truyền được đề cập phía trên.

Tài liệu tham khảo

Bình luận

Bài viết tương tự

- vừa được xem lúc

VxLAN - Công nghệ ảo hóa DC

Trong bài viết trước về CDN Tản mạn CDN và một số công nghệ xoay quanh CDN, tôi có đề cập đến VxLAN và mô hình Leaf-Spine. Nào bắt đầu nhé.

0 0 43

- vừa được xem lúc

Tản mạn CDN và một số công nghệ xoay quanh CDN

Như cái tiêu đề, tôi lưu lại một số thứ hay ho về CDN để sau mà quên thì còn có cái mà đọc. Sờ lại một chút về khái niệm CDN cho đỡ bỡ ngỡ... Mục đích CDN. Do vậy, CDN phục vụ một số mục đích chính sau:. . Cải thiện thời gian tải trang web --> Đây là mục đích lớn nhất của CDN.

0 0 45

- vừa được xem lúc

Hướng dẫn cấu hình PC thành public server

Chào mọi người,. Mình đã từng gặp trường hợp phía FE không thể access vào server công ty (vì authen, policy ,.

0 0 1.4k

- vừa được xem lúc

Phân biệt Router, Switch và Hub (Mạng máy tính)

Mục tiêu. Dạo qua một vòng trên Google và qua những câu hỏi mình hay bị mọi người xung quanh "vấn đáp nhanh", ngày hôm nay mình muốn viết blog này để có thể phần nào làm rõ một chút cho các bạn về 3 t

0 0 52

- vừa được xem lúc

Bạn có muốn trở thành Admin của một Server game không?

Mở đầu. .

0 0 58

- vừa được xem lúc

Hướng dẫn NAT port server ra Internet

Hướng dẫn NAT port để có thể sử dụng các dịch vụ trên server từ xa. Internet <---------------> Router <----------------> Server.

0 0 43