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

Mã kiểm tra lỗi CRC

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 (174.3 KB, 21 trang )

Báo cáo kĩ thuật truyền số liệu

LỜI MỞ ĐẦU
Trong thời đại hiện nay thông tin liên lạc đóng vai trò hết sức quan trọng trong cuộc
sống, hầu hết chúng ta luôn gắn liền với một vài ứng dụng trao đổi thông tin nào đó. Thông tin
trao đổi bao gồm việc trao đổi tin tức, các tài nguyên học tập nghiên cứu như các phần mềm
(dữ liệu, chương trình ứng dụng,...)…Trong môn học truyền dữ liệu chúng ta đã được nghiên
cứu rất nhiều cách truyền tin và các vấn đề liên quan đến nó. Và đề tài mà chúng em tìm hiểu
đó là : " Mã kiểm tra lỗi CRC " CRC chính là một phương pháp nhằm kiểm tra xem nội dung
một tập tin có bị thay đổi trong quá trình truyền tin hay không. Ý tưởng về CRC cũng không
quá phức tạp.
Trong bài viết này, chúng ta sẽ tìm hiểu kĩ mã CRC qua các phần sau:
Phần 1: Giới thiệu mã CRC
Phần 2: Nội dung
Phần 3: Chương trình mô phỏng
Dù đã tìm hiểu rất kỹ nhưng trong bài báo cáo không tránh khỏi thiếu sót.
Chúng em xin trân trọng tiếp thu tất cả những ý kiến đóng góp của cô và các bạn để hoàn
thiện bản báo cáo này hơn nữa.
Xin trân thành cảm ơn!

Nhóm 5

Page 1


Báo cáo kĩ thuật truyền số liệu

MỤC LỤC

Nhóm 5


Page 2


Báo cáo kĩ thuật truyền số liệu

PHẦN I: GIỚI THIỆU
Có nhiều cách để kiểm tra các bit kiểm tra lỗi khi truyền dữ liệu. Kĩ thuật phổ biến và chi
phí ít nhất cho dò tìm lỗi là kỹ thuật VRC, thường được gọi là kiểm tra chẵn lẻ. VRC có thể dò
tìm tất cả các lỗi bit đơn. Nó cũng có thể do tìm các lỗi bit chùm bit miễn là tổng số các bit
thay đổi luôn là số lẻ (1, 3, 5…).Tuy nhiên, bộ kiểm tra VRC không thể dò tìm khi tổng số các
bit 1 của đơn vị dữ liệu bị thay đổi là chẵn. Hoặc kiểm tra lỗi bằng phương pháp LRC, nó là
kỹ thuật tăng cường khả năng dò tìm các lỗi bit hàng loạt. Tuy nhiên, khi ở đó có một mẫu các
bit vẫn chưa khắc phục được. Nếu 2 bit trong một đơn vị dữ liệu bị thay đổi và hai bit ở cùng
đúng vị trí trong đơn vị dữ liệu khác cũng bị hư hại, Bộ kiểm tra LRC sẽ không dò tìm thấy
lỗi. Kỹ thuật thứ 3 và là kỹ thuật mạnh nhất trong các kỹ thuật kiểm tra dư thừa đó là kỹ thuật
kiểm tra vòng – CRC.
CRC (Cyclic Redundancy Check)
Là việc kiểm tra dư thừa theo chu kỳ viết tắt là CRC, là một kỹ thuật để phát
hiện lỗi trong kỹ thuật truyền dữ liệu, nhưng không có khả năng sửa lỗi. Nó được sử
dụng chủ yếu để truyền dữ liệu. Trong phương pháp CRC, một tập tin bit kiểm tra được tính
toán cho mỗi khung tin dựa vào nội dung khung, sau đó được gắn vào đuôi khung các bít
truyền đi. Bên thu thực hiện tính toán tương tự như bên phát. Nếu một lỗi xảy
ra, người nhận sẽ gửi một thông báo”NAK” cho bên phát yêu cầu được truyền lại.
Kỹ thuật này cũng đôi khi được áp dụng cho các thiết bị lưu trữ dữ liệu chẳng hạn như
một ổ đĩa. Tại đó, mỗi khối trên đĩa sẽ có bit kiểm tra, và nó có thể tự động bắt đầu đọc lại khi
lỗi phát hiện, hoặc nó có thể báo cáo lỗi cho phần mềm.

Nhóm 5

Page 3



Báo cáo kĩ thuật truyền số liệu

PHẦN II: NỘI DUNG
Nguyên tắc tạo mã CRC

I.

- Bước 1: một chuỗi n bit được ghép vào đơn vị dữ liệu. Số n là một số nhỏ hơn số các bit
trong số chia xác định trước có chiều dài n+1 bit.
- Bước 2: đơn vị dữ liệu mới kéo dài chia cho số chia sử dụng một quá trình gọi là chia nhị
phân. Phần dư của phép chia là CRC.
- Bước 3: CRC của n bit dẫn ra từ bước 2 thay thế các bit 0 được ghép vào cuối đơn vị
dữ liệu. Chú ý là CRC có thể bao gồm tất cả các bit 0.
Đầu tiên, dữ liệu được nhận, theo đó là CRC. Bên nhận coi toàn bộ chuỗi dữ liệu đó là một
đơn vị và chia nó cho cùng số chia mà đã được sử dụng trước đó để tìm ra số dư CRC.
Nếu chuỗi đến mà không có lỗi, bộ kiểm tra CRC sẽ cho kết quả đầu ra là số dư bằng 0 và
đơn vị dữ liệu được qua. Nếu chuỗi đó bị thay đổi trong quá trình truyền, kết quả phép chia là
một số khác 0, do đó đơn vị dữ liệu không được qua.
1. Xác định mã CRC dùng thuật toán Mod-2

* Nhắc lại một số tính chất của phép toán Mod-2:
- Phép cộng Mod-2 là phép cộng nhị phân không nhớ, dưới đây là thí dụ về phép cộng và
phép nhân
Nhóm 5

Page 4



Báo cáo kĩ thuật truyền số liệu

1010
+ 1101
0111

1011
× 11
1011
1011
11101

- Phép cộng Mod-2 được thực hiện bởi cổng EX-OR
- Phép trừ Mod-2 giống như phép cộng
- Nhân Mod-2 một số với 2n tương ứng với dời số đó n bit về bên trái và thêm n bit 0 vào
bên phải số đó, thí dụ 11001* 23 = 11001000
- Phép chia Mod-2 được thực hiện giống như phép chia thường nhưng nhớ là phép trừ
trong khi chia được thực hiện như phép cộng.
* Thuật toán
Gọi T = (k+n) bit là khung thông tin được phát, với n < k, M = k bit dữ liệu, k bit đầu tiên của
T
F = n bit của khung FCS, n bit cuối của T
P = (n+1) bit, số chia trong phép toán
Số T được tạo ra bằng cách dời số M sang trái n bit rồi cộng với số F:
T = 2nM + F
Chia số
2n

2n M


cho P ta được:

M
R
=Q+
P
P

Q là số thương bà R là số dư
Vì phép chia thực hiện với số nhị phân nên số dư luôn luôn ít hơn số chia 1 bit. Ta dùng số
dư này làm số F, nghĩa là:
T = 2nM + R.
Ở máy thu khi nhận được khối dữ liệu, mang chia cho P, kết quả số dư sẽ = 0:
Nhóm 5

Page 5


Báo cáo kĩ thuật truyền số liệu

T
R R
R+R
=Q+ + =Q+
P
P P
P

Vì R+R=0 nên T/P= Q
Như vậy dùng số dư R của phép chia 2 nM cho P làm ký tự kiểm tra trong khung FCS thì

chắc chắn T sẽ chia đúng cho P nếu bản tin không có lỗi.
Thí dụ:
Dữ liệu cần gửi đi: M= 101101
Đa thức sinh: P= 1101
Số phải tìm R (3 bít) cho khung FSC được xác định như sau:
-

Nhân M với 23 cho kết quả: 101101000
Thực hiện phép chia cho P:

110010
1101
1011010000
1101
1100
1101
1100
1101

Nhóm 5

Page 6


Báo cáo kĩ thuật truyền số liệu

Ta có R=010, cộng R với 23M sẽ cho số T phát đi là:
T= 101101000 + 010 =101101010
Nếu bản tin không có lỗi T phải chia đúng cho P
Thực hiện phép chia T/P ta thấy số dư =0

Tóm lại, để có một khung FCS n bit, người ta phải dùng một số P có n+1 bit để tạo số R có
n bit dùng cho khung FCS. P được gọi là đa thức sinh (generator polynomial), dạng của nó do
các giao thức qui định, tổng quát P phải có bit đầu và bit cuối là bit 1.
2. Dùng phép biểu diễn đa thức

Để thấy quá trình hình thành mã CRC, ta có thể dùng phép biểu diễn một số nhị phân dưới
dạng một đa thức của biến x với hệ số là các số nhị phân và bậc của x là giá trị chỉ vị trí của số
nhị phân đó.
Ví dụ số nhị phân 110110 có thể biểu diển bởi:
1.x5 + 1.x4 + 0.x3 + 1. x2 + 1.x1 + 0.x0 = x5 + x4 + x2 + x
Quá trình hình thành mã CRC được thực hiện như sau:
- Gọi M là đa thức biểu diễn thông tin cần truyền
- P là đa thức sinh, bậc n (chứa n+1 bit)
Thực hiện phép chia:

xn

M(x)
R(x)
= Q(x) +
P(x)
P(x)

Khung thông tin truyền đặc trưng bởi:
T(x) = xn M(x) + R(x)
- Ở bên thu thực hiện phép chia T(x) cho P(x) số dư phải bằng 0.
Nhóm 5

Page 7



Báo cáo kĩ thuật truyền số liệu
T(x)
R(x) R(x)
R(x)
= Q(x) +
+
= Q(x) + 2
= Q(x)
P(x)
P(x) P(x)
P(x)

Thí dụ: M= 111101 tương ứng với đa thức: M(x) = x5 + x4 + x3+ x2 + 1
P(x) =1101 tương ứng với đa thức: P(x) = x3 + x2 +1
Tính R(x) = ?

x3+ x2 +1
X5 + x3 +x2 +x+1
x8+ x7+ x6+x5 + x3
x8 +x7
x6

+ x5
+x3

x6 +x5 +x3
x5
x5 +x4 +x2
x4 +x2

x4 +x3 +x
x3 +x2 +x
x3 +x2 +1
x+1

Nhóm 5

Page 8


Báo cáo kĩ thuật truyền số liệu

R(x) =x +1 tương ứng với giá trị 011
=> T = 111101011

là khung tin mà ta cần truyền đi.

II. Mạch tạo mã CRC
Ta xét ví dụ truyền đi 1 khung 8 bít: 11100110 qua đường truyền số liệu sử dụng mã CRC để
phát hiện lỗi. Đa thức sinh sử dụng là 11001.
1. Mạch tạo mã CRC bên phát
Nạp song song từng byte trong N byte trong trung tín
x3

x0 x1 x2

PISO
TxC
lsb


msb
TxD
Tín hiệu điều khiển phản hồi (từ 1 thành 0 sau 8 N TxC

Nhóm 5

Page 9


Báo cáo kĩ thuật truyền số liệu

TxC

Thanh ghi PISO
lsb

msb

Thanh ghi FSC
X0 X1 X2 X3

0
0
1
1
0
0
1
1
1


0

0

0

0

1

0

0

1

1

0

0

1

1

1

0


0

1

2

0

0

0

1

1

0

0

1

0

1

0

0


3

0

0

0

0

1

1

0

0

1

0

1

1

4

0


0

0

0

0

1

1

0

1

1

0

0

5

0

0

0


0

0

0

1

1

0

1

1

0

6

0

0

0

0

0


0

0

1

1

0

1

0

7

0

0

0

0

0

0

0


0

1

1

0

0

8

0

0

0

0

0

0

0

0

0


1

1

0

9

0

0

0

0

0

0

0

0

0

0

1


1

10

0

0

0

0

0

0

0

0

0

0

0

1

11


0

0

0

0

0

0

0

0

0

0

0

0

Nhóm 5

Page 10



Báo cáo kĩ thuật truyền số liệu

Số bít trong FSC là 4 bít nên cần 1 thanh ghi dịch 4 bít gọi là thanh ghi dịch FSC để biểu
diễn x3, x2, x1, x0 trong đa thức sinh. Với đa thức sinh này thì các số x 3, x0 là 1, còn x2, x1 là 0.
Trạng thái mới của x2, x1 được thay bằng trạng thái trước đó của x 0, x1. Trạng thái mới của x0,
x3 được thay bằng trạng thái của đường phản hồi đã XOR với số trước đó.
Mạch hoạt động như sau: Trước tiên xóa thanh ghi dịch FSC và nạp song song 8 bít đầu
tiên trong khung tin vào thanh ghi vào song song, ra nối tiếp – PISO. Tín hiệu phản hồi là 1.
Theo tốc độ của đồng hồ phát TxC, các bít này được dịch ra đường truyền lần lượt từ MSB
đến LSB. Cùng lúc này dòng bít này được XOR với x 3 qua đầu phản hồi trở lại các đầu vào
chọn lọc của FCS. Sau khi 8 bit đầu đi qua hết thanh ghi PISO, thủ tục này lặp lại. Sau khi
xuất ra byte cuối cùng trong khung tin thanh ghi PISO được nạp toàn là số 0, tín hiệu phản hồi
từ 1 trở thành 0, do đó nội dung của thanh ghi FSC là các bit kiểm tra đi theo sau khung tin
phát ra đường truyền.
2. Mạch tạo mã CRC bên thu

SIPO
FCS

Nhóm 5

Page 11


Báo cáo kĩ thuật truyền số liệu
x0

x1

x2


Đọc song song byte (xN)
x3

RxC
lsb

msb
RxD

Nhóm 5

Page 12


Báo cáo kĩ thuật truyền số liệu

Rx
C
0
1
2
3
4
5
6
7
8
9
10

11
12

RxD
1
1
1
0
0
1
1
0
0
1
1
0

Thanh ghi PISO
lsb
0
1
1
1
0
0
1
1
0

0


0

0

0

0

0

1
1
1
0
0
1
1

1
1
1
0
0
1

1
1
1
0

0

1
1
1
0

1
1
1

1
1

Đọc byte

msb X
0
0
1
1
1
0
1
1
0
1
1
0
0

0
0

0

Thanh ghi FSC
X1 X2 X3
0
0
0
0
0
0
1
0
0
1
1
0
1
1
1
0
1
0
1
0
1
1
1

1
0
1
0
1
0
1
0
1
1
0
0
0
0
0
0

Số liệu thu RxD lần lượt được dịch vào thanh ghi vào nối tiếp – ra song song SIPO
(Serial Input – Parallel Output) ở giữa mỗi ô bit. Các bít RxD lần lượt được XOR với x 3 và
phản hồi trở lại thanh ghi SIPO mỗi khi nhận được byte 8 bít, thiết bị điều khiển sẽ đọc byte.
IV. Khả năng dò sai của mã CRC
Một lỗi xảy ra ở một vị trí nào đó trong khung dữ liệu làm đảo bit ở vị trí đó của
Nhóm 5

Page 13


Báo cáo kĩ thuật truyền số liệu

khung, điều này tương đương với phép tính EX-OR bit đó và bit 1 (vì 0+1=1 và 1+1=0).

Nếu gọi E là một khung có số lượng bit bằng với khung dữ liệu, trong đó chỉ các vị trí của
bit lỗi = 1 và các bit khác = 0 thì khung thông tin Tr nhận được có thể viết:
Tr = T + E.
Thí dụ:
T = 10110110110
Dạng đa thức: T(x) = x10 + x8 + x7 + x5 + x4 + x2 + x1
Giả sử bản tin sai ở các bit x8, x2 và x1
Khung E có dạng: E = 0010000011
E(x) = x8 + x2 + x1
Khung dữ liệu nhận được: Tr = 10010110100
Tr(x) =x10 + x7 + x5 + x4

Ta có:

T+E T E
= +
P
P P

Máy thu không nhận ra lỗi khi nào Tr(x) chia đúng cho P(x), hay chỉ khi E(x) chia đúng
cho P(x).
CRC là phương pháp dò tìm lỗi rất hiệu quả. Nếu số chia được chọn theo nguyên tắc
trước đó thì:
1. Mã CRC luôn luôn cho phép máy thu dò ra một bit sai.

Giả sử bản tin chỉ sai một bit khi đó đa thức E(x) có dạng xi, i là một số nguyên, E(x) chia
đúng cho P(x) chỉ khi P(x) cũng có dạng xn. Người ta đã chọn P(x) có ít nhất là 2 số hạng nên E(x)
không thể chia đúng cho P(x). Vậy mã CRC luôn cho phép máy thu dò ra 1 bít sai.
2. Máy thu sẽ luôn luôn dò ra lỗi gồm nhiều bit và có tổng số bit lỗi là số lẻ nếu ta


chọn P(x) chia đúng cho (x+1).
Nhóm 5

Page 14


Báo cáo kĩ thuật truyền số liệu

Giả sử bản tin sai một chuỗi, nhưng có tổng số bit sai là số lẻ: đa thức E(x) chứa số lẻ bit 1
nên E(1) =1. Mặt khác, giả sử (x+1) là thừa số của P(x), ta có thể viết P(x) =
(x+1)*H(x),với H(x) là một đa thức. Ta cũng giả sử lỗi này không được dò ra, nghĩa là E(x) chia
đúng cho P(x), hay E(x) = P(x)*K(x). Thay P(x) = (x+1)*H(x) vào E(x) được E(x) =
(x+1)*H(x)*K(x), biểu thức này cho E(1) = 0. Điều này trái với giả thiết ở trên, hay nói cách
khác, máy thu sẽ dò ra lỗi nếu ta chọn P(x) sao cho chia đúng cho (x+1). Vậy máy thu luôn dò ra
lỗi gồm nhiều bit và có tổng số bit lỗi là số lẻ nếu P(x) chia hết cho (x+1).
3. Máy thu luôn luôn dò ra lỗi nếu chuỗi dữ liệu sai có chiều dài ≤ bậc của P(x).

Giả sử nhiễu làm sai một đoạn dữ liệu có chiều dài m ≤ bậc n của P(x)
Giả sử chuỗi bit sai có vị trí từ thứ i đến thứ i+m-1, E(x) có dạng:
E(x) = xi+m-1 + . . . . +xi = xi.(xm-1+ . . . +1)

E(x) x i (x m−1 + ... + 1)
=
P(x)
P(x)
Người ta luôn chọn P(x) có nhiều hơn 1 bit nên xi không thể chia hết cho P(x). Máy không dò
được lỗi khi và chỉ khi (xm-1+ . . . +1) chia hết cho P(x). Vì mdo vậy máy thu luôn dò ra lôi nếu chuỗi dữ liệu sai có chiều dài nhỏ hơn bậc của P(x).
4. Với đoạn dữ liệu sai có chiều dài > bậc của P(x)


- Trường hợp m-1 = n hay (m=n+1). Vì bậc của P(x) là n nên để có phép chia đúng P(x)
phải có dạng xn+ . . . . +1 với các số hạng giữa x n và 1 phải hoàn toàn giống với các số hạng của
xm-1+ . . .

. . +1 thì máy thu không dò được lỗi. Có n-1 số hạng giữa x n và 1 nên có 2n-1 tổ

hợp và nếu các tổ hợp này có xác suất xảy ra như nhau thì xác suất máy thu không nhận được
lỗi sẽ là 1/2n-1.
- Trường hợp m>n+1, ta chấp nhận kết quả xác suất này là 1/2n.
Lấy thí dụ mã CRC-32 (n=32), xác suất không dò ra một lỗi có chiều dài >33 bit là
1/2.1032 (tương đương với khả năng dò ra lỗi là 99,99999998%).
Tóm lại với n càng lớn việc máy thu không dò ra lỗi càng rất khó xảy ra.
Nhóm 5

Page 15


Báo cáo kĩ thuật truyền số liệu

V. Các đa thức sinh thường dùng
Một đa thức sẽ được lựa chọn sao cho thỏa mãn:
- Nó sẽ không được chia hết bởi x
- Nó có thể được chia hết bởi (x+1)
Có 4 đa thức P(x) được dùng để tạo mã CRC thông dụng:
CRC_12 = x12 +x11 + x3 + x2 + x + 1
CRC_16 = x16+x15 + x2 + 1
CRC_CCITT = x16+x12 + x5 + 1
CRC_32 = x32+ x26+ x23+ x22 + x16+ x12 + x11+ x10+ x8+ x7 + x5 + x4 + x2+x+1
CRC_12 dùng truyền với ký tự 6 bit và khung FCS dài 12 bit.
CRC_16 & CRC_CCITT dùng truyền ký tự 8 bit và khung FCS dài 16 bit. (ở Mỹ và Âu

châu).
CRC_32 Dùng trong mạng cục bộ (LAN) và một số ứng dụng của DOD (Department Of
Defense).

Nhóm 5

Page 16


Báo cáo kĩ thuật truyền số liệu

PHẦN III: CHƯƠNG TRÌNH MÔ PHỎNG
1. Giao diện chương trình

2. Code

Private Sub Command1_Click()
Dim tem3 As String, tem4 As String
Dim y, x, z, tem1 As Long
Dim tem2, i As Integer
z = Bin2Dec(Text1.Text)
tem2 = Len(Combo1.Text)
tem1 = z * (2 ^ (tem2 - 1))
tem4 = Dec2Bin(tem1)
x = Bin2Dec(Combo1.Text)
For i = 0 To (Len(tem4) - tem2)
Nhóm 5

Page 17



Báo cáo kĩ thuật truyền số liệu

If i = 0 Then
tem3 = Left(tem4, tem2)
Else
tem3 = tem3 + Mid(tem4, tem2 + i, 1)
End If
y = Bin2Dec(tem3)
If Len(Dec2Bin(y)) = Len(Combo1.Text) Then
tem3 = Dec2Bin(y Xor x)
End If
Next
Do While (Len(tem3) < (tem2 - 1))
tem3 = 0 & tem3
Loop
Text2.Text = Text1.Text & tem3
End Sub
Function Bin2Dec(Num As String) As Long
Dim n As Integer
n = Len(Num) - 1
a=n
Do While n > -1
x = Mid(Num, ((a + 1) - n), 1)
Bin2Dec = IIf((x = "1"), Bin2Dec + (2 ^ (n)), Bin2Dec)
n=n-1
Nhóm 5

Page 18



Báo cáo kĩ thuật truyền số liệu

Loop
End Function

Function Dec2Bin(ByVal n As Long) As String
Do Until n = 0
If (n Mod 2) Then Dec2Bin = "1" & Dec2Bin Else Dec2Bin = "0" &
Dec2Bin
n=n\2
Loop
End Function

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
Combo1.AddItem "10"
Combo1.AddItem "10011"
Combo1.AddItem "10101"
Combo1.AddItem "1000011"
Combo1.AddItem "10001001"
Combo1.AddItem "100000111"
Combo1.AddItem "111010101"
Nhóm 5

Page 19



Báo cáo kĩ thuật truyền số liệu

Combo1.AddItem "11000110011"
Combo1.AddItem "11000000000000101"
End Sub
Private Sub Timer1_Timer()
Dim a As String
Dim b As String
a = Left(Label2.Caption, 1)
b = Right(Label2.Caption, Len(Label2.Caption) - 1)
Label2.Caption = b + a
End Sub

Nhóm 5

Page 20


Báo cáo kĩ thuật truyền số liệu

TỔNG KẾT
1. Tự đánh giá kết quả báo cáo đề tài.

Đề tài của nhóm em được hoàn thành ở mức cơ bản và cũng phát triển rộng thêm ở một
số chi tiết trong bài. Các định nghĩa cũng như những nội dung trong bài, chúng e đã cố gắng
làm ngắn gọn xúc tích và dễ hiểu nhất có thể.
Còn một số ít các chi tiết chưa kịp hoàn thành xong như dự tính ban đầu. Có thể còn một
số mặt hạn chế chưa được bổ sung. Mong thấy khi đọc xong đề tài báo cáo của chúng em thì
góp ý kiến cho nhóm em để lần sau nhóm em làm đề tài báo cáo được tốt hơn nữa.

2. Hướng phát triển.
Nếu có điều kiện hơn về thời gian, chúng em sẽ cố gắng hoàn thành tốt hơn bài báo cáo
của minh, để sau này có thể được ứng dụng vào thực tế. Và giúp ích cho cuộc sống nhiều hơn.
Và chúng em xin chân thành cảm ơn những đóng góp ý kiến của thầy cô!

Nhóm 5

Page 21



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×