Chức năng cơ bản của tầng liên kết dữ liệu
Tầng liên kết dữ liệu đảm nhận các chức năng sau: Cung cấp một giao diện được định nghĩa chuẩn cho các dịch vụ cung cấp cho tầng mạng. Xử lý lỗi đường truyền. Điều khiển luồng dữ liệu nhờ đó bên truyền nhanh không làm tràn dữ liệu bên ...
Tầng liên kết dữ liệu đảm nhận các chức năng sau:
- Cung cấp một giao diện được định nghĩa chuẩn cho các dịch vụ cung cấp cho tầng mạng.
- Xử lý lỗi đường truyền.
- Điều khiển luồng dữ liệu nhờ đó bên truyền nhanh không làm tràn dữ liệu bên nhận chậm
Nhiệm vụ của tầng liên kết dữ liệu là cung cấp các dịch vụ cho tầng mạng. Dịch vụ chính của tầng liên kết dữ liệu là truyền tải dữ liệu nhận được từ tầng mạng trên máy gởi đến tầng mạng trên máy nhận.
Để làm được điều này, tầng liên kết dữ liệu lấy các gói tin (Packet) mà nó nhận được từ tầng mạng và gói chúng vào trong các khung (frame) để truyền đi. Mỗi khung chứa phần tiêu đề (Header), thông tin cần truyền đi (Payload field) và thông tin theo dõi khác (Trailer).
Có 3 dịch vụ cơ bản mà tầng liên kết dữ liệu thường cung cấp là:
- Dịch vụ không nối kết không báo nhận (unacknowledged connectionless service), thường được sử dụng trong mạng LAN.
- Dịch vụ không nối kết có báo nhận (acknowledged connectionless service), thường dùng cho mạng không dây.
- Dịch vụ nối kết định hướng có báo nhận (acknowledged connection-oriented service), thường dùng trong mạng WANs.
Để có thể truyền tải được dữ liệu nhận từ tầng mạng đến máy nhận, tầng liên kết dữ liệu phải sử dụng các dịch vụ được cung cấp bởi tầng vật lý. Tất cả những gì tầng vật lý thực hiện là nhận một chuỗi các bits thô và cố gắng truyền chúng đến máy đích. Tầng vật lý không đảm bảo về độ tin cậy của các bits được truyền đi. Số lượng bits đến nơi nhận có thể nhiều, ít, hay bằng số bits đã gởi đi, thậm chí giá trị của chúng cũng có thể khác với giá trị mà chúng đã được gởi đi. Chính vì thế mà tầng liên kết dữ liệu phải dò tìm và xử lý các lỗi trên dữ liệu nhận được.
Như đã nói ở phần trên, đơn vị truyền tin của tầng liên kết dữ liệu là các khung. Vấn đề đặt ra là làm sao bên nhận biết được điểm bắt đầu và điểm kết thúc của khung. Chính vì vậy mà tầng liên kết dữ liệu cần thiết phải qui định khuôn dạng của khung mà mình sử dụng. Có 3 phương pháp để định khung phổ biến sau:
- Đếm ký tự (Character count)
- Sử dụng các bytes làm cờ hiệu và các bytes độn (Flag byte with byte stuffing)
- Sử dụng cờ bắt đầu và kết thúc khung cùng với các bit độn (Starting and ending flags with bit stuffing)
Phương pháp đếm ký tự (Character Count)
Phương pháp này sử dụng một trường trong phần tiêu đề để mô tả số lượng các ký tự có trong khung. Bất lợi của phương pháp này là nếu một ký tự đếm của một khung nào đó bị lỗi sẽ làm cho các khung phía sau không thể xác định được. Phương pháp này vì thế mà ít được sử dụng.
Phương pháp sử dụng byte làm cờ và các byte độn (Flag byte with byte stuffing)
Phương pháp này sử dụng một byte có giá trị đặc biệt để làm cờ hiệu (flag byte) đánh dấu điểm bắt đầu và kết thúc của khung. Một vấn đề phát sinh trong phương pháp này là, trong dữ liệu có thể chứa byte có giá trị của cờ hiệu. Điều này sẽ làm gẩy khung. Để giải quyết vấn đề này, người ta đưa vào phía trước byte dữ liệu có giá trị của cờ hiệu một byte đặc biệc gọi là byte ESC. Bên nhận khi nhận được byte ESC theo sau là giá trị của cờ hiệu thì sẽ bỏ đi ký tự ESC đồng thời biết đây chưa phải là điểm kết thúc của khung. Tương tự, nếu trong dữ liệu có chứa ký tự ESC thì ta cũng đưa thêm vào phía trước nó một ký tự ESC. Kỹ thuật này được gọi là ký tự độn (character stuffing).
Yếu điểm của phương pháp này là nó dựa trên ký tự dạng 8 bits vì thế sẽ không sử dụng được trong các hệ thống sử dụng chuẩn mã 16 bits như Unicode chẳng hạn.
Sử dụng cờ bắt đầu và kết thúc khung cùng với các bit độn (Starting and ending flags with bit stuffing).
Phương pháp này sử dụng mẫu bit đặc biệt, 01111110, để làm cờ đánh dấu điểm bắt đầu và kết thúc khung. Khi bên gởi phát hiện có 5 bits 1 liên tiếp trong dữ liệu gởi đi, nó sẽ thêm vào bit 0. Ngược lại, nếu bên nhận phát hiện 5 bits liên tiếp và theo sau bằng một bit 0, nó sẽ loại bỏ bit 0 ra khỏi dữ liệu. Nhờ thế cờ sẽ không xuất hiện trong dữ liệu gởi.
H4.4 (a) Dữ liệu gốc,
(b)Dữ liệu chuyển lên đường truyền,
(c) Dữ liệu nhận sau khi loại bỏ các bit độn.
Một vấn đề khác cần phải xem xét là cách nào để đảm bảo rằng toàn bộ các khung đã được phân phát đến tầng mạng và được phân phát theo đúng trình tự chúng đã được gởi. Điều này không cần quan tâm trong dịch vụ không nối kết không báo nhận. Tuy nhiên nó cần phải được đảm bảo trong dịch vụ nối kết định hướng.
Cách thường được dùng để đảm bảo việc phân phát tin cậy là cung cấp cho người gởi một vài phản hồi từ người nhận về tình trạng nhận khung. Hệ thống sẽ định nghĩa một khung đặc biệt, gọi là khung báo nhận (acknowledgement), để cho người nhận thông báo cho người gởi tình trạng của dữ liệu nhận là tốt hay xấu. Nếu người gởi nhận được một báo hiệu tốt về gói tin, người gởi an tâm rằng gói tin đã được phân phát một cách an toàn. Ngược lại, một khung báo không nhận (unacknowledgement) báo hiệu rằng có một số vấn đề gì đó đối với khung nhận và nó cần phải được truyền lại.
Một khả năng khác có thể xảy ra là khung gởi đi hoàn toàn bị mất không đến được người nhận. Trong trường hợp này sẽ không có một khung báo nhận nào được gởi về cho người gởi, làm cho người gởi rơi vào trạng thái chờ đợi vĩnh viễn.
Để giải quyết vấn đề này, người ta thêm vào tầng liên kết dữ liệu một bộ đếm thời gian (timer). Khi bên gởi truyền một khung đi, nó sẽ thiết lập bộ đếm thời gian. Bộ đếm thời gian sẽ không còn hiệu lực (time-out) sau một khoảng thời đủ lớn để khung được truyền đến người nhận, xử lý ở đó, và khung báo nhận đến được người gởi. Thông thường nếu khung được nhận tốt, khung báo nhận sẽ trở về người gởi trước thời gian qui định. Khi đó bộ đếm thời gian sẽ bị hủy.
Tuy nhiên, nếu khung báo nhận bị mất, bộ đếm thời gian sẽ trôi qua, báo hiệu cho người gởi về vấn đề phát sinh. Giải pháp trong trường hợp này là bên gởi gởi lại khung. Như thế khung được truyền đi nhiều lần có thể làm cho khung được gởi lên tầng mạng nhiều hơn một lần. Để phòng ngừa trường hợp này, người ta gán vào mỗi khung gởi đi một Số thứ tự (sequence number), nhờ đó bên nhận phân biệt được các khung được truyền lại.
Một vấn đề thiết kế quan trọng khác cần phải xem xét trong tầng liên kết dữ liệu là sự khác biệt về tốc độ truyền / nhận dữ liệu của bên truyền và bên nhận. Có hai tiếp cận để giải quyết vấn đề này.
Tiếp cận điều khiển luồng dựa trên phản hồi (feedback based flow control): Người nhận gởi thông tin về cho người gởi cho phép người gởi gởi thêm dữ liệu, cũng như báo với người gởi những gì mà người nhận đang làm.
Tiếp cận điều khiển luồng dựa trên tần số (rate based flow control): Trong giao thức truyền tin cài sẵn cơ chế giới hạn tần suất mà người gởi có thể truyền tin.