Tải bản đầy đủ (.docx) (17 trang)

Báo cáo HTVT go back n + code ben duoi

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (716.86 KB, 17 trang )

Tìm hiểu hoạt động của một số cơ chế tự động truyền lại
Go-Back-N ARQ tại lớp data-link control và chứng minh
sự hiệu quả của các cơ chế+code phía dưới
Thực hiện:

Giáo viên hướng dẫn: TS. Nguyễn Thành Chuyên

Abstract—Bài báo cáo về giao thức Go-Back-N
repeat ARQ trong lớp Data-link control. Trong bài
này tập trung tìm hiểu về giao thức, mô phỏng và
đánh giá hiệu quả của các cơ chế của giao thức,
đồng thời so sánh hiệu quả của giao thức so với các
giao thức khác.
Keywords: ARQ, Go-Back-N, data-link, ACK,
NACK, error detecting codes
I. GIỚI THIỆU MÔ HÌNH OSI VÀ TẦNG DATA
LINK
Mô hình OSI (Open Systems Interconnection
Reference Model, viết ngắn là OSI Model hoặc OSI
Reference Model) – tạm dịch là Mô hình tham chiếu kết
nối các hệ thống mở – là một thiết kế dựa vào nguyên
lý tầng cấp, bao gồm 7 lớp mạng. Mỗi tầng sẽ có nhiệm
vụ và chức năng riêng giúp tín hiệu được truyền đi luôn
được bảo mật tuyệt đối cũng như nhanh chóng và thuận
tiện hơn. Mô hình này được phát triển thành một phần
trong kế hoạch kết nối các hệ thống mở (Open Systems
Interconnection) do ISO và IUT-T khởi xướng. Nó còn
được gọi là Mô hình bảy tầng của OSI [1].

thông tin trên mạng, đóng gói và phân pháp các gói tin.
Ngoài ra, lớp vật lý còn cung cấp các chuẩn kết nối


trong quá trình truyền dữ liệu. Nó đáp ứng các yêu cầu
phục vụ g1ửi tới tầng vật lý. Tầng liên kết dữ liệu cung
cấp các phương tiện chức năng và thủ tục để truyền dữ
liệu giữa các thực thể mạng và có thể cung cấp phương
tiện để phát hiện và có thể sữa các lỗi có thể nảy sinh tại
tầng vật lý. Tầng liên kết dữ liệu cung cấp sự phối hợp
giữa các thiết bị để không xảy ra xung đột.
Thông tin cần ít nhất hai thiết bị cùng làm việc, một
gởi và một thu. Quá trình này luôn cần được kiểm soát
điều phối để có được quá trình trao đổi tốt nhất. Kiểm
soát liên kết dữ liệu là dịch vụ được cung cấp bởi tầng
liên kết dữ liệu để cung cấp truyền dữ liệu đáng tin cậy
trên phương tiện vật lý. Một chức năng quan trọng khác
trong tầng kết nối dữ liệu là kiểm soát lưu lượng và
kiểm soát lỗi.

Hình 2: Cấu trúc tầng Data link

Hạng mục đường dây (line discipline): điều phối các
hệ thống kết nối, xác định thiết bị nào được phát và
thiết bị nào được thu.

Hình 1: Mô hình OSI

Tầng liên kết dữ liệu (Data Link Layer) là tầng thứ
2 trong mô hình bảy tầng OSI, được thể hiện trong Hình
1. Nhiệm vụ của lớp liên kết là xác định cơ chế truy cập

Kiểm soát lưu lượng (flow control): điều phối lượng
thông tin có thể được truyền trước khi nhận được tin

chấp nhận. Đồng thời cũng cung cấp tín hiệu chấp nhận
từ máy thu, kết nối với quá trình kiểm soát lỗi.
Kiểm tra lỗi tức là phát hiện và sửa lỗi (error
control): Cho phép máy thu báo cho máy phát về các

1


bản tin bị mất hay bị hỏng nhằm điều phối việc truyền
lại dữ liệu của máy phát.
II. TỔNG QUAN LỚP KIỂM TRA LỖI
(ERROR CONTROL)
Trong lớp kết nối dữ liệu, từ kiểm tra lỗi ban đầu được
hiểu là các phương pháp phát hiện và truyền lại dữ liệu.
ARQ: Automatic Repeat Request
Sửa lỗi trong lớp kết nối dữ liệu được thiết lập rất
đơn giản: Nếu phát hiện lỗi khi truyền thì bên thu gởi
về tín hiệu không xác nhận NAK (negative
acknowledgment) và frame được gởi lại. Quá trình này
được gọi là yêu cầu tự động lặp lại (ARQ).
Sửa lỗi trong lớp kết nối dữ liệu dùng cơ sở yêu cầu
tự động lặp lại (ARQ), tức là việc truyền lại dữ liệu
trong ba trường hợp: frame bị hỏng, frame bị thất lạc,
và tín hiệu chấp nhận bị thất lạc.

Hình 3: Cấu trúc Error Control

Stop and Wait ARQ: Là dạng điều khiển lưu lượng
truyền dạng ngừng và chờ được mở rộng để có thể
truyền dữ liệu trong trường hợp frame gởi đi bị thất lạc

hay bị hỏng.
Sliding Window ARQ: mỗi phần của truyền (các gói
trong các lớp liên kết dữ liệu) được gán một số thứ tự
liên tiếp duy nhất và người nhận sử dụng các số để đặt
các gói nhận theo đúng thứ tự, loại bỏ các gói trùng lặp
và xác định các gói bị thiếu. Có nhiều cơ chế dùng để
kiểm tra lỗi khi truyền dữ liệu liên tục, có hai giao thức
thông dụng là: go-back-n ARQ và selective-reject ARQ,
cả hai phương pháp này đều dựa trên phương pháp điều
khiển lưu lượng dùng cửa sổ trượt.
III. CƠ CHẾ HOẠT ĐỘNG SLIDNG WINDOW ARQ
Với cơ chế phát của Sliding Window ARQ, phía
phát sẽ được phát nhiều hơn một khung thông tin trước
khi nhận được báo ACK nhận từ phía thu. Số khung
thông tin cực đại mà phía phát có thể phát (ký hiệu là
W) được gọi là kích thước cửa sổ. Mỗi khi phát xong
một khung thông tin, phía phát giảm kích thước cửa sổ
đi 1, khi kích thước cửa sổ bằng 0, phía phát sẽ không

2

được phát thêm khung thông tin nào. Mỗi khi phía thu
nhận được một khung thông tin đúng và xử lý xong,
phía thu sẽ gửi lại một báo nhận ACK cho phía phát.
Khi nhận được báo nhận này, phía phát sẽ tăng kích
thước cửa sổ W lên 1.
Để có thể phân biệt các khung trên đường truyền, các
khung cần được đánh số thứ tự. Nếu dùng k bit để đánh
số thì tổng số khung được đánh số sẽ là (từ 0 đến ) và
do đó, kích thước cửa sổ tối đa Wmax = (về mặt lý

thuyết).
Ví dụ:
Sử dụng 3 bit để đánh số thứ tự cho các khung thông
tin. Lúc này kích thước cửa sổ cực đại sẽ là 7.
Quan sát sơ đồ mô tả trên hình 4 dưới đây:
Tại thời điểm ban đâu, cả phía phát và thu đều có kích
thước cửa sổ là W=7. Sau khi phía phát đã phát được ba
khung (F0, F1, F2) và chưa nhận được ACK, phía phát
giảm kích thước cửa sổ xuống còn W=4 thể hiện dữ liệu
còn lại trong khung là F3 đến F6.
Ở phía thu, sau khi đã nhận đúng và xử lý xong ba
khung F0, F1 và F2 thì sẽ gửi lại ACK3 cho phía phát.
ACK3 nhằm ám chỉ rằng: “Phía thu đã nhận và xử lý
xong các khung cho đến F2 và phía thu đang sẵn sàng
nhận khung 3”. Phía thu đồng thời tăng kích thước cửa
sổ bên thu lên 7, bao các khung từ F3 cho đến F1. Phía
phát sau khi nhận được ACK3 sẽ tăng kích thước cửa sổ
thêm 3 đơn vị. Lúc này cửa sổ phía phát W = 7 và bao
các khung từ F3 đến F1 và lấy thêm khung 3 dữ liệu kế
tiếp F7 đến F1. Giả sử lúc này phía phát thực hiện phát
các khung từ F3 đến F6. Sau khi phát, phía phát sẽ giảm
kích thước cửa sổ đi 4 (W = 3), lúc này cửa sổ chỉ còn
bao các khung F7, F0 và F1.
Phía thu gửi lại ACK4, báo rằng nó đã nhận và xử lý
xong khung F3, ACK4 và phía phát được phép phát tối
đa là 7 khung bắt đầu từ F4. Tuy nhiên khi ACK4 về
đến phía phát thì phía phát đã thực hiện phát các khung
F4, F5 và F6 rồi, như vậy, phía phát sẽ chỉ còn phát



được

tối

đa



4

khung

bắt

đầu

từ

F7.

time-out, phía phát sẽ phải phát lại khung 2 (và tất cả
các khung sau đó).

Hình 5: Trường hợp mất ACK

Hình 4: Sơ đồ mô tả hoạt động của Sliding Window ARQ

Trong trường hợp lý tưởng (không có lỗi xảy ra) thì cơ
chế cửa sổ trượt đảm bảo số khung thông tin từ phía
phát đến phía thu không vượt quá kích thước cửa sổ.

Khi có lỗi xảy ra, việc truyền lại các khung lỗi của cơ
chế cửa sổ trượt được thực hiện theo hai cách khác
nhau:
Go-back-N: phía phát sẽ thực hiện phát lại khung
thông tin bị sai và tất cả các khung thông tin khác đã
được truyền, tính từ khung bị sai.
Selective repeat: phía phát sẽ chỉ phát lại các khung
thông tin bị sai.

+ Khung NAK bị lỗi – trong trường hợp NAK bị lỗi,
nghĩa là khung 2 bị lỗi, lúc này phía thu sẽ không nhận
thêm một khung nào sau khung 2 (và cũng sẽ không gửi
báo nhận). Với trường hợp này phía phát bắt buộc phải
chờ đến time-out và thực hiện phát lại khung 2.
Mất Frame dữ liệu:
Giao thức cửa sổ trượt đòi hỏi các frame dữ liệu phải
được chuyển đi tuần tự. Nếu một trong số các frame
này bị nhiễm nhiễu và bị thất lạc trong khi truyền, thì
frame đến sau sẽ bị máy thu loại. Máy thu kiểm tra số
nhận dạng của mỗi frame, phát hiện ra là một số frame
đã bị bỏ qua, và gởi về tín hiệu NAK cho frame thất lạc
đầu tiên. Frame NAK thông báo yêu cầu gởi lại mà
không chỉ ra là frame đã bị thất lạc hay hỏng. Thiết vị
phát sẽ phát lại frame do NAK yêu cầu, cùng các frame
đã được chuyển đi sau frame vừa thất lạc.

IV. PHÂN TÍCH CƠ CHẾ PHÁT LẠI GO-BACK-N
ARQ
Trong phương pháp cửa sổ trượt go-back-n ARQ, nếu
một frame bị thất lạc hay hỏng, tất cả các frame được

phát lại kể từ tín hiệu xác nhận cuối cùng được gửi đi.
Có 3 dạng phát lại: Hư Frame data, mất Frame data,
mất Frame Khung
Mất ACK: Khung ACK bị lỗi – ACK bị lỗi có thể xảy
ra một trong hai trường hợp:
+ Phía thu nhận được khung 2 và gửi ACK3 về phía
phát và ACK này bị mất trên đường truyền. Giả sử
trước khi time-out của khung 2 xảy ra, phía phát nhận
được ACK5 thì phía phát hiểu rằng khung 2, khung 3,
khung 4 đã được nhận đúng. Người ta nói cơ chế của
Go-back-N sử dụng cummulative ACK (nghĩa là các
ACK sau cũng đồng thời báo nhận cho các khung trước
đó). Nếu trong khoảng thời gian time-out của khung 2,
phía phát không nhận được ACKn (n>2) nào cả thì sau

Hình 6: Trường hợp mất frame data

Trong hình trên, dữ liệu 0 và 1 thu được nhưng dữ liệu
2 thì bị thất lạc. Frame kế tiếp sẽ đến máy thu là frame
3. Máy thu đang chờ frame 2 nên frame 3 bị xem là lỗi,
bị loại và gởi về thông báo NAK 2, cho biết các frame 0
và 1 đã được chấp nhận nhưng frame 2 thì bị sai (bị thất
lạc trong trường hợp này). Trong thí dụ trên, do máy
phát đã phát dữ liệu 4 trước khi nhận được NAK 2, dữ

3


liệu 4 đến đích nhưng bị loại. Một khi máy phát nhận
được tín hiệu NAK 2, thì chuyển tất cả các frame còn bị

kẹt lại (2, 3 và 4).

NAK có hai ý nghĩa:

Trong trường hợp phía thu có khả năng xử lý W khung
thông tin thì không cần bộ đệm. Phía thu chỉ nhận và xử
lý thông tin theo đúng thứ tự (dựa trên số thứ tự đánh
trên các khung). Phía thu chuyển các gói thông tin lên
lớp cao hơn theo thứ tự. Phía thu sẽ không nhận khung
i+1 nếu chưa nhận được khung i. Điều này là nguyên
nhân khiến phía thu không cần phải có bộ đệm Phía
phát phải lưu tối đa là W khung thông tin trong bộ đệm
để chờ ACK.

(1) một xác nhận về tất cả các frame nhận được trước
khi có frame bị hỏng

Hiệu suất của phương pháp Go-back-N ARQ, so sánh
với các phương pháp khác

(2) tín hiệu không xác nhận đối với frame hiện tại.

Hiệu suất của cơ chế ARQ được tính bằng tỷ lệ tốc
độ truyền nhận thực tế () so với lý thuyết (R). Với Reff
được tính theo công thức [2]:

Hư Frame:
Việc gì xảy ra nếu các frame 0, 1, 2 và 3 đã được gửi đi,
nhưng tín hiệu xác nhận đầu tiên lại là NAK 3?


Nếu NAK đầu tiên là NAK 3, có nghĩa là các frame dữ
liệu 0, 1, và 2 đã được nhận tốt. Chỉ cần gửi lại frame số
3.
Ngay vừa khi máy thu phát hiện lỗi, thì máy ngừng tiếp
nhận các frame cho đến khi frame bị hỏng được thay
thế xong. Trong trường hợp này thì dữ liệu 3 xuất hiện
hỏng và bị loại, cùng các dữ liệu 4. Dữ liệu 0, 1 và 2, đã
được nhận trước khi có frame bị hỏng, đã được chấp
nhận, bằng cách gởi về máy phát frame NAK 3. Như
thế cần gởi lại các frame 3 và 4.
Hình vẽ dưới đây cho một thí dụ trong đó 6 frame được
gởi đi trước khi phát hiện ra lỗi ở frame 3. Trường hợp
này máy thu gởi về tín hiệu ACK 3 cho biết các frame
0, 1 và 2 đã được chấp nhận. Trong hình thì ACK 3 đã
được gửi trước khi dữ liệu 3 đến. Phát hiện lỗi tại frame
3, tín hiệu NAK được gởi tức thì và các frame 4 và 5 bị
loại khi chúng đến. Thiết bị phát gởi lại cả ba frame (3,
4 và 5) do từ xác nhận trước đó, và quá trình tiếp tục.
Máy thu đã loại các frame 4 và 5 (cùng các frame tiếp
theo) cho đến khi nhận tốt được frame 3.

(1)
Với E[] thời gian truyền trung bình, là số bit dữ
liệu, là số bit phát hiện lỗi.

Hình 7: Biểu đồ thời gian quá trình truyền tin cơ chế ARQ

Nếu không có lỗi xảy ra thì giá trị E[] = . Giá trị t có
thể thấy được qua hình là:
(2)

Với là số bit của bản tin ACK, còn R là băng thông
hệ thống. Áp dụng cách tính từ công thức (1) ta tìm
được hiệu suất của các cơ chế phát lại như sau:

Hình 8: Biểu đồ thời gian quá trình truyền tin Stop and Wait

Với cơ chế Stop and Wait, coi = . Ta có:
Hình 6: Trường hợp hư frame data
Một số chú ý của cơ chế hoạt động ARQ Go-back-N

4


Ta có đồ thị như hình 9.
là xác suất việc truyền nhân thông tin bị lỗi 1 frame

(3)
Với cơ chế Go-back-N ta tìm được:

(4)
Với cơ chế Selective repeat ta tìm được:

Hình 9 cho thấy khi tỷ lệ lỗi bit tăng lên thì tất cả
các cơ chế phát lại hiển nhiên sẽ giảm hiệu suất truyền
tải.
Cơ chế SW là cơ chế có hiệu nhất, nhưng với giá trị
thời gian frame đi trên kênh truyền t prop càng nhỏ thì
hiệu suất càng cao. Giá trị W = 3 và W = 11 đại diện
cho tỷ lệ tprop và tf với (W-1) = 2 tprop / tf . Giá trị N này
tương đương với kích cửa sổ trong giao thức GBN và

SR. Cơ chế GBN cũng cho thấy giá trị W càng nhỏ thì
hiệu suất càng ít bị ảnh hưởng bởi BER.Và chắc chắn
ƞSR là lớn nhất trong mọi trường hợp.

(5)
1-=exp(-p x )
Từ các công thức (3), (4), (5) ta có thể so sánh được
hiệu suất của ba cơ chế phát lại với tỷ lệ lỗi bit. Đồ thị
mô phỏng lại quan hệ hiệu suất và p của kênh truyền
được vẽ bằng matlab với giá trị kích thước = 1250
byte= 10000 bits, , R=1Mbps, với p= {0 ;;},W=11.

Bảng 1: Hiệu suất ba cách truyền tin ARQ[3].

Hình 9: Quan hệ các cơ chế ARQ với tỷ lệ lỗi bit

Sơ đồ thuật toán cơ chế Go-back-N ARQ
Để làm rõ hơn cơ chế phát Go-back-N ta xây dựng
thuật toán điều khiển cho bên phát và bên nhận. Mô
hình thuật toán bên gửi được mô tả trong hình.

Hình 3: Mô hình hóa cơ chế xử lý

Hình 11: Sơ đồ thuật toán cơ chế Go-back-N bên gửi (gửi)

5


Hình 12: Sơ đồ thuật toán cơ chế Go-back-N bên gửi (nhận)


Cơ chế xử lý của cả bên nhận và bên gửi đều đặt
trong một vòng lặp vô hạn, đợi một sự kiện diễn ra và
sử lý yêu càu theo sự kiện đó. Với bên gửi, cần xử lý
các loại sự kiện: tới từ lớp network, lớp physical và sự
kiện time-out có thể thấy trong sơ đồ thuật toán hình 11
và hình 12.
Hình 13: Sơ đồ thuật toán cơ chế Go-back-N bên
nhận
Bên nhận chỉ có duy nhất nguồn sự kiện tới từ lớp
Physical với hai loại sự kiện: FrameArrival và
CkSumError có thể thấy trong hình 13
Các thành phần trong sơ đồ thuật toán chính là các
trường hợp có thể gặp của cơ chế Go-back-N. Ở bên
phát ta thấy có 4 biểu đồ chính là các sự kiện tới từ lớp
khác.
Nhánh thứ nhất, khi có yêu cầu gửi từ lơp network
bên phát sẽ tạo một frame, lưu vào bộ đệm rồi gửi
frame đi, đồng thời bật timer tương ứng với thứ tự
frame lên.
Nhánh thứ hai, khi nhận được frame truyền tới từ
lớp physical. Lúc này sẽ rẽ nhánh ra hai trường hợp
khác: nếu bản tin nhận được là NAK và nằm trong cửa
sổ gửi thì gửi lại tất cả các frame trong window nếu
nhận được một frame ACK có số thứ tự cũng nằm trong

6


cửa sổ gửi thì xóa bỏ bộ đệm của tất cả các frame đã
gửi và dịch vị trí cửa sổ.

Nhánh thứ ba, khi nhận được một timeout. Bên phát
sẽ gửi lại frame trong bộ đệm với số thứ tự của time-out
và khởi động lại timer cho frame đó. Lưu ý là trường
hợp này có ưu tiên xử lý thấp hơn hai trường hợp còn
lại.
Nhánh thứ tư, khi kích thước bộ đệm vượt giới hạn,
tức là chệnh lệch cạnh trên và cạnh dưới cửa sổ lớn hơn
hoặc bằng kích thước cửa sổ. Lúc này bộ đệm đã đầy và
không thể lưu thêm frame nào nữa vì thế cần báo cho
lớp network không tiếp tục gửi dữ liệu xuống.
Ở bên nhận, với sự kiện có một frame được gửi tới
và không gặp lỗi. Lúc này bên nhận kiểm tra xem frame
nhận được có đúng thứ tự hay không.
Nếu frame không đúng thứ tự tức là frame Rn trước
đó đã được gửi và bị mất gói, tiếp tục kiểm tra xem báo
lỗi cho Rn đã được gửi chưa qua biến NakSent. Nếu
chưa có báo lỗi được gửi thì gửi NAK frame cho Rn.
Sau đó tiếp tục kiểm tra xem frame nhận được có nằm
trong cửa sổ nhận không, nếu có thì lưu vào bộ đệm, rồi
trở về vòng lặp đợi sự kiện.

Hình 14: Kết quả gửi đi frames đầu tiên

Nếu frame nhận được là đúng thứ tự tức Rn = Sn
của frame thì thực hiện lưu vào bộ đệm. Bước tiếp theo
sẽ kiểm tra các bit trạng thái bộ đệm. Đi từ Rn tới vị trí
cuối bộ đệm nếu lần lượt các bit đều là 1 thì sẽ đưa các
dữ liệu tương ứng từ bộ đệm lên lớp network. Vòng lặp
khi gặp 1 bit 0 sẽ dừng việc kiểm tra bộ đệm, lúc này
giá trị mới cửa cạnh cửa sổ sẽ dịch lên bằng số lượng

packet dữ liệu đã được đưa tới lớp network.
Kết quả mô phỏng
Mô phỏng truyền 100 frames data theo cơ chế Goback-N. với kích thước cửa sổ W=7, thời gian = 7
clock, time-out = 5 clock, time-prop=3 clock, time-proc
=0 clock, .

Hình 15: Kết quả mô phỏng - xử lý lỗi mất ACK

7


Hình 16: Kết quả mô phỏng - xử lý lỗi mất frame data
P1

Hình 18: Kết quả mô phỏng - xử lý lỗi time-out P1

Hình 17: Kết quả mô phỏng - xử lý lỗi mất frame data
P2

Hình 19: Kết quả mô phỏng - xử lý lỗi time-out P2

8


V. KẾT LUẬN

Hình 20: Kết quả truyền đi frames cuối cùng
Kết quả mô phỏng thành công khi mà kết quả thu
được đúng với kết quả đã tính trước, dữ liệu được
chuyển đến đích một cách nguyên vẹn và được sửa sai

bằng cơ chế phát lại của Go-back-N. Do việc mô phỏng
chỉ mang tính kiểm tra sự truyền dữ liệu và sửa sai cũng
như chưa chọn được cơ chế để xác định time-out phù
hợp, cũng như kích thước cửa sổ phù hợp để khởi tạo
cơ chế ARQ trước khi bắt đầu truyền tải mà ta không
tiến hành việc tính hiệu suất Go-back-N tại đây.

Qua sự so sánh hiệu suất truyền tải của cơ chế Goback-N với các cơ chế ARQ khác ta kết luận rắng, cơ
chế Go-back-N cho hiệu suất tương đối so với Stop and
wait và Selective repeat. Nhưng các trường hợp tính
toán trong báo cáo này chưa thể đầy đủ và đúng cho
mọi trường hợp. Giả sử như hệ thống có kênh truyền rất
dài, hoặc có thời gian xử lý quá nhanh, hoặc kích thước
dữ liệu là quá nhỏ dẫn tới thời gian truyền frame trên
kênh truyền quá lớn so với thời gian xử lý. Điều này
dẫn tới việc kích thước cửa sổ sẽ không thể lấp đầy khe
thời gian truyền tin. Hiệu suất lúc này cũng sẽ tụt giảm
rất nhiều. Báo cáo này chưa thể nêu được vấn đề đó.
Ta cũng thấy được sự phức tạp của thuật toán xử lý
của cơ chế Go-Back-N là cơ chế phức tạp nhất trong
ARQ. Nhưng đồng thời hệ thống cũng cần ít bộ đệm
trong quá trình xử lý. Dẫn tới chi phí không quá cao. Có
lẽ cũng vì điều này mà trong các hệ thống phổ biến hiện
nay ta vẫn thường thấy cơ chế Go-Back-N.
REFERENCES
[1] />lần
cuối truy cập 8/12/2019.
[2] D. Bertsekas and R. Gallager, “Data Networks – 2th
ed,” Prentice Hall, 1992.
[3] Ralph

 
Gregory,
lần cuối
truy cập 9/12/2019.

9


Code mô phỏng hiệu suất matlab
p=[0 :10^(-7): 10^(-3)];
R=1000000;
n0=200;
na=200;
nf=10000;
t=0.1;
L=t*R/nf;
W=L+1;
t1=0.001;
L1=t1*R/nf;
W1=L1+1;
Pf=1-exp(-p.*nf);
ngbn=(1-n0/nf)*(1-Pf)./(1+Pf.*(W-1));
nsw=(1-n0/nf)*(1-Pf)./(1+na/nf+L);
ngbn1=(1-n0/nf)*(1-Pf)./(1+Pf.*(W1-1));
nsw1=(1-n0/nf)*(1-Pf)./(1+na/nf+L1);
nsr=(1-n0/nf)*(1-Pf)./1;
plot(p,nsw,'b.-',p,ngbn,'r-',p,nsr,'g--',p,nsw1,'k.-',p,ngbn1,'m-');
xlabel('p') ;
ylabel('efficiency ARQ') ;
legend ('nsw= Stop and wait|W=11',' ngbn = Go-back-N|W=11',' nsr= Selective Repeat',

'nsw= Stop and wait|W=3',' ngbn = Go-back-N|W=3');
xlim([0 5*10^(-4)]);

Code chạy trên verilog phần mềm ISE
`timescale 1ns / 1ps

module TB_HTVT;
reg clk;
integer source[0:99],destination[0:99];
integer count_s,count_d,count;
integer window[0:6],ACK[0:6];
integer size_win;
reg

mode_around,mode_stop;


integer trans[0:4],trans_v[0:4],temp_ACK;
integer i,k,t,q,stt,stt_v,x,pause_stt,temp;
reg

flag_Rx,flag_ACK,flag_NAK,start_timer;

integer value1,value2,timer;
/***************** clock **********************/
always #1 clk=~clk;
initial begin
clk=1;
end
/****************** khoi tao bien ******************/

initial begin
count<=0;
i<=1;
k<=0;
t<=0;
x<=0;
q<=0;
value1<=0;
value2<=0;
mode_around<=0;
mode_stop<=0;
size_win <= 7;

// kich thuoc cua so

count_s<=0;

//bien duyet mang source

count_d<=0;

//bien duyet mang destination

stt <=0;
pause_stt<=0;
stt_v<=0;
temp<=0;
temp_ACK<=0;
flag_Rx<=0;
flag_ACK<=0;

flag_NAK<=0;
start_timer<=0;
timer<=0;
end
initial begin
for(k=0; k< 100; k=k+1) begin //khoi tao source va destination


destination[k] =0;

//destination: 0-0

source[k] = k+1;

//source : 1-100

end
for(t=0; t< 7; t=t+1) begin //khoi tao source va destination
window[t] = source[t];
ACK[t] =t ;
end
for(t=0; t< 4; t=t+1) begin //khoi tao source va destination
trans[t] = -1;
trans_v[t]=-1 ;
end
t=0;
end
/***************** source **************************/
always @(posedge clk ) begin


//khoi phat

//ngung chuyen frames neu kich thuoc cua so vuot nguong va so luong frames vuot nguong
if(size_win<8 && size_win>0 && count_s+stt<100&&mode_stop==0) begin
$display("WINDOW [%d, %d, %d, %d, %d, %d, %d]"
,window[0],window[1],window[2],window[3],window[4],window[5],window[6]);
$display("%t Sent Frame ",$time, window[stt]);
trans[0]=window[stt];

//gui 1 frame di den moi truong
stt=stt+1;

size_win=size_win-1;

//giam kich thuoc cua so

start_timer=1;
end
end
/*****************timer source ***************************/
always @(start_timer or posedge clk) begin

//khoi phat

if (start_timer==0) timer=0;
else timer=timer+1;
if(trans_v[4]!=-1 &&timer==6||mode_stop==1)begin
$display("%t ********Phat lai Frame",$time);
pause_stt<=stt;
size_win<=7;

stt<=0;
mode_stop<=0;
mode_around<=1;


start_timer=0;
timer=0;
end
end
/********************************************/
always @(posedge flag_NAK) begin
mode_stop <=1;
trans_v[4]<=trans_v[4]-10;
end
/********************* ACK nhan **************************/
always @(posedge flag_ACK ) begin
if(mode_stop==0)begin
start_timer<=0; //thong bao cho timer source biet da nhan duoc ACK
flag_NAK<=0;
$display("%t come back ACK: ",$time,trans_v[4]);
if(trans_v[4] < temp_ACK) begin
trans_v[4]=trans_v[4] +7;
x=trans_v[4]-temp_ACK;
trans_v[4]=trans_v[4] -7;
end
else begin
x=trans_v[4]-temp_ACK;
end
temp_ACK=trans_v[4];
size_win=size_win+x;

if(count_s==93) x=0;
else begin
count_s=count_s+x;
if(count_s>93)begin
count_s=93;
x=x-(count_s-93);
end
end
stt=stt-x;
if(stt<0)begin
stt=0;


end
for(k=0; k< 7; k=k+1) begin
window[k] = source[count_s+k];
end
end
flag_ACK=0;
end
/**************** destination *********************/
always @(posedge flag_Rx) begin

//khoi nhan

if(count_d>1&&trans[4] > (destination[count_d-1]+1)) begin
trans_v[0]=ACK[stt_v]+10;
flag_Rx=0;
end
else begin

if(count_d<11)begin
t=0;
end
else begin
t=count_d-11;
end
for(q=t;q
//lui count_d neu frame duoc gui lai

if(destination[q]==trans[4])begin
stt_v= stt_v- (destination[count_d-1]-trans[4])-1;
count_d=count_d-(destination[count_d-1]-trans[4])-1;
if(stt_v<0) begin
stt_v=stt_v+7;
end
end
end
destination[count_d]=trans[4];
$display ("%t Reciver Frame %d ",$time, destination[count_d]);
count_d=count_d+1;
if(stt_v<6) begin
trans_v[0]=ACK[stt_v+1];
stt_v=stt_v+1;


end
else begin
trans_v[0]=ACK[0];
stt_v=0;

end
flag_Rx=0;
if(count_d>99)begin
#10 $finish;
end
end
end
/************* moi truong truyen di ********/
always @(posedge clk ) begin
/* value2=$random()%10+temp;
if(value2==0&&trans[2]!=-1) begin
$display("%t **********frame data lost ",$time,trans[2]);
trans[2]=1000;
temp=100;
end

*/

if(value2==20) begin
$display("%t **********frame data lost ",$time,trans[2]);
trans[2]=1000;
end
value2=value2+1;
trans[4]=trans[3];
trans[3]=trans[2];
trans[2]=trans[1];
trans[1]=trans[0];
if(trans[4]>0)begin
flag_Rx=1;
end

end
/************* moi truong tuyen ve **********/
always @(posedge clk ) begin
/* value1=$random()%5+temp;
if(value1==4&&trans_v[2]!=-1&&trans_v[3]!=-1) begin
trans_v[2]=8;


trans_v[3]=8;
end*/
if(value1==10) begin
trans_v[2]=8;
trans_v[3]=8;
end
if(value1==60) begin
trans_v[2]=8;
trans_v[3]=8;
end
if(value1==62) begin
trans_v[2]=8;
trans_v[3]=8;
end
if(value1==64) begin
trans_v[2]=8;
trans_v[3]=8;
end
value1=value1+1;
trans_v[4]=trans_v[3];
trans_v[3]=trans_v[2];
trans_v[2]=trans_v[1];

trans_v[1]=trans_v[0];
if(trans_v[4]>=0&&trans_v[4]<=6)begin
flag_ACK=1;
end
else if((trans_v[4]>=10&&trans_v[4]<=16))begin
flag_NAK=1;
$display("%t ------- NAK **** ",$time,trans_v[4]-10);
end
else if((trans_v[4]==8))begin
$display("%t ------- ACK lost ",$time);
end


end
/*********************************************/
endmodule



×