Bài giảng Mạng máy tính - Chương 3: Tầng giao vận (Phần 2) - Hồ Phương Đắc

TCP:ꢀTꢁng quan RFCs:ꢀ793,ꢀ1122,ꢀ1323,ꢀ2018,ꢀ2581  
ðiꢌm nꢇi ñiꢌm:  
Truyꢂn songꢀcông:  
Mꢈt gꢑi,ꢀMꢈt nhꢎn  
Dꢃ liꢄu truyꢂn theo cꢅ hai  
hưꢆng  
Tinꢀcꢎy,ꢀtheo ñúng thꢒ tꢓ:  
MSS:ꢀKích thưꢆc tꢇi ña mꢈt  
Không quan tâm ñꢍn khuôn  
segment  
dꢔng thông ñiꢄp.  
Hưꢆng nꢇi:  
ðưꢕng ꢇng:  
Bꢉt tay,ꢀchào hꢊi trưꢆc khi  
nói chuyꢄn (trao ñꢋi thông  
tinꢀñiꢂu khiꢌn).ꢀThiꢍt lꢎp bꢈ  
ñꢄm hai ñꢏu.  
Cꢑa sꢋ kiꢌm soát tꢉc nghꢖn  
và ñiꢂu khiꢌn lưu lưꢐng.  
Bꢀ ñꢁm ꢂ phía Nhꢃn và Gꢄi  
Kiꢌm soát lưu lưꢐng:  
application  
writesꢀdata  
application  
readsꢀdata  
Nói quá nhanh,ꢀnghe quá  
socket  
door  
socket  
door  
TCP  
sendꢀbuffer  
TCP  
receiveꢀbuffer  
chꢎm  
segment  
3:ꢀTransportꢀLayer 3bꢁ1  
Cꢂu trúc TCPꢀsegment  
32ꢀbits  
URG:ꢀdꢃ liꢄu khꢈn cꢂp  
ðưꢊc xác ñꢐnh  
theo STTꢀcꢑa  
byteꢀtrong luꢒng  
dꢃ liꢄu  
sourceꢀportꢀ#  
sequenceꢀnumber  
acknowledgementꢀnumber  
dest portꢀ#  
(ít sꢉ dꢆng)  
ACK:ꢀACKꢀ#  
Hꢊp lꢄ  
head not  
UAP  
R S rcvr windowꢀsize  
F
PSH:ꢀchuyꢋn dꢃ liꢄu  
ngay (ít sꢉ dꢆng)  
len used  
Sꢍ lưꢊng byte  
mà bên nhꢎn  
có khꢏ năng  
nhꢎn  
checksum  
ptr urgentꢀdata  
RST,ꢀSYN,ꢀFIN:  
Kiꢋm soát kꢌt nꢍi  
(Lꢄnh Thiꢌt lꢎp và  
ðóng )  
Optionsꢀ(variableꢀlength)  
Dꢃ liꢄu ꢅng dꢆng  
(kích thưꢇc tùy ý)  
Internet  
checksum  
(giꢍng UDP)  
3:ꢀTransportꢀLayer 3bꢁ2  
TCP:ꢀSꢍ thꢅ tꢓ và Sꢍ biên nhꢎn  
Sꢍ thꢅ tꢓ (STT):  
Máy B  
Máy A  
Là Sꢇ thꢒ tꢓ cꢗa byteꢀ  
ñꢏu tiên trong luꢘng  
dꢃ liꢄu  
Ngưꢕi dùng  
ñánh chꢃ  
‘C’  
Biên nhꢎn  
chꢃ ‘C’,ꢀphꢅn  
hꢘi  
Sꢍ biên nhꢎn:  
Là Sꢇ thꢒ tꢓ cꢗa byteꢀ  
kꢍ tiꢍp mà bên nhꢎn  
muꢇn nhꢎn.  
lꢔi chꢃ ‘C’  
Biên nhꢎn tích lũy  
Biên nhꢎn  
lꢔi cho chꢃ  
‘C’ phꢅn hꢘi  
Q? Bên nhꢎn xꢑ lý gói tinꢀ  
không ñúng thꢒ tꢓ ntn ?  
A:ꢀTCPꢀkhông quy  
ñꢙnh.ꢀTùy thuꢈc vào  
ngưꢕi cài ñꢚt.  
Thꢕi gian  
ꢔng dꢆng telnetꢀñơn giꢏn  
3:ꢀTransportꢀLayer 3bꢁ3  
TCP:ꢀTruyꢕn Tinꢀcꢎy  
Sꢓ kiꢄn: nhꢎn dꢃ liꢄu  
tꢜ phía bên trên  
FSMꢀbên Gꢑi ñơn giꢏn,ꢀgiꢅ  
ñꢙnh rꢛng:  
Tꢔo và Gꢑi segment  
•Dꢃ liꢄu truyꢂn theo mꢈt hưꢆng  
•Không kiꢌm soát tꢉc nghꢖn  
•Không ñiꢂu khiꢌn lưu lưꢐng  
Sꢓ kiꢄn: timerꢀtimeoutꢀcho  
wait  
segmentꢀcó STTꢀlà y  
forꢀ  
Gꢑi lꢔi segment  
Sꢓ kiꢄn  
Sꢓ kiꢄn: Nhꢎn biên nhꢎn cho  
gói có STTꢀlà y  
Xꢑ lý ACK  
3:ꢀTransportꢀLayer 3bꢁ4  
Nhanh chóng truyꢕn lꢖi  
Khoꢅng thꢕi gian Timeoutꢀ Nꢍu phía gꢑi nhꢎn ñưꢐc 3ꢀ  
thưꢕng tương ñꢇi dài:  
Chꢎm trꢝ trong viꢄc gꢑi lꢔi  
ACKꢀtrùng lꢚp,ꢀcó thꢌ giꢅ  
thiꢍt gói tinꢀngay sau gói  
tinꢀñưꢐc biên nhꢎn 3ꢀlꢏn  
liên tiꢍp bꢙ mꢞt:  
gói tinꢀbꢙ mꢞt  
Phát hiꢄn mꢞt gói tinꢀquaꢀ  
Gꢑi lꢔi kꢌ cꢅ khi gói này  
chưa timeout  
các ACKꢀtrùng lꢚp  
Phía gꢑi thưꢕng gꢑi nhiꢂu  
gói tin  
Nꢍu gói tinꢀbꢙ mꢞt,ꢀsꢖ có  
ACKꢀtrùng lꢚp  
3:ꢀTransportꢀLayer 3bꢁ5  
FastꢀRetransmit:  
event: ACKꢀreceived,ꢀwithꢀACKꢀfieldꢀvalueꢀofꢀyꢀ  
ifꢀ(yꢀ>ꢀSendBase)ꢀ{  
SendBase =ꢀy  
ifꢀ(thereꢀareꢀcurrentlyꢀnotꢁyetꢁacknowledgedꢀsegments)  
startꢀtimerꢀ  
}ꢀ  
elseꢀ{ꢀ  
incrementꢀcountꢀofꢀdupꢀACKs receivedꢀforꢀy  
ifꢀ(countꢀofꢀdupꢀACKs receivedꢀforꢀyꢀ=ꢀ3)ꢀ{  
resendꢀsegmentꢀwithꢀsequenceꢀnumberꢀy  
ACKꢀtrùng lꢁp cho gói tin  
ðã ñưꢂc biên nhꢃn  
Truyꢄn lꢅi nhanh chóng  
3:ꢀTransportꢀLayer 3bꢁ6  
00 sendbase =ꢀinitial_sequenceꢀnumberꢀagreedꢀbyꢀTWH  
01ꢀꢀꢀꢀnextseqnum =ꢀinitial_sequenceꢀnumberꢀbyꢀTWH  
02ꢀꢀꢀꢀloopꢀ(forever)ꢀ{  
03ꢀꢀꢀꢀꢀꢀswitch(event)  
04ꢀꢀꢀꢀꢀꢀevent: dataꢀreceivedꢀfromꢀapplicationꢀabove  
05ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀif (windowꢀallowꢀsend)  
06ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcreateꢀTCPꢀsegmentꢀwithꢀsequenceꢀnumberꢀnextseqnum  
06ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀif (noꢀtimer)ꢀstartꢀtimer  
07ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀpassꢀsegmentꢀtoꢀIP  
08ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀnextseqnum =ꢀnextseqnum +ꢀlength(data)  
else putꢀpacketꢀinꢀbuffer  
TCP:ꢀ  
09ꢀꢀꢀꢀꢀꢀꢀꢀevent: timerꢀtimeoutꢀforꢀsendbase  
10ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀretransmitꢀsegment  
11ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcomputeꢀnewꢀtimeoutꢀinterval  
12ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀrestartꢀtimer  
13ꢀꢀꢀꢀꢀꢀꢀꢀevent: ACKꢀreceived,ꢀwithꢀACKꢀfieldꢀvalueꢀofꢀyꢀ  
14ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀif (yꢀ>ꢀsendbase)ꢀ{ꢀ/*ꢀcumulativeꢀACKꢀofꢀallꢀdataꢀupꢀtoꢀyꢀ*/ꢀ  
15ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀcancelꢀtheꢀtimerꢀforꢀsendbase  
Truyꢕn  
tinꢀcꢎy  
16  
sendbase =ꢀy  
17  
17  
18  
ifꢀ(noꢀtimerꢀandꢀpacketꢀpending)ꢀstartꢀtimerꢀforꢀnewꢀsendbase  
whileꢀ(thereꢀareꢀsegmentsꢀandꢀwindowꢀallow)  
sentꢀaꢀsegment;  
TCPꢀphía Gꢉi  
ñơn giꢏn  
18ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ}ꢀ  
19ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀelse {ꢀ/*ꢀy==sendbase,ꢀduplicateꢀACKꢀforꢀalreadyꢀACKed segmentꢀ*/ꢀ  
20ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀincrementꢀnumberꢀofꢀduplicateꢀACKs receivedꢀforꢀyꢀ  
21ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀifꢀ(numberꢀofꢀduplicateꢀACKSꢀreceivedꢀforꢀyꢀ==ꢀ3)ꢀ{ꢀ  
22ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ/*ꢀTCPꢀfastꢀretransmit */ꢀ  
23ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀresendꢀsegmentꢀwithꢀsequenceꢀnumberꢀyꢀ  
24ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀrestartꢀtimerꢀforꢀsegmentꢀyꢀ  
25ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ}ꢀ  
26ꢀꢀꢀꢀꢀꢀ}ꢀꢀ/*ꢀendꢀofꢀloopꢀforeverꢀ*/  
TCP:ꢀChính sách ACK [RFCꢀ1122,ꢀRFCꢀ2581]  
Bên nhꢃn (TCP)  
Sꢆ kiꢇn  
Trì hoãn ACK.ꢀðꢉi segmentꢀkꢂ tiꢂp  
trong 500ms.ꢀNꢂu không có segment,  
gꢌi ACK  
Segmentꢀtheo ñúng STTꢀñꢂn,ꢀ  
Không thiꢂu dꢃ liꢄu,  
Không có ACKꢀtreo  
Ngay lꢍp tꢎc gꢌi mꢅt ACKꢀmang giá  
trꢆ tích lũy  
Segmentꢀtheo ñúng STTꢀñꢂn,ꢀ  
Không thiꢂu dꢃ liꢄu,  
Có mꢅt ACKꢀbꢆ treo  
Gꢌi ACKꢀtrùng lꢏp,ꢀchꢐ STTꢀcꢑa  
byteꢀdꢃ liꢄu mình muꢈn nhꢍn  
Segmentꢀtheo ñúng STTꢀñꢂn  
(STTꢀñꢂn lꢇn hơn sꢈ mong  
ñꢉi).ꢀThiꢂu dꢃ liꢄu  
Biên nhꢍn STTꢀbên nhꢍn mong muꢈn  
nhꢍn  
Mꢅt segmentꢀñꢂn ñiꢊn vào  
ñoꢋn dꢃ liꢄu bꢆ khuyꢂt  
3:ꢀTransportꢀLayer 3bꢁ8  
TCP:ꢀVí dꢆ vꢕ Truyꢕn lꢖi  
HostꢀA  
HostꢀB  
HostꢀA  
HostꢀB  
X
loss  
time  
time  
Timeoutꢀtrưꢆc khi nhꢎn  
Ví dꢟ mꢞt ACK  
ACK,ꢀbên gꢑi biên nhꢎn tích lũy  
3:ꢀTransportꢀLayer 3bꢁ9  
ðiꢕu khiꢋn lưu lưꢊng trong TCP  
ðiꢕu khiꢋn  
lưu lưꢊng  
Phía Nhꢎn: Thông báo rõ  
ràng cho phía Gꢑi khꢅ  
năng nhꢎn dꢃ liꢄu cꢗa  
mình (thay ñꢋi thưꢕng  
xuyên)ꢀ  
Không cho bên Gꢌi gꢌi  
quá nhiꢊu,ꢀquá nhanh  
RcvBuffer =ꢀKích thưꢆc Bñm nhn  
RcvWindow =ꢀKích thưꢆc vùng còn trng trong Bñm  
Phía Gꢉi: Giꢃ khꢇi lưꢐng dꢃ  
liꢄu gꢑi ñi nhưng chưa  
ñưꢐc biên nhꢎn nhꢊ hơn  
lưꢐng bên kia chꢞp nhꢎn  
ñưꢐc  
Bꢗ ñꢄm phía Nhꢎn  
3:ꢀTransportꢀLayer 3bꢁ10  
ðiꢕu khiꢋn lưu lưꢊng trong TCP  
sourceꢀportꢀ#  
sequenceꢀnumber  
acknowledgementꢀnumber  
dest portꢀ#  
head not  
len used  
UA P  
R S rcvr windowꢀsize  
F
checksum  
ptr urgentꢀdata  
Chꢠ trꢇng trong Bꢈ ñꢄm  
Optionsꢀ(variableꢀlength)  
= RcvWindow  
application  
dataꢀ  
(variableꢀlength)  
TCPꢀRoundꢀTripꢀTimeꢀandꢀTimeout  
Q: Làm thꢍ nào ñꢌ ưꢆc lưꢐc RTT?  
Q: Thiꢍt lꢎp giá trꢙ  
timeoutꢀntn ?  
SampleRTT: khoꢅng thꢕi gian tꢜ khi  
gꢑi gói tinꢀcho ñꢍn khi nhꢎn ñưꢐc biên  
nhꢎn  
Timeoutꢀ>ꢀꢀRTT  
Chú ý:ꢀRTTꢀthay ñꢋi  
Bꢊ quaꢀtruyꢂn lꢔi  
thưꢕng xuyên  
SampleRTT thay ñꢋi thưꢕng xuyên.ꢀ  
Chúng ta muꢇn ưꢆc lưꢐng RTTꢀ“mꢙn  
hơn”  
Quá bé:ꢀtimeoutꢀngay  
Truyꢂn lꢔi không cꢏn  
thiꢍt  
Sꢑ dꢟng nhiꢂu giá trꢙ ño ñưꢐc  
trong quá khꢒ,ꢀkhông phꢅi chꢡ có  
mꢈt SampleRTT gꢏn nhꢞt  
Quá lꢇn:ꢀxꢑ lý viꢄc mꢞt  
gói tinꢀbꢙ chꢎm trꢝ  
3:ꢀTransportꢀLayer 3bꢁ12  
TCPꢀRoundꢀTripꢀTimeꢀvà Timeout  
EstimatedRTT = (1-x)*EstimatedRTT + x*SampleRTT  
Trꢢng sꢇ sꢖ thay ñꢋi giá trꢙ trung bình  
ꢣnh hưꢤng cꢗa SampleRTT  
xꢀthưꢕng chꢢn giá trꢙ 0.1  
Thiꢍt ñꢚt giá trꢙ timeout  
EstimtedRTT cꢈng thêm mꢈt “giá trꢙ anꢀtoàn”  
Biꢍn thiên EstimatedRTT càng lꢆn -> tăng “giá trꢙ anꢀtoàn”  
Timeout = EstimatedRTT + 4*Deviation  
Deviation = (1-x)*Deviation +  
x*|SampleRTT-EstimatedRTT|  
3:ꢀTransportꢀLayer 3bꢁ13  
TCPꢀ:ꢀQuꢏn lý Kꢌt nꢍi  
Bꢘt tay ba bưꢇc:  
Chú ý:ꢀTrong TCP,ꢀphía Gꢑi và  
Nhꢎn thiꢍt lꢎp “kꢍt nꢇi” trưꢆc  
khi trao ñꢋi các segmentꢀdꢃ  
liꢄu.  
Khꢤi tꢔo các biꢍn TCP:  
Sꢇ thꢒ tꢓ  
Bꢈ ñꢄm,ꢀThông tinꢀvꢂ lưu  
lưꢐng (RcvWindow)  
client: Khꢤi tꢔo kꢍt nꢇi  
Bưꢆc 1: Phía clientꢀgꢑi gói tinꢀñiꢂu  
khiꢌn TCPꢀSYNꢀtꢆi server  
Chꢒa Sꢇ thꢒ tꢓ khꢤi ñꢏu  
Bưꢆc 2: Nhꢎn ñưꢐc gói SYN,ꢀnꢍu chꢞp  
nhꢎn kꢍt nꢇi,ꢀserverꢀgꢑi trꢅ lꢕi gói tinꢀ  
ñiꢂu khiꢌn SYNACK  
Biên nhꢎn cho gói SYNꢀvꢜa  
nhꢎn  
Socket clientSocket = new     
Socket("hostname","port  
Cꢞp phát bꢈ ñꢄm  
Thông báo vꢂ STTꢀkhꢤi ñꢏu cꢗa  
number");  
server  
server: ðꢐi kꢍt nꢇi tꢜ client  
Socket connectionSocket =  
welcomeSocket.accept();  
3:ꢀTransportꢀLayer 3bꢁ14  
Bꢘt tay ba bưꢇc  
ðꢌ ñꢅm bꢅo rꢛng bên kia thꢓc sꢓ mong muꢇn thiꢍt lꢎp kꢍt nꢇi  
A
B
A
B
Chꢈp nhꢃn?  
Không có yêu  
cꢉu như vꢃy  
Tꢊ chꢋi  
3:ꢀTransportꢀLayer 3bꢁ15  
TCP:ꢀQuꢏn lý Kꢌt nꢍi (tiꢌp)  
client  
server  
ðóng mꢈt kꢍt nꢇi:  
close  
clientꢀñóng socket:  
clientSocket.close();  
Bưꢆc 1: client gꢑi gói ñiꢂu khiꢌn  
FINꢀtꢆi server  
close  
Bưꢆc 2: server nhꢎn ñưꢐc gói  
FIN,ꢀbiên nhꢎn cho gói tinꢀnày.ꢀ  
ðóng kꢍt nꢇi,ꢀgꢑi gói FIN.ꢀ  
closed  
3:ꢀTransportꢀLayer 3bꢁ16  
TCP:ꢀQuꢏn lý Kꢌt nꢍi (tiꢌp)  
client  
server  
Bưꢆc 3: client nhꢎn gói FIN,ꢀ  
biên nhꢎn lꢔi ACK.ꢀ  
closing  
Bưꢆc vào trꢔng thái “timedꢀ  
wait” – sꢖ biên nhꢎn ACKꢀ  
cho các gói FINꢀnhꢎn ñưꢐc  
closing  
closed  
Bưꢆc 4: server nhꢎn ñưꢐc ACK,ꢀ  
ñóng kꢍt nꢇi.ꢀ  
Chú ý: Vꢆi vài cꢅi tiꢍn nhꢊ,ꢀta có  
thꢌ xꢑ lý ñꢘng thꢕi nhiꢂu gói  
FIN.  
closed  
3:ꢀTransportꢀLayer 3bꢁ17  
ðóng kꢌt nꢍi  
Mc tiêu:  
client  
server  
Miꢀphíaꢀgiiꢀphóngꢀ  
tàiꢀnguyênꢀvà xóaꢀbꢕ  
trngꢀtháiꢀvkênhꢀ  
truyn  
Yêuꢀcꢉu  
ꢀñóng  
Giꢅiꢀphóngꢀ  
Tàiꢀnguyên?  
ðóng  
Giꢅiꢀ  
phóngꢀ  
Tàiꢀ  
ðóng  
Giꢅiꢀphóngꢀ  
Tàiꢀnguyên  
nguyên  
3:ꢀTransportꢀLayer 3bꢁ18  
Vꢂnꢀñꢕ tꢁngꢀquát: QuânꢀXanhꢙTrꢘng  
Haiꢀphíaꢀquânꢀxanhꢀcꢏnꢀthꢇngꢀnhꢞtꢀthꢕiꢀñiꢌmꢀñꢌ cùngꢀtꢞnꢀcôngꢀquânꢀtrꢉng. Hꢢ thꢊaꢀthuꢎnꢀbꢛngꢀ  
cáchꢀgꢑiꢀthôngꢀñiꢄpꢀchoꢀnhau. Nꢍuꢀcùngꢀñꢘngꢀýꢀ:ꢀtꢞnꢀcông,ꢀcònꢀkhôngꢀsꢖ khôngꢀtꢞnꢀcông. Chú ýꢀ  
rꢛngꢀngưꢕiꢀtruyꢂnꢀtinꢀcó thꢌ bꢙ bꢉtꢀ!ꢀNꢍuꢀcùngꢀtꢞnꢀcông,ꢀbênꢀxanhꢀthꢉng,ꢀcònꢀnꢍuꢀtꢞnꢀcôngꢀriêngꢀlꢥ,ꢀ  
bênꢀtrꢉngꢀthꢉng  
3:ꢀTransportꢀLayer 3bꢁ19  
ðóngꢀkꢌtꢀnꢍiꢀtrongꢀbꢍnꢀbưꢇc  
A
B
ðꢂ nghꢙꢀñóng  
Aꢁ>B  
ðóng  
Aꢁ>Bꢀñóng  
ðꢂ nghꢙꢀñóng  
ðóng  
Aꢁ>Bꢀñóng  
Bꢁ>A  
ꢁ Có thꢌ truyꢌnꢀlꢔiꢀACKꢀ  
nꢍuꢀACKꢀnàyꢀbꢙ mꢞt  
ðóng  
Xóaꢀbꢊ tꢞtꢀ  
cꢅ trꢔngꢀthái  
ðóng  
Xóaꢀbꢊ tꢞtꢀ  
cꢅ trꢔngꢀthái  
3:ꢀTransportꢀLayer 3bꢁ20  
Tải về để xem bản đầy đủ
pdf 38 trang myanh 10760
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Mạng máy tính - Chương 3: Tầng giao vận (Phần 2) - Hồ Phương Đắc", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_mang_may_tinh_chuong_3_tang_giao_van_phan_2_ho_phu.pdf