KHOA CÔNG NGH THÔNG TIN Ệ... Sử dụng Soket Ti me- out... Trường ti p theo trong TCP Header sau port là s sequence vàế ốacknowledgement... Port Mô Tả... Igmp Internet Group Management Pro
Trang 1KHOA CÔNG NGH THÔNG TIN Ệ
Trang 2M C L C Ụ Ụ
ICH ƯƠ NG I: NH NG KI N TH C C B N V L P TRÌNH M NG Ữ Ế Ứ Ơ Ả Ề Ậ Ạ 6
IIT Ổ NG QUAN 6
IIIT ng Ethernet ầ 6
IV a ch Ethernet Đị ỉ 8
VEthernet Protocol Type 9
VIData payload 10
VIIChecksum 10
VIIIT Ầ NG IP 10
IXTr ườ ng a ch đị ỉ 12
X Các c phân o n ờ đ ạ 12
XITr ườ ng Type of Service 13
XIITr ườ ng Protocol 13
XIIIT Ầ NG TCP 14
XIV TCP port 15
XVC ch ơ ế đả m b o ả độ tin c y truy n t i các gói tin ậ ề ả 16
XVIQuá trình thành l p m t phiên làm vi c TCP ậ ộ ệ 17
XVIIT Ầ NG UDP 19
XVIIICH ƯƠ NG II: L P TRÌNH SOCKET H Ậ ƯỚ NG K T N I Ế Ố 22
XIXS OCKET 22
XXIPA DDRESS .25
XXIIPE ND P OINT .26
XXIIL Ậ P TRÌNH S OCKET H ƯỚ NG K T Ế N I Ố 26
XXIIIL p trình phía Server ậ 27
XXIVL p trình phía Client ậ 31
XXVV n ấ đề v i b ớ ộ đệ m d li u ữ ệ 34
XXVIX lý v i các b ử ớ ộ đệ m có kích th ướ c nh ỏ 34
XXVIIV n ấ đề v i các thông i p TCP ớ đ ệ 36
XXVIIIGi i quy t các v n ả ế ấ đề v i thông i p TCP ớ đ ệ 41
XXVIII.1.1.1.S d ng các thông i p v i kích th ử ụ đ ệ ớ ướ c c nh ố đị 41
XXVIII.1.1.2.G i kèm kích th ở ướ c thông i p cùng v i thông i p đ ệ ớ đ ệ 46
XXVIII.1.1.3.S d ng các h th ng ánh d u ử ụ ệ ố đ ấ để phân bi t các thông i p ệ đ ệ 52
XXIXS d ng C# Stream v i TCP ử ụ ớ 52
XXIX.1.1.1.L p NetworkStream ớ 53
XXIX.1.1.2.L p StreamReader và StreamWriter ớ 56
XXXCH ƯƠ NG III: L P TRÌNH SOCKET PHI K T N I Ậ Ế Ố 62
XXXIT Ổ NG QUAN 62
Trang 3XXXIIL Ậ P TRÌNH PHÍA S ERVER .63
XXXIIIL Ậ P TRÌNH PHÍA C LIENT 65
XXXI VSử dụng phương t hức Connect ( ) t r ong chương t r ì nh UDP Cl i ent 67
XXXVPhân bi ệt các t hông đi ệp UDP .68
XXXVIN GĂN C N Ả M T Ấ DỮ LI U Ệ .70
XXXVIIN GĂN C N Ả M T Ấ GÓI TIN 74
XXXVI I 1 1 Sử dụng Soket Ti me- out 74
XXXVIIIĐ I U Ề KHI N Ể VI C Ệ TRUY N Ề L I Ạ CÁC GÓI TIN .77
XXXIXCH ƯƠ NG IV: S D NG CÁC L P HELPER C A C# SOCKET Ử Ụ Ớ Ủ 82
XLL Ớ P TCP C LIENT 82
XLIL Ớ P TCPL ISTENER 85
XLIIL Ớ P U DP C LIENT 88
XLIIICH ƯƠ NG V: ĐA NHI M TI U TRÌNH Ệ Ể 92
XLIVK HÁI NI M Ệ TI N Ế TRÌNH VÀ TI U Ể TRÌNH C A Ủ W INDOWS 92
XLVM Ô HÌNH 92
XLVIC ÁC KỸ THU T Ậ TRONG NET T O Ạ TI U Ể TRÌNH .93
XLVI I Tạo t i ểu t r ì nh t r ong Thr ead- pool 93
XLVI I I Tạo t i ểu t r ì nh bất đồng bộ 96
XLVI I I 1 1 1 Phương thức BlockingExample 99
XLVI I I 1 1 2 Phương thức Pol l i ngExample 100
XLVI I I 1 1 3 Phương thức Wait ingExample 101
XLVI I I 1 1 4 Phương thức WaitAl lExample .102
XLVI I I 1 1 5 Phương thức Cal lbackExample 104
XLIXThực th i phương thức bằng Timer 105
LThực thi phương thức bằng t iểu tr ình mới 108
LIĐ iều khiển quá tr ình thực th i của một t iểu tr ình 110
LI INhận biết khi nào một t iểu tr ình kết thúc 114
LI I I Khởi chạy một t iến tr ình mới .115
LIVKết thúc một t iến tr ình 117
LVT H C Ự THI PH ƯƠ NG TH C Ứ B NG Ằ CÁCH RA HI U Ệ Đ I Ố T ƯỢ NG W AIT H ANDLE .119
LVICH ƯƠ NG VI: Đ NG B HÓA Ồ Ộ 120
LVIIL Ý DO Đ NG Ồ BỘ HÓA 120
LVIIIC ÁC PH ƯƠ NG PHÁP Đ NG Ồ BỘ HÓA 120
LIXP H ƯƠ NG PHÁP S EMAPHORE 120
LXP H ƯƠ NG PHÁP DÙNG L P Ớ M ONITOR 122
LXIS YSTEM T HREADING W AIT H ANDLE , BAO G M Ồ A UTO R ESET E VENT , M ANUAL R ESET E VENT 124
LXIIP H ƯƠ NG PHÁP M UTEX 127
LXIIICH ƯƠ NG VII: L P TRÌNH SOCKET B T Đ NG B Ậ Ấ Ồ Ộ 129
Trang 4LXIVL Ậ P TRÌNH SỰ KI N Ệ TRONG W INDOWS 129
LXVSử dụng Event và Del egat e .130
LXVI Lớp AsyncCal l back t r ong l ập t r ì nh Wi ndows .132
LXVIISỬ D NG Ụ S OCKET B T Ấ Đ NG Ồ BỘ 132
LXVI I I Thành l ập kết nối .133
LXVI I I 1 1 1 Phương thức BeginAccept() và EndAccept() 133
LXVI I I 1 1 2 Phương thức BeginConnect() và EndConnect() 135
LXIXGởi dữ l i ệu .136
LXIX.1.1 1 Phương thức BeginSend() và phương thức EndSend() 136
LXIX.1.1 2 Phương thức BeginSendTo() và EndSendTo() 137
LXXNhận dữ l i ệu .138
LXX.1.1.1.Phương thức BeginReceive() , EndReceive, BeginReceiveFrom(), EndReceiveFrom() 138
LXXIChương tr ình WinForm gởi và nhận dữ l i ệu giữa Cl ient và Server 138 LXXI.1 1 1 Chương tr ình Server 138
LXXI.1 1 2 Mô hình chương tr ình Server 139
LXXI.1 1 3 Lớp ServerProgram 139
LXXI.1 1 4 Lớp ServerForm 143
LXXI IChương tr ình Cl ient 144
LXXI I 1 1 1 Mô hình chương tr ình Cl ient 144
LXXI I 1 1 2 Lớp ClientProgram 145
LXXI I 1 1 3 Lớp ClientForm 148
LXXIIIL Ậ P TRÌNH S OCKET B T Ấ Đ NG Ồ BỘ SỬ D NG Ụ TI U Ể TRÌNH 149
LXXIVLập tr ình sử dụng hàng đợi gởi và hàng đợi nhận thông điệp 149
LXXVLập tr ình ứng dụng nhiều Cl ient .155
LXXVICH ƯƠ NG VIII: L P TRÌNH V I CÁC GIAO TH C Ậ Ớ Ứ 158
LXXVIIL P TRÌNH V I GIAO TH C ICMP Ậ Ớ Ứ 158
LXXVII IG iao thức ICMP 158
LXXVII I 1 1 1 Định dạng của gói t in ICMP 158
LXXVII I 1 1 2 Các tường Type của gói t in ICMP 159
LXXVII I 1 1 3 Echo Request and Echo Reply Packets 159
LXXVII I 1 1 4 Gói t in Destinat ion Unreachable .160
LXXVII I 1 1 5 Gói t in Time Exceeded .161
LXXIXSử dụng Raw Socket 161
LXXIX.1.1 1 Định dạng của Raw Socket 161
LXXIX.1.1 2 Gởi các gói t in Raw 162
LXXIX.1.1 3 Nhận các gói t in Raw .162
LXXXTạo ra một lớp ICMP .163
LXXXITạo gói t in ICMP .164
LXXXIITạo phương thức Checksum .164
LXXXII I Lớp ICMP hoàn chỉnh 165
LXXXIVChương tr ình ping đơn giản 167
LXXXVChương tr ình TraceRoute đơn giản 169
LXXXVIL P TRÌNH V I GIAO TH C SMTP Ậ Ớ Ứ 171
LXXXVIICơ bản về Email 171
LXXXVII 1 1 1 Hoạt động của MTA 171
LXXXVII 1 1 2 Gở i mail ra ngoài 172
LXXXVII 1 1 3 Nhận mail 172
Trang 5LXXXVII.1.1.4.Hoạt động của MDA 173
LXXXVII.1.1.5.Hoạt động của MUA 174
LXXXVI I I SMTP và Wi ndows .176
LXXXVIII 1.1.1.Collaboration Data Objects (CDO) 176
LXXXVIII 1.1.2.Dịch vụ mail SMTP 177
LXXXIXLớp SmtpMail 178
XCCác phương thức và thuộc t ính của lớp SmtpMail 178
XC.1.1.1.Sử dụng lớp SmtpMail 180
Trang 6gi a các thi t b , đ c bi t là thông qua m ng Internet.ữ ế ị ặ ệ ạ
Đ hi u rõ các khái ni m bên dể ể ệ ướ ậi l p trình m ng, chúng ta ph i hi u rõ giaoạ ả ể
th c IP, hi u cách nó chuy n d li u gi a các thi t b m ng L p trình m ng dùngứ ể ể ữ ệ ữ ế ị ạ ậ ạgiao th c IP thứ ường r t ph c t p Có nhi u y u t c n quan tâm liên quan đ n cáchấ ứ ạ ề ế ố ầ ế
d li u đữ ệ ược g i qua m ng: s lở ạ ố ượng Client và Server, ki u m ng, t c ngh n m ng,ể ạ ắ ẽ ạ
l i m ng,… B i vì các y u t này nh hỗ ạ ở ế ố ả ưởng đ n vi c truy n d li u t thi t b nàyế ệ ề ữ ệ ừ ế ị
đ n thi t b khác trên m ng do đó vi c hi u rõ chúng là v n đ r t quan tr ng đ l pế ế ị ạ ệ ể ấ ề ấ ọ ể ậ trình m ng đạ ược thành công
M t gói d li u m ng g m nhi u t ng thông tin M i t ng thông tin ch a m tộ ữ ệ ạ ồ ề ầ ỗ ầ ứ ộ dãy các byte được s p đ t theo m t tr t t đã đắ ặ ộ ậ ự ược đ nh s n H u h t các gói dị ẵ ầ ế ữ
li u dùng trong l p trình m ng đ u ch a ba t ng thông tin cùng v i d li u đệ ậ ạ ề ứ ầ ớ ữ ệ ượ cdùng đ truy n t i gi a các thi t b m ng Hình sau mô t h th ng th b c c a m tể ề ả ữ ế ị ạ ả ệ ố ứ ậ ủ ộ gói IP:
Hình I.1: Các t ng giao th c m ng trong các gói d li uầ ứ ạ ữ ệ
Trang 7Ethernet phiên b n 2 tuy không ph i là giao th c chu n nh ng nó đả ả ứ ẩ ư ượ ử ục s d ng r ngộ rãi trong m ng Ethernet H u h t các thi t b m ng k c h đi u hành Windowsạ ầ ế ế ị ạ ể ả ệ ề
m c đ nh dùng giao th c Ethernet phiên b n 2 đ truy n t i các gói IP.ặ ị ứ ả ể ề ả
Ph n đ u c a Ethernet phiên b n 2 là đ a ch MAC (Media Access Card) dùngầ ầ ủ ả ị ỉ
đ xác đ nh các thi t b trên m ng cùng v i s giao th c Ethernet xác đ nh giao th cể ị ế ị ạ ớ ố ứ ị ứ
t ng ti p theo ch a trong gói Ethernet M i gói Ethernet bao g m:ầ ế ứ ỗ ồ
Trang 8Đ a ch Ethernet (đ a ch MAC) là đ a ch c a các thi t b , đ a ch này đị ỉ ị ỉ ị ỉ ủ ế ị ị ỉ ược gán
b i các nhà s n xu t thi t b m ng và nó không thay đ i đở ả ấ ế ị ạ ổ ược M i thi t b trênỗ ế ị
m ng Ethernet ph i có 1 đ a ch MAC duy nh t Đ a ch MAC g m 2 ph n:ạ ả ị ỉ ấ ị ỉ ồ ầ
• 3 byte xác đ nh nhà s n xu tị ả ấ
• 3 byte xác đ nh s serial duy nh t c a nhà s n xu tị ố ấ ủ ả ấ
Gi n đ đ a ch Ethernet cho phép các đ a ch broadcast và multicast Đ i v iả ồ ị ỉ ị ỉ ố ớ
đ a ch broadcast thì t t c các bit c a đ a ch đích đị ỉ ấ ả ủ ị ỉ ược gán b ng 1ằ
(FFFFFFFFFFFF) M i thi t b m ng s ch p nh n các gói có đ a ch broadcast Đ aỗ ế ị ạ ẽ ấ ậ ị ỉ ị
ch này h u ích cho các giao th c ph i g i các gói truy v n đ n t t c các thi t bỉ ữ ứ ả ở ấ ế ấ ả ế ị
Trang 909-00-2B-03-xx-xx DEC default filtering by bridges
09-00-2B-04-00-00 DEC Local Area System Transport (LAST)09-00-2B-23-00-00 DEC Argonaut Console
09-00-77-00-00-01 Retix spanning tree bridges
VEthernet Protocol Type
M t ph n khác r t quan tr ng c a Ethernet Header là trộ ầ ấ ọ ủ ường Protocol Type,
trường này có kích thước hai byte S khác nhau gi a gói tin Ethernet phiên b n 2 vàự ữ ảEthernet 802.2 và 802.3 x y ra trả ở ường này Các gói tin Ethernet 802.2 và 802.3 sử
d ng trụ ường này đ cho bi t kích thể ế ướ ủc c a m t gói tin Ethernet Ethernet phiên b nộ ả
2 dùng trường này đ đ nh nghĩa giao th c t ng k ti p trong gói tin Ethernet M t sể ị ứ ầ ế ế ộ ố giá tr c a trị ủ ường này:
Trang 10Data payload ph i ch a t i thi u 46 byte đ đ m b o gói Ethernet có chi u dàiả ứ ố ể ể ả ả ề
t i thi u 64 byte N u ph n data ch a đ 46 byte thì các ký t đ m đố ể ế ầ ư ủ ự ệ ược thêm vàocho đ Kích thủ ướ ủc c a trường này t 46 đ n 1500 byte.ừ ế
VIIChecksum
Giá tr checksum cung c p c ch ki m tra l i cho d li u, kích thị ấ ơ ế ể ỗ ữ ệ ướ ủ c c a
trường này là 4 byte N u gói tin b h ng trong lúc truy n, giá tr checksum s b tínhế ị ỏ ề ị ẽ ịtoán sai và gói tin đó được đánh d u là gói tin x u.ấ ấ
VIIIT ng IP ầ
T ng IP đ nh nghĩa thêm nhi u trẩ ị ề ường thông tin c a c a giao th c Ethernetủ ủ ứ
Trang 11Hình I.3: Thông tin t ng IPầ
Các trường trong t ng IP:ầ
Version 4 Phiên b n IP header (phiên b n hi n t i là 4)ả ả ệ ạ
Header Length 4 Chi u dài ph n header c a gói IPề ầ ủ
Type of Service 8 Ki u ể ch t lấ ượng d ch vị ụ QoS (Quality of Service)
Total Length 16 Chi u dài c a gói IPề ủ
Identification 16 Giá tr ID duy nh t xác đ nh các gói IPị ấ ị
Flags 3 Cho bi t gói IP có b phân đo n hay không hay còn cácế ị ạ
phân đo n khácạFragment offset 13 V trí c a phân đo n trong gói IPị ủ ạ
Time to Live (TTL) 8 Th i gian t i đa gói tin đờ ố ược phép l i trên m ng (đở ạ ạ ượ c
tính b ng giây)ằProtocol 8 Ki u giao th c c a t ng d li u k ti pể ứ ủ ầ ữ ệ ế ế
Header Checksum 16 Checksum c a d li u gói IP ủ ữ ệ header
Source Address 32 Đ a ch IP c a thi t b g iị ỉ ủ ế ị ở
Destination
Address 32 Đ a ch IP c a thi t b nh nị ỉ ủ ế ị ậ
Trang 12Tr ườ ng Bit Mô Tả
Options Đ nh nghĩa các đ c đi m c a gói IP trong tị ặ ể ủ ươnglai
IXTr ườ ng đ a ch ị ỉ
Đ a ch Ethernet dùng đ xác đ nh các thi t b trên m ng LAN nh ng nó khôngị ỉ ể ị ế ị ạ ư
th dùng đ xác đ nh đ a ch c a các thi t b trên m ng xa Đ xác đ nh các thi t bể ể ị ị ỉ ủ ế ị ạ ở ể ị ế ị trên các m ng khác nhau, đ a ch IP đạ ị ỉ ược dùng M t đ a ch IP là m t s 32 bit và đ aộ ị ỉ ộ ố ị
ch IP đỉ ược chia thành 4 l p sau:ớ
M t trong nh ng ph c t p, r c r i c a gói IP là kích thộ ữ ứ ạ ắ ố ủ ướ ủc c a chúng Kích
thướ ốc t i đa c a gói IP có th lên đ n 65,536 byte Đây là m t lủ ể ế ộ ượng r t l n d li uấ ớ ữ ệ cho m t gói tin Th c t h u h t các truy n t i d li u c p th p nh Ethernetộ ự ế ầ ế ề ả ữ ệ ở ấ ấ ưkhông th h tr m t gói IP l n (ph n d li u c a Ethernet ch có th t i đa 1500ể ỗ ợ ộ ớ ầ ữ ệ ủ ỉ ể ốbyte) Đ gi i quy t v n đ này, các gói IP dùng fragmentation (phân đo n) đ chiaể ả ế ấ ề ạ ểcác gói IP thành các ph n nh h n đ truy n t i t i đích Khi các m nh đầ ỏ ơ ể ề ả ớ ả ược truy nề
t i t i đích, ph n m m c a thi t b nh n ph i có cách đ nh n ra các phân đo n c aả ớ ầ ề ủ ế ị ậ ả ể ậ ạ ủ gói tin và ráp chúng l i thành thành 1 gói IP.ạ
S phân đo n đự ạ ược thành l p nh vào vi c s d ng 3 trậ ờ ệ ử ụ ường c a gói IP:ủfragmentation flags, fragment offset, và trường identification C phân đo n bao g mờ ạ ồ
ba c m t bit sau:ờ ộ
• C reserved: giá tr zeroờ ị
• C Don’t Fragment: cho bi t gói IP không b phân đo nờ ế ị ạ
• C More Fragment: cho bi t gói tin b phân đo n và còn các phân đo n khácờ ế ị ạ ạ
n aữ
Trường IP Indentification xác đ nh duy nh t đ nh danh m i gói IP T t c cácị ấ ị ỗ ấ ảphân đo n c a b t kỳ gói IP nào cũng đ u có cùng s indentification S identificationạ ủ ấ ề ố ố
Trang 13giúp cho ph n m m máy nh n bi t đầ ề ậ ế ược các phân đo n nào thu c gói IP nào và rápạ ộ
l i cho đúng ạ
Trường fragment offset cho bi t v trí c a phân đo n trong gói tin ban đ u.ế ị ủ ạ ầ
XITr ườ ng Type of Service
Trường Type of Service xác đ nh ki u ch t lị ể ấ ượng d ch v QoS (ị ụ Quality of Service) cho gói IP Trường này được dùng đ đánh d u m t gói IP có m t đ uể ấ ộ ộ ộ ư tiên nào đó ch ng h n nh đẳ ạ ư ược dùng đ tăng đ u tiên c a các d li u c n th iể ộ ư ủ ữ ệ ầ ờ gian th c nh Video, Audio ự ư
Trong h u h t các truy n t i m ng, trầ ế ề ả ạ ường này được được thi t l p giá trế ậ ị zero, cho bi t đây là d li u bình thế ữ ệ ường, tuy nhiên v i các ng d ng c n th i gianớ ứ ụ ầ ờ
th c nh Video hay Audio thì trự ư ường này s đẽ ượ ử ục s d ng đ tăng đ u tiên cho góiể ộ ư
d li u Trữ ệ ường này g m tám bit và ý nghĩa các bit nh sau:ồ ư
• 3 bit được dùng làm trường u tiênư
• 1 bit cho bi t th i gian tr là bình thế ờ ễ ường hay th pấ
• 1 bit cho bi t thông lế ượng bình thường hay cao
• 1 bit cho bi t đ tin c y bình thế ộ ậ ường hay cao
• 2 bit được dùng trong tương lai
XIITr ườ ng Protocol
Được dùng đ xác đ nh giao th c t ng ti p theo trong gói IP, IANA đ nh nghĩaể ị ứ ầ ế ị
135 giá tr cho trị ường này có th dùng trong gói IP nh ng ch có m t s giá tr hayể ư ỉ ộ ố ị
được dùng trong b ng sau:ả
Hai giao th c đứ ược dùng nhi u nh t trong l p trình m ng là TCP và UDPề ấ ậ ạ
Trang 14Các nhà l p trình m ng ph i hi u cách ho t đ ng c b n c a TCP và đ c bi tậ ạ ả ể ạ ộ ơ ả ủ ặ ệ
là ph i hi u cách TCP truy n t i d li u gi các thi t b m ng Hình sau cho th yả ể ề ả ữ ệ ữ ế ị ạ ấ
nh ng trữ ường c a TCP Header Nh ng trủ ữ ường này ch a các thông tin c n thi t choứ ầ ế
vi c th c thi k t n i và truy n t i d li u m t cách tin tệ ự ế ố ề ả ữ ệ ộ ưởng
Hình I.4: Các trường c a TCP Headerủ
M i trỗ ường c a TCP Header k t h p v i m t ch c năng đ c bi t c a m tủ ế ợ ớ ộ ứ ặ ệ ủ ộ phiên làm vi c TCP Có m t s ch c năng quan tr ng sau:ệ ộ ố ứ ọ
• Source port và Destination port: theo dõi các k t n i gi a các thi t b ế ố ữ ế ị
Trang 15• Sequence và Acknowledgement number: theo dõi th t các gói tin và truy nứ ự ề
• Đ a ch IP c a thi t b xaị ỉ ủ ế ị ở
• TCP port được gán cho thi t b xaế ị ở
Đ k t n i TCP để ế ố ược thành l p, thi t b xa ph i ch p nh n các gói tinậ ế ị ở ả ấ ậ
truy n đ n port đã đề ế ược gán B i vì có nhi u ng d ng ch y trên m t thi t b sở ề ứ ụ ạ ộ ế ị ử
d ng TCP do đó thi t b ph i c p phát các c ng khác nhau cho các ng d ng khácụ ế ị ả ấ ổ ứ ụnhau
Hình I.5: K t n i TCP đ n gi nế ố ơ ả
Trong hình trên thì thi t b A đang ch y hai ng d ng Server, hai ng d ng nàyế ị ạ ứ ụ ứ ụđang ch các gói tin t Client M t ng d ng đờ ừ ộ ứ ụ ược gán port 8000 và m t ng d ngộ ứ ụ
được gán port 9000 Thi t b m ng B mu n k t n i đ n thi t b m ng A thì nó ph iế ị ạ ố ế ố ế ế ị ạ ả
được gán m t TCP port còn tr ng t h đi u hành và port này s độ ố ừ ệ ề ẽ ược m trong su tở ố phiên làm vi c Các port Client thệ ở ường không quan tr ng và có th gán b t kỳ m tọ ể ấ ộ port nào h p l trên thi t b ợ ệ ế ị
Trang 16T h p c a m t đ a ch IP và m t port là m t IP endpoint M t phiên làm vi cổ ợ ủ ộ ị ỉ ộ ộ ộ ệ TCP được đ nh nghĩa là m t s k t h p c a m t IP endpoint c c b và m t IPị ộ ự ế ợ ủ ộ ụ ộ ộ
endpoint xa M t ng d ng m ng có th s d ng cùng m t IP endpoint c c bở ộ ứ ụ ạ ể ử ụ ộ ụ ộ
nh ng m i thi t b xa ph i s d ng m t đ a ch IP hay port riêng.ư ỗ ế ị ở ả ử ụ ộ ị ỉ
IANA đ nh nghĩa m t danh sách các port TCP tiêu chu n đị ộ ẩ ược gán cho các ngứ
(LDAP)
Các port t 0->1023 đừ ược gán cho các ng d ng thông d ng do đó v i các ngứ ụ ụ ớ ứ
d ng mà các l p trình viên t o ra thì các port đụ ậ ạ ược gán ph i t 1024->65535.ả ừ
XVC ch đ m b o đ tin c y ơ ế ả ả ộ ậ truy n t i các gói tin ề ả
Trang 17Trường ti p theo trong TCP Header sau port là s sequence vàế ố
acknowledgement Nh ng giá tr này cho phép TCP theo dõi các gói tin và đ m b o nóữ ị ả ả
được nh n theo đúng th t N u b t kỳ gói tin nào b l i, TCP s yêu c u truy n t iậ ứ ự ế ấ ị ỗ ẽ ầ ề ả
l i các gói tin b l i và ráp chúng l i trạ ị ỗ ạ ước khi g i gói tin cho ng d ng.ở ứ ụ
M i gói tin có m t s duy nh t sequence cho m t phiên làm vi c TCP M t sỗ ộ ố ấ ộ ệ ộ ố
ng u nhiên đẫ ược ch n cho gói tin đ u tiên đọ ầ ược g i đi trong phiên làm vi c M i góiở ệ ỗtin ti p theo đế ược g i s tăng s sequence b ng s byte d li u TCP trong gói tinở ẽ ố ằ ố ữ ệ
trước đó Đi u này đ m b o m i gói tin đề ả ả ỗ ược xác đ nh duy nh t trong lu ng d li uị ấ ồ ữ ệ TCP
Thi t b nh n s d ng trế ị ậ ử ụ ường acknowledgement đ h i báo s sequence cu iể ồ ố ố cùng được nh n t thi t b g i Thi t b nh n có th nh n nhi u gói tin trậ ừ ế ị ở ế ị ậ ể ậ ề ước khi g iở
l i m t h i báo S acknowledgement đạ ộ ồ ố ược tr v là s sequence cao nh t li n sauả ề ố ấ ề
c a d li u đủ ữ ệ ược nh n K thu t này đậ ỹ ậ ược g i là c a s trọ ử ổ ượt Các gói tin đượ c
nh n ngoài th t có th đậ ứ ự ể ược gi trong b đ m và đữ ộ ệ ược đ t vào đúng th t khi cácặ ứ ựgói tin khác đã được nh n thành công N u m t gói tin b m t, thi t b nh n s th yậ ế ộ ị ấ ế ị ậ ẽ ấ
đượ ốc s sequence b l i và g i m t s acknowledgement th p h n đ yêu c u các góiị ỗ ở ộ ố ấ ơ ể ầtin b l i N u không có c a s trị ỗ ế ử ổ ượt m i gói tin s ph i h i báo l i, làm tăng băngỗ ẽ ả ồ ạthông và đ tr m ng.ộ ễ ạ
1-bit ACK flag H i báo nh n m t gói tin ồ ậ ộ
1-bit PUSH flag Cho bi t d li u đế ữ ệ ược đ y vào ng d ng ngay l p t c ẩ ứ ụ ậ ứ1-bit RESET flag Thi t l p l i tình tr ng kh i đ u k t n i TCPế ậ ạ ạ ở ầ ế ố
1-bit SYN flag B t đ u m t phiên làm vi c ắ ầ ộ ệ
1-bit FIN flag K t thúc m t phiên làm vi c ế ộ ệ
Trang 18TCP s d ng các tình tr ng k t n i đ quy t đ nh tình tr ng k t n i gi a cácử ụ ạ ế ố ể ế ị ạ ế ố ữthi t b M t giao th c b t tay đ c bi t đế ị ộ ứ ắ ặ ệ ược dùng đ thành l p nh ng k t n i này vàể ậ ữ ế ốtheo dõi tình tr ng k t n i trong su t phiên làm vi c ạ ế ố ố ệ M t phiên làm vi c TCP g mộ ệ ồ
ba pha sau:
• M b t tayở ắ
• Duy trì phiên làm vi c ệ
• Đóng b t tayắ
M i pha yêu c u các bit c đỗ ầ ờ ược thi t l p trong m t th t nào đó Quá trìnhế ậ ộ ứ ự
m b t tay thở ắ ường được g i là ba cái b t tay và nó yêu c u ba bọ ắ ầ ước đ thành l p k tể ậ ế
n i.ố
• Thi t b g i g i c SYN cho bi t b t đ u phiên làm vi c ế ị ở ở ờ ế ắ ầ ệ
• Thi t b nh n g i c c SYN và c ACK trong cùng m t gói tin cho bi t nóế ị ậ ở ả ờ ờ ộ ế
• Thi t b kh i đ u đóng k t n i g i c FINế ị ở ầ ế ố ở ờ
• Thi t b bên kia g i c FIN và ACK trong cùng m t gói tin cho bi t nó ch pế ị ở ờ ộ ế ấ
nh n đóng k t n iậ ế ố
• Thi t b kh i đ u đóng k t n i g i c ACK đ đóng k t n i ế ị ở ầ ế ố ở ờ ể ế ố
Trang 19Hình I.6: Các bước b t tay c a giao th c TCPắ ủ ứ
XVIIT ng UDP ầ
User Datagram Protocol (UDP) là m t giao th c ph bi n khác độ ứ ổ ế ược dùngtrong vi c truy n t i d li u c a các gói IP Không gi ng nh TCP, UDP là giao th cệ ề ả ữ ệ ủ ố ư ứ phi n i k t M i phiên làm vi c UDP không gì khác h n là truy n t i m t gói tin theoố ế ỗ ệ ơ ề ả ộ
m t hộ ướng Hình sau s mô t c u trúc c a m t gói tin UDPẽ ả ấ ủ ộ
Trang 20Hình I.7: UDP Header
UDP header g m nh ng trồ ữ ường sau:
• Source Port
• Destination Port
• Message Length
• Checksum
• Next Level Protocol
Cũng gi ng nh TCP, UDP theo dõi các k t n i b ng cách s d ng các port tố ư ế ố ằ ử ụ ừ 1024->65536, các port UDP t 0->1023 là các port dành riêng cho các ng d ng phừ ứ ụ ổ
bi n, m t s dùng ph bi n nh :ế ộ ố ổ ế ư
Trang 21Port Mô Tả
Trang 22XVIIICH ƯƠ NG II: L P TRÌNH SOCKET Ậ
H ƯỚ NG K T N I Ế Ố
XIXSocket
Trong l p trình m ng dùng Socket, chúng ta không tr c ti p truy c p vào cácậ ạ ự ế ậthi t b m ng đ g i và nh n d li u Thay vì v y, m t file mô t trung gian đế ị ạ ể ở ậ ữ ệ ậ ộ ả ượ c
t o ra đ đi u khi n vi c l p trình Các file mô t dùng đ tham chi u đ n các k tạ ể ề ể ệ ậ ả ể ế ế ế
n i m ng đố ạ ược g i là các Socket Socket đ nh nghĩa nh ng đ c tr ng sau:ọ ị ữ ặ ư
• M t k t n i m ng hay m t độ ế ố ạ ộ ường ng d n đ truy n t i d li uố ẫ ể ề ả ữ ệ
• M t ki u truy n thông nh stream hay datagramộ ể ề ư
• M t giao th c nh TCP hay UDP ộ ứ ư
Sau khi m t Socket độ ượ ạc t o ra nó ph i đả ược g n vào m t đ a ch m ng vàắ ộ ị ỉ ạ
m t port trên h th ng c c b hay xa M t khi Socket đã độ ệ ố ụ ộ ở ộ ược g n vào các đ a chắ ị ỉ
m ng và port, nó có th đạ ể ược dùng đ g i và nh n d li u trong m ng.ể ở ậ ữ ệ ạ
Trong Net Framework l p Socket h tr cho vi c l p trình Socket Phớ ỗ ợ ệ ậ ươ ng
th c t o l p nh sau: ứ ạ ậ ư
Socket (AddressFamily, SocketType, ProtocolType)
Phương th c t o l p c a l p Socket c n các đ i s truy n vào sau:ứ ạ ậ ủ ớ ầ ố ố ề
+AddressFamily: h đ a ch đọ ị ỉ ược dùng, tham s này có th có các giá tr sau:ố ể ị
AppleTalk Đ a ch AppleTalkị ỉ
Atm Native ATM services address
Banyan Đ a ch Banyan ị ỉ
Ccitt Đ a ch cho giao th c CCITT, nh là X25ị ỉ ứ ư
Chaos Đ a ch cho giao th c MIT CHAOSị ỉ ứ
Cluster Đ a ch cho các s n ph m cluster c a Microsoftị ỉ ả ẩ ủ
DataKit Đ a ch cho giao th c Datakitị ỉ ứ
DataLink Đ a ch c a giao th c t ng data-link ị ỉ ủ ứ ầ
DecNet Đ a ch DECnet ị ỉ
Trang 23Ecma Đ a ch ECMA (European Computer Manufacturersị ỉ
Association)
FireFox Đ a ch FireFox ị ỉ
HyperChannel Đ a ch NSC Hyperchannel ị ỉ
Ieee12844 Đ a ch workgroup IEEE 1284.4ị ỉ
ImpLink Đ a ch ARPANET IMP ị ỉ
Osi Đ a ch cho giao th c ISO ị ỉ ứ
Pup Đ a ch cho giao th c PUP ị ỉ ứ
Sna Đ a ch IBM SNAị ỉ
Dgram Đượ ử ục s d ng trong các giao th c phi k t n i, không tin tứ ế ố ưởng
Thông đi p có th b m t, b trùng l p ho c có th đ n sai th t ệ ể ị ấ ị ặ ặ ể ế ứ ự
Dgram s d ng giao th c ử ụ ứ UDP và h đ a ch InterNetwork.ọ ị ỉ
Trang 24Raw Đượ ửc s trong các giao th c c p th p nh Internet Control Messageứ ấ ấ ư
Protocol (Icmp) và Internet Group Management Protocol (Igmp)
ng d ng ph i cung c p IP header khi g i Khi nh n s nh n đ c
IP header và các tùy ch n tọ ương ng.ứ
Rdm Đượ ử ục s d ng trong các giao th c phi k t n i, hứ ế ố ướng thông đi p,ệ
truy n thông đi p tin c y, và biên c a thông đi p đề ệ ậ ủ ệ ược b o v ả ệ Rdm (Reliably Delivered Messages) thông đi p đ n không b trùngệ ế ị
l p và đúng th t H n n a, thi t b nh n đặ ứ ự ơ ữ ế ị ậ ược thi t b n u thôngế ị ế
đi p b m t N u kh i t o ệ ị ấ ế ở ạ Socket dùng Rdm, ta không c n yêu c uầ ầ
k t n i t i host xa trế ố ớ ở ước khi g i và nh n d li u ở ậ ữ ệ
Seqpacket Cung c p hấ ướng k t n i và truy n 2 chi u các dòng byte m t cáchế ố ề ề ộ
tin c y Seqpacket không trùng l p d li u và b o v biên d li u.ậ ậ ữ ệ ả ệ ữ ệ
Socket ki u ể Seqpacket truy n thông v i 1 máy đ n và yêu c u k tề ớ ơ ầ ế
n i trố ước khi truy n d li u.ề ữ ệ
Stream Đượ ử ục s d ng trong các giao th c hứ ướng k t n i, không b trùngế ố ị
l p d li u, không b o v biên d li u ặ ữ ệ ả ệ ữ ệ Socket ki u Stream chể ỉ truy n thông v i m t máy đ n và yêu c u k t n i trề ớ ộ ơ ầ ế ố ước khi truy nề
d li u ữ ệ Stream dùng giao th c Transmission Control Protocol (ứ Tcp)
và h đ a ch ọ ị ỉ InterNetwork Unknown Ch a bi t ki u ư ế ể Socket
+ProtocolType: ki u giao th c, tham s này có th có các giá tr sau:ể ứ ố ể ị
Icmp Internet Control Message Protocol
Igmp Internet Group Management Protocol
IPSecAuthenticationHeader IPv6 Authentication
IPSecEncapsulatingSecurityPayload IPv6 Encapsulating Security Payload
header
IPv6 Internet Protocol version 6 (IPv6)
Trang 25Ipx Internet Packet Exchange Protocol
protocol
IPAddress là m t đ i tộ ố ượng dùng đ mô t m t đ a ch IP, đ i tể ả ộ ị ỉ ố ượng này có
th để ượ ử ục s d ng trong nhi u phề ương th c c a Socket M t s phứ ủ ộ ố ương th c c aứ ủ
network byte orderIsLoopBack Cho bi t đ a ch IP có ph i là đ a chế ị ỉ ả ị ỉ
LoopBack hay khôngNetworkToHostOrder Chuy n 1 đ a ch IP t ể ị ỉ ừ network byte order
thành host byte orderParse Chuy n 1 chu i thành 1 th hi n IPAddressể ỗ ể ệToString Chuy n 1 đ i tể ố ượng IPAddress thành m tộ
chu iỗ
Trang 26Phương th c Parse() thứ ường được dùng đ t o ra 1 th hi nể ạ ể ệ c a IPAddress:ủ
IPAddress localIpAddress = IPAddress Parse( "127.0.0.1" );
L p IPAddress cũng cung c p 4 thu c tính đ mô t các đ a ch IP đ c bi t:ớ ấ ộ ể ả ị ỉ ặ ệ
• Any: dùng đ mô t m t đ a ch IP b t kỳ c a h th ng.ể ả ộ ị ỉ ấ ủ ệ ố
• Broadcast: dùng đ mô t đ a ch IP Broadcast cho m ng c c bể ả ị ỉ ạ ụ ộ
• Loopback: dùng đ mô t đ a ch loopback c a h th ng ể ả ị ỉ ủ ệ ố
• None: không dùng đ a ch IPị ỉ
XXIIPEndPoint
IPEndPoint là m t đ i tộ ố ượng mô t s k t h p c a m t đ a ch IP và port Đ iả ự ế ợ ủ ộ ị ỉ ố
tượng IPEndPoint được dùng đ g n k t các Socket v i các đ a ch c c b ho c cácể ắ ế ớ ị ỉ ụ ộ ặ
đ a ch xa ị ỉ ở
Hai thu c tính c a IPEndPoint có th độ ủ ể ược dùng đ l y để ấ ược vùng các porttrên h th ng là MinPort và MaxPortệ ố
XXIIL p trình Socket h ậ ướ ng k t n i ế ố
Trong l p trình Socket hậ ướng k t n iế ố , giao th c TCP đứ ược dùng đ thành l pể ậ phiên làm vi c gi a hai endpoint Khi s d ng giao th c TCP đ thành l p k t n i taệ ữ ử ụ ứ ể ậ ế ố
ph i đàm phán k t n i trả ế ố ước nh ng khi k t n i đã đư ế ố ược thành l p d li u có thậ ữ ệ ể truy n đi gi a các thi t b m t cách tin tề ữ ế ị ộ ưởng
Đ l p trình Socket hể ậ ướng k t n i ta ph i th c hi n m t lo t các thao tácế ố ả ự ệ ộ ạ
gi a clien và ữ Server nh trong mô hình bên dư ưới
Trang 27Hình II.1: Mô hình l p trình Socket hậ ướng k t n i ế ố
XXIIIL p trình phía Server ậ
Đ u tiên Server s t o m t Socket, Socket này s đầ ẽ ạ ộ ẽ ược g n vào m t đ a ch ipắ ộ ị ỉ
và m t port c c b , hàm đ th c hi n vi c này là hàm Bind() Hàm này c n m t danhộ ụ ộ ể ự ệ ệ ầ ộ
đ i s là m t IPEndPoint c c b : ố ố ộ ụ ộ
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
server.Bind(ipep);
B i vì ở Server thường ch p nh n k t n i trên chính đ a ch IP và port riêng c aấ ậ ế ố ị ỉ ủ
nó nên ta dùng IPAddress Any đ ch p nh n k t n i trên b t kỳ card m ng nàoể ấ ậ ế ố ấ ạ
Đ a ch IP ta dùng đây là đ a ch IP version 4 và ki u giao th c là TCP nênị ỉ ở ị ỉ ể ứAddressFamily là InterNetwork và SocketType là Stream
Sau khi Socket đã được g n k t vào m t đ a ch và m t port, Server ph i s nắ ế ộ ị ỉ ộ ả ẵ sàng ch p nh n k t n i t Client Vi c này đấ ậ ế ố ừ ệ ược th c hi n nh vào hàmự ệ ờListen().Hàm Listen() có m t đ i s , đó chính là s Client t i đa mà nó l ng nghe.ộ ố ố ố ố ắserver.Listen(10);
Ti p theo ế Server dùng hàm Accept() đ ch p nh n k t n i t Client:ể ấ ậ ế ố ừ
Socket client = server.Accept();
Trang 28Hàm Accept() này s d ng Server l i và ch cho đ n khi nào có Client k tẽ ừ ạ ờ ế ế
n i đ n nó s tr v m t Socket khác, Socket này đố ế ẽ ả ề ộ ược dùng đ trao đ i d li u v iể ổ ữ ệ ớ Client Khi đã ch p nh n k t n i v i Client thì Server có th g i và nh n d li u v iấ ậ ế ố ớ ể ở ậ ữ ệ ớ Client thông qua phương th c Send() và Receive().ứ
string welcome = "Hello Client" ;
buff = Encoding ASCII.GetBytes(welcome);
client.Send(buff, buff.Length, SocketFlags None);
Phương th c Send() c a Socket dùng đ g i d li u, phứ ủ ể ở ữ ệ ương th c này có m tứ ộ
s đ i s quan tr ng sau:ố ố ố ọ
Buff : m ng các byte c n g iả ầ ở
Offset: v trí đ u tiên trong m ng c n g iị ầ ả ầ ở
Size: s byte c n g iố ầ ở
SocketFlags: ch ra cách g i d li u trên Socketỉ ở ữ ệ
Vi c g i và nh n d li u đệ ở ậ ữ ệ ược th c hi n liên t c thông qua m t vòng l p vôự ệ ụ ộ ặ
Console WriteLine( Encoding ASCII.GetString(buff, 0, recv));
client.Send(buff, recv, SocketFlags None);
}
Phương th c Receive() đ t d li u vào buffer, kích thứ ặ ữ ệ ước buffer được thi tế
l p l i, do đó n u buffer không đậ ạ ế ược thi t l p l i, l n g i phế ậ ạ ầ ọ ương th c Receive() kứ ế
ti p s ch có th nh n đế ẽ ỉ ể ậ ược d li u t i đa b ng l n nh n d li u trữ ệ ố ằ ầ ậ ữ ệ ước
Phương th c này có ứ m t s đ i s quan tr ng sau:ộ ố ố ố ọ
Buff : m ng các byte c n g iả ầ ở
Offset: v trí đ u tiên trong m ng c n nh nị ầ ả ầ ậ
Size: s byte c n g iố ầ ở
Trang 29 SocketFlags: ch ra cách nh n d li u trên Socketỉ ậ ữ ệ
Phương th c Receive() tr v s byte d li u nh n đứ ả ề ố ữ ệ ậ ượ ừc t Client N uế không có d li u đữ ệ ược nh n, phậ ương th c Receive() s b d ng l i và ch cho t iứ ẽ ị ừ ạ ờ ớ khi có d li u Khi Client g i tín hi u k t thúc phiên làm vi c (b ng cách g i c FINữ ệ ở ệ ế ệ ằ ở ờtrong gói TCP), phương th c Receive() s tr v giá tr 0 Khi phứ ẽ ả ề ị ương th c Receive()ứ
tr v giá tr 0, ta đóng Socket c a Client l i b ng phả ề ị ủ ạ ằ ương th c Close() Socket chínhứ(Server Socket) v n còn ho t đ ng đ ch p nh n các k t n i khác N u không mu nẫ ạ ộ ể ấ ậ ế ố ế ố Client nào k t n i đ n n a thì ta đóng Server l i luôn:ế ố ế ữ ạ
Console WriteLine( "Dang cho Client ket noi den " );
//Hàm Accept() s block server l i cho đ n khi có Client k t n i đ n ẽ ạ ế ế ố ế Socket client = server.Accept();
//Client EndPoint
IPEndPoint clientep = ( IPEndPoint )client.RemoteEndPoint;
Trang 30Console WriteLine( "Da ket noi voi Client {0} tai port {1}" ,
clientep.Address, clientep.Port);
string welcome = "Hello Client" ;
//Chuy n chu i thành m ng các byte ể ỗ ả
buff = Encoding ASCII.GetBytes(welcome);
//G i câu chào cho Client ở
client.Send(buff, buff.Length, SocketFlags None);
Trang 31Hình II.2: K t qu tr v sau khi telnet vào ế ả ả ề Server local t i port 5000ạ
Sau khi dùng l nh telnet, k t qu tr v nh trên hình là đã k t n i thành côngệ ế ả ả ề ư ế ố
XXIVL p trình phía Client ậ
L p trình Socket hậ ướng k t n i phía Client đ n gi n h n phía Server Clientế ố ơ ả ơcũng ph i g n k t m t đ a ch c a m t Socket đã đả ắ ế ộ ị ỉ ủ ộ ược t o ra nh ng s d ngạ ư ử ụ
phương th c Connect() ch không s d ng phứ ứ ử ụ ương th c Bind() gi ng nh phíaứ ố ưServer Phương th c Connect() yêu c u m t IPEndPoint c a Server mà Client c n k tứ ầ ộ ủ ầ ế
Trang 32}
Phương th c Connect() s d ng l i cho đ n khi ứ ẽ ừ ạ ế Client k t n i đế ố ược v iớ Server N u k t n i không th đế ế ố ể ược th c hi n thì nó s phát sinh ra m t bi t l , doự ệ ẽ ộ ệ ệ
đó hàm Connect() tra ph i đ trong kh i try, catch đ không b l i chả ể ố ể ị ỗ ương trình
Khi k t n i đế ố ược thành l p, Client có th dùng phậ ể ương th c Send() vàứReceive() c a l p Socket đ g i và nh n d li u tủ ớ ể ở ậ ữ ệ ương t nh Server đã làm Khiự ưquá trình trao đ i d li u đã hoàn t t, đ i tổ ữ ệ ấ ố ượng Socket ph i đả ược đóng l i ClientạSocket dùng phương th c Shutdown() đ d ng Socket và dùng phứ ể ừ ương th c Close()ứ
đ th c s đóng phiên làm vi c Phể ự ự ệ ương th c Shutdown() c a Socket dùng m t thamứ ủ ộ
s đ quy t đ nh cách Socket s d ng l i Các phố ể ế ị ẽ ừ ạ ương th c đó là:ứ
SocketShutdown.Both Ngăn c n g i và nh n d li u trên ả ở ậ ữ ệ Socket
SocketShutdown.Receive Ngăn c n nh n d li u trên ả ậ ữ ệ Socket C RST s đờ ẽ ược g iở
n u có thêm d li u đế ữ ệ ược nh n.ậSocketShutdown.Send Ngăn c n g i d li u trên ả ở ữ ệ Socket C FIN s đờ ẽ ược g i sauở
khi t t c d li u còn l i trong buffer đã đấ ả ữ ệ ạ ược g i đi.ở
byte [] buff = new byte [1024];
//Chu i nh p vào và chu i nh n đ ỗ ậ ỗ ậ ượ c
string input, stringData;
Trang 33//Hàm Connect() s b block l i và ch khi k t n i đ ẽ ị ạ ờ ế ố ượ c v i server thì ớ
input = Console ReadLine();
//N u nh p exit thì thoát và đóng Socket ế ậ
Trang 34XXVV n đ v i b đ m d li u ấ ề ớ ộ ệ ữ ệ
Trong ví d ụ Client, Server đ n gi n trên thì m t m ng các byte đơ ả ộ ả ược dùng như
là b đ m đ g i và nh n d li u trên Socket B i vì chộ ệ ể ở ậ ữ ệ ở ương trình được ch y trongạmôi trường được đi u khi n, t t c các thông đi p đ u thu c d ng text và kíchề ể ấ ả ệ ề ộ ạ
thước nh nên lo i buffer này không ph i là m t v n đ ỏ ạ ả ộ ấ ề
Trong th gi i th c, chúng ta không bi t kích thế ớ ự ế ước và ki u d li u ể ữ ệ đ n trongếkhi truy n thông gi a Client và Server V n đ x y ra khi khi d li u đ n l n h nề ữ ấ ề ả ữ ệ ế ớ ơ kích thước b đ m d li u ộ ệ ữ ệ
Khi nh n d li u thông qua TCP, d li u đậ ữ ệ ữ ệ ượ ưc l u tr trong b đ m hữ ộ ệ ệ
th ng M i khi g i phố ỗ ọ ương th c Receive(), nó s đ c d li u t b đ m TCP và l yứ ẽ ọ ữ ệ ừ ộ ệ ấ
d li u ra kh i b đ m S lữ ệ ỏ ộ ệ ố ượng d li u đữ ệ ược đ c b i phọ ở ương th cứ Receive()
được đi u khi n b i hai y u t sau: ề ể ở ế ố
• Kích thước b đ m d li u độ ệ ữ ệ ược ch ra trong phỉ ương th c Receive()ứ
• Kích thước b đ m độ ệ ược ch ra trong tham s c a phỉ ố ủ ương th c Receive()ứTrong ví d đ n gi n trên, buffer đụ ơ ả ược đ nh nghĩa là m t m ng byte kíchị ộ ả
thước 1024 B i vì kích thở ước d li u không đữ ệ ược ch ra trong phỉ ương th cứ Receive() nên kích thước b đ m t đ ng l y kích thộ ệ ự ộ ấ ước m c đ nh c a b đ m dặ ị ủ ộ ệ ữ
li u là 1024 byte Phệ ương th c Receive() s đ c 1024 byte d li u m t l n và đ t dứ ẽ ọ ữ ệ ộ ầ ặ ữ
li u đ c đệ ọ ược vào bi n buffế
stringData = Encoding ASCII.GetString(buff, 0, byteReceive);
Trong đ i s c a hàm GetString, ta ph i truy n vào s byte th c s đã đ cố ố ủ ả ề ố ự ự ọ
được n u không ta s nh n đế ẽ ậ ược m t chu i v i các byte th a đ ng sau.ộ ỗ ớ ừ ở ằ
XXVIX lý v i các b đ m có kích th ử ớ ộ ệ ướ c nh ỏ
Trang 35H đi u hành Window dùng b đ m TCP đ g i và nh n d li u Đi u này làệ ề ộ ệ ể ở ậ ữ ệ ề
c thi t đ TCP có th g i l i d li u b t c lúc nào c n thi t M t khi d li u đãầ ế ể ể ở ạ ữ ệ ấ ứ ầ ế ộ ữ ệ
được h i báo nh n thành công thì nó m i đồ ậ ớ ược xóa kh i b đ m ỏ ộ ệ
Hình II.3: TCP Buffer
D li u đ n cũng đữ ệ ế ược ho t đ ng theo cách tạ ộ ương t Nó s l i trong bự ẽ ở ạ ộ
đ m cho đ n khi phệ ế ương th c Receive() đứ ược dùng đ đ c nó N u phể ọ ế ương th cứ Receive() không đ c toàn b d li u trong b đ m, ph n còn l i v n đọ ộ ữ ệ ở ộ ệ ầ ạ ẫ ược n m ằ ở
đó và ch phờ ương th c Receive() ti p theo đứ ế ược đ c D li u s không b m tọ ữ ệ ẽ ị ấ
nh ng chúng ta s không l y đư ẽ ấ ược các đo n d li u mình mong mu n ạ ữ ệ ố
Đ th y để ấ ược v n đ , ta ti n hành thay đ i kích thấ ề ế ổ ước b đ m t 1024 byteộ ệ ừ
xu ng còn 10 byte Và ch y l i chố ạ ạ ương trình Client, Server đ n gi n trên ơ ả
Trang 36Hình II.4: K t qu tr v khi ch y chế ả ả ề ạ ương trình v i ớ buffer nhỏ
B i vì b đ m d li u không đ l n đ l y h t d li u b đ m TCP nênở ộ ệ ữ ệ ủ ớ ể ấ ế ữ ệ ở ộ ệ
phương th c ứ Receive() ch có th l y đỉ ể ấ ược m t lộ ượng d li u có đ l n đúng b ngữ ệ ộ ớ ằ
đ l n c a b đ m d li u, ph n còn l i v n n m b đ m TCP và nó độ ớ ủ ộ ệ ữ ệ ầ ạ ẫ ằ ở ộ ệ ượ ấ c l ykhi g i l i phọ ạ ương th c ứ Receive() Do đó câu chào Client c a Server ph i dùng t i haiủ ả ớ
l n g i phầ ọ ương th c ứ Receive() m i l y đớ ấ ược h t Trong l n g i và nh n d li u kế ầ ở ậ ữ ệ ế
ti p, đo n d li u ti p theo đế ạ ữ ệ ế ược đ c t b đ m TCP do đó n u ta g i d li u v iọ ừ ộ ệ ế ở ữ ệ ớ kích thướ ớc l n h n 10 byte thì khi nh n ta ch nh n đơ ậ ỉ ậ ược 10 byte đ u tiên ầ
B i vì v y nên trong khi l p trình m ng chúng ta ph i quan tâm đ n vi c đ cở ậ ậ ạ ả ế ệ ọ
d li u t b đ m ữ ệ ừ ộ ệ TCP m t cách chính xác B đ m quá nh có th d n đ n tìnhộ ộ ệ ỏ ể ẫ ế
tr ng thông đi p nh n s không kh p v i thông đi p g i, ngạ ệ ậ ẽ ớ ớ ệ ở ượ ạ ộ ệc l i b đ m quá l nớ
s làm cho các thông đi p b tr n l i, khó x lý Vi c khó nh t là làm sao phân bi tẽ ệ ị ộ ạ ử ệ ấ ệ
được các thông đi p đệ ược đ c t Socket.ọ ừ
XXVIIV n đ v i các thông đi p TCP ấ ề ớ ệ
M t trong nh ng khó khăn c a nh ng nhà l p trình m ng khi s d ng giaoộ ữ ủ ữ ậ ạ ử ụ
th c TCP đ chuy n d li u là giao th c này không quan tâm đ n biên d li u ứ ể ể ữ ệ ứ ế ữ ệ
Trang 37Hình II.5: Client Send hai l n r i Server m i Receiveầ ồ ớ
Nh trên hình v n đ x y ra khi truy n d li u là không đ m b o đư ấ ề ả ề ữ ệ ả ả ược m iỗ
phương th c Send() s không đứ ẽ ược đ c b i m t phọ ở ộ ương th c Receive() T t c dứ ấ ả ữ
li u đệ ược đ c t phọ ừ ương th c Receive() không th c s đứ ự ự ược đ c tr c ti p t m ngọ ự ế ừ ạ
mà nó được đ c t b đ m TCP Khi các gói tin TCP đọ ừ ộ ệ ược nh n t m ng s đậ ừ ạ ẽ ượ c
đ t theo th t trong b đ m TCP M i khi phặ ứ ự ộ ệ ỗ ương th c Receive() đứ ược g i, nó sọ ẽ
đ c d li u trong b đ m TCP, không quan tâm đ n biên d li u ọ ữ ệ ộ ệ ế ữ ệ
Chúng ta hãy xem xét ví d sau, Ch ụ ươ ng Trình BadTCPServer:
Trang 38server.Bind(ipep);
//Server l ng nghe t i đa 10 k t n i ắ ố ế ố
server.Listen(10);
Console WriteLine( "Dang cho Client ket noi den " );
//Hàm Accept() s block server l i cho đ n khi có Client k t n i đ n ẽ ạ ế ế ố ế Socket client = server.Accept();
//Client EndPoint
IPEndPoint clientep = ( IPEndPoint )client.RemoteEndPoint;
Console WriteLine( "Da ket noi voi Client {0} tai port {1}" ,
clientep.Address, clientep.Port);
string welcome = "Hello Client" ;
//Chuy n chu i thành m ng các byte ể ỗ ả
buff = Encoding ASCII.GetBytes(welcome);
//G i câu chào cho Client ở
client.Send(buff, buff.Length, SocketFlags None);
for ( int i = 0; i < 5; i++)
{
byteReceive = client.Receive(data);
Console WriteLine( Encoding ASCII.GetString(data, 0, byteReceive)); }
Trang 39M i khi đỗ ược g i, phọ ương th c Receive() đ c toàn b d li u trong b đ mứ ọ ộ ữ ệ ộ ệ TCP, sau khi nh n năm thông đi p, k t n i đậ ệ ế ố ược đóng l i ạ
byte [] buff = new byte [10];
//Chu i nh p vào và chu i nh n đ ỗ ậ ỗ ậ ượ c
string input, stringData;
server.Send( Encoding ASCII.GetBytes( "Thong diep 1" ));
server.Send( Encoding ASCII.GetBytes( "Thong diep 2" ));
Trang 40server.Send( Encoding ASCII.GetBytes( "Thong diep 3" ));
server.Send( Encoding ASCII.GetBytes( "Thong diep 4" ));
server.Send( Encoding ASCII.GetBytes( "Thong diep 5" ));
Console WriteLine( "Dong ket noi voi server " );
K t qu ch ế ả ươ ng trình nh hình bên d ư ướ i
Hình II.6: K t qu trên Serverế ảTrong l n g i phầ ọ ương th c Receive() l n đ u tiên, phứ ầ ầ ương th c này nh n toànứ ậ
b d li u t phộ ữ ệ ừ ương th c Send() c a Client g i lên, trong l n g i phứ ủ ở ầ ọ ương th cứ Receive() l n th hai, phầ ứ ương th c Receive() đ c d li u t hai phứ ọ ữ ệ ừ ương th c Send()ứ
và m t phộ ương th c Send() khác g i d li u ch a xong Trong l n g i th ba thìứ ở ữ ệ ư ầ ọ ứ
phương th c Receive() s đ c h t d li u đang đứ ẽ ọ ế ữ ệ ược g i d t phở ở ừ ương th c Send()ứ
và đ c d li u đọ ữ ệ ược g i t phở ừ ương th c Send() cu i cùng và sau khi Client th c hi nứ ố ự ệ