Tài liệu Khóa luận Tìm hiểu xây dựng ứng dụng bắt gói tin cho việc phân tích thông tin mạng phục vụ quản lý: TRѬӠNG ĈҤI HӐC KHOA HӐC TӴ NHIÊN
KHOA CÔNG NGHӊ THÔNG TIN
%Ӝ MÔN CÔNG NGHӊ PHҪN MӄM
GIANG QUӔC MINH – HӖ PHҤM THÁI VINH
XÂY DͰNG ͨNG 'ͤNG BɫT GÓI TIN CHO
VIʃC PHÂN TÍCH THÔNG TIN 0ɝNG PHͤC
9ͤ QUɟN LÝ
KHOÁ LUҰN CӰ NHÂN TIN HӐC
TP. HCM, 1ĂM 2005
TRѬӠNG ĈҤI HӐC KHOA HӐC TӴ NHIÊN
KHOA CÔNG NGHӊ THÔNG TIN
%Ӝ MÔN CÔNG NGHӊ PHҪN MӄM
GIANG QUӔC MINH - 0112016
HӖ PHҤM THÁI VINH - 0112081
XÂY DͰNG ͨNG 'ͤNG BɫT GÓI TIN CHO
VIʃC PHÂN TÍCH THÔNG TIN 0ɝNG PHͤC
9ͤ QUɟN LÝ
KHÓA LUҰN CӰ NHÂN TIN HӐC
GIÁO VIÊN HѬӞNG DҮN
GVC CAO ĈĂNG TÂN
NIÊN KHÓA 2001 – 2005
NHҰN XÉT &ӪA GIÁO VIÊN HѬӞNG DҮN
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
......................
91 trang |
Chia sẻ: hunglv | Lượt xem: 954 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Khóa luận Tìm hiểu xây dựng ứng dụng bắt gói tin cho việc phân tích thông tin mạng phục vụ quản lý, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRѬӠNG ĈҤI HӐC KHOA HӐC TӴ NHIÊN
KHOA CÔNG NGHӊ THÔNG TIN
%Ӝ MÔN CÔNG NGHӊ PHҪN MӄM
GIANG QUӔC MINH – HӖ PHҤM THÁI VINH
XÂY DͰNG ͨNG 'ͤNG BɫT GÓI TIN CHO
VIʃC PHÂN TÍCH THÔNG TIN 0ɝNG PHͤC
9ͤ QUɟN LÝ
KHOÁ LUҰN CӰ NHÂN TIN HӐC
TP. HCM, 1ĂM 2005
TRѬӠNG ĈҤI HӐC KHOA HӐC TӴ NHIÊN
KHOA CÔNG NGHӊ THÔNG TIN
%Ӝ MÔN CÔNG NGHӊ PHҪN MӄM
GIANG QUӔC MINH - 0112016
HӖ PHҤM THÁI VINH - 0112081
XÂY DͰNG ͨNG 'ͤNG BɫT GÓI TIN CHO
VIʃC PHÂN TÍCH THÔNG TIN 0ɝNG PHͤC
9ͤ QUɟN LÝ
KHÓA LUҰN CӰ NHÂN TIN HӐC
GIÁO VIÊN HѬӞNG DҮN
GVC CAO ĈĂNG TÂN
NIÊN KHÓA 2001 – 2005
NHҰN XÉT &ӪA GIÁO VIÊN HѬӞNG DҮN
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
Tp.HCM, ngày…..tháng….năm 2005
NHҰN XÉT &ӪA GIÁO VIÊN PHҦN BIӊN
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................
Tp.HCM, ngày…..tháng….năm 2005
LӠI CÁM ѪN
Chúng em xin chân thành cám ѫn Ban giám hiӋu, quý Thҫy cô Fӫa
trѭӡng Ĉҥi Hӑc Khoa Hӑc Tӵ Nhiên TP. Hӗ Chí Minh, ÿһc biӋt là các Thҫy
cô trong Khoa Công nghӋ Thông tin ÿã tұn tình giҧng Gҥy, trang Eӏ cho chúng
em nhӳng kiӃn thӭc cҫn thiӃt, bә ích trong suӕt nhӳng năm Kӑc tұp Wҥi trѭӡng.
Chúng em xin chân thành Fҧm ѫn Thҫy Cao Ĉăng Tân, ngѭӡi Thҫy ÿã
tұn tình quan tâm hѭӟng dүn, giúp ÿӥ chúng em trong suӕt thӡi gian làm luұn
Yăn này.
Chúng con xin gӱi lòng biӃt ѫn sâu sҳc và sӵ kính trӑng ÿӃn ông bà, cha
Pҽ, cùng toàn thӇ gia ÿình, nhӳng ngѭӡi ÿã nuôi Gҥy chúng con trѭӣng thành
nhѭ ngày hôm nay.
Chúng tôi xin chân thành cám ѫn sӵ giúp ÿӥ, ÿӝng viên, nhұn xét, ÿóng
góp ý kiӃn cӫa các anh chӏ, Eҥn bè trong quá trình thӵc hiӋn luұn văn này.
TP. Hӗ Chí Minh, 7/2005
Nhóm sinh viên thӵc hiӋn
Giang Quӕc Minh – Hӗ Phҥm Thái Vinh
BӔ CӨC &ӪA LUҰN VĂN
Luұn văn gӗm có 3 phҫn và 7 chѭѫng
PHҪN 1: TӘNG QUAN
Chѭѫng 1 Giӟi thiӋu vӅÿӅ tài
PHҪN 2: TÌM HIӆU CÁC VҨN Ĉӄ LҰP TRÌNH. Phҫn này giӟi thiӋu
các vҩn ÿӅ lұp trình cѫ Eҧn nhҩt ÿӇ xây dӵng 1ӭng Gөng có khҧ Qăng bҳt
các gói tin và cho phép ngѭӡi dùng có thӇ ÿiӅu khiӇn tӯ xa qua môi
trѭӡng Pҥng.
Chѭѫng 2. Tìm hiӇu thѭ viӋn lұp trình mҥng cҩp thҩp libpcap, ÿây là
“trái tim” Fӫa hҫu hӃt các ӭng Gөng bҳt gói tin mã nguӗn mӣ hiӋn nay.
Chѭѫngg 3. Giӟi thiӋu MySQL, mӝt hӋ quҧn trӏ Fѫ sӣ dӳ liӋu tҫm trung
ÿѭӧc sӱ dөng phә biӃn nhҩt hiӋn nay.
Chѭѫng 4. Tìm hiӇu Nӻ thuұt lұp trình socket ÿӇ viӃt các ӭng Gөng trên
môi trѭӡng Pҥng
Phҫn 3 Xây Gөng ӭng Gөng PacketCap. Phҫn này VӁ sӱ dөng các kiӃn
thӭc ÿã tìm hiӇu ӣ chѭѫng 2, 3, 4 ÿӇ xây dӵng mӝt ӭng Gөng bҳt gói tin,
Oѭu các kӃt quҧ bҳt ÿѭӧc vào cѫ sӣ dӳ liӋu ÿӇ phân tích các thông tin
Pҥng.
Chѭѫng 5. Phân tích, thiӃt kӃӭng Gөng PacketCap
Chѭѫng 6. Cài ÿһt và thӱ nghiӋm PacketCap
Chѭѫng 7. Tәng kӃt. Chѭѫng này trình bày nhӳng kӃt quҧ ÿҥt ÿѭӧc,
nhӳng Kҥn chӃ và hѭӟng phát triӇn PacketCap trong tѭѫng lai.
Các danhPөc
11
MӨC /ӨC
DANH SÁCH HÌNH.................................................................................... 14
DANH SÁCH %ҦNG .................................................................................. 15
PHҪN 1: TӘNG QUAN .............................................................................. 16
Chѭѫng 1: Giӟi thiӋu ÿӅ tài .......................................................................... 17
1.1. Ĉһt vҩn ÿӅ .......................................................................................... 17
1.2. Giӟi thiӋu ÿӅ tài.................................................................................. 18
1.3. Yêu cҫu Fӫa ÿӅ tài .............................................................................. 19
PHҪN 2: TÌM HIӆU CÁC VҨN Ĉӄ LҰP TRÌNH ...................................... 20
Chѭѫng 2 : Thѭ viӋn lұp trình Pҥng libpcap ................................................ 21
2.1. Giӟi thiӋu libpcap............................................................................... 21
2.2. Cài ÿһt thѭ viӋn libpcap ..................................................................... 21
3.3. Các bѭӟc xây dӵng chѭѫng trình sӱ dөng libpcap.............................. 22
3.4. Chi tiӃt các bѭӟc ................................................................................ 23
3.4.1. Chӑn Interface( card Pҥng) ......................................................... 23
3.4.2. Mӣ device ÿӇ lҳng nghe( sniff) dӳ liӋu......................................... 24
3.4.3. /ӑc traffic .................................................................................... 25
Chѭѫng 3: HӋ quҧn trӏ Fѫ sӣ dӳ liӋu MySQL ............................................... 34
3.1. Giӟi thiӋu vӅ MySQL......................................................................... 34
3.2. Cài ÿһt MySQL.................................................................................. 34
3.2.1. Cài Ĉһt MySQL tӯ các gói nhӏ phân ............................................ 34
3.2.2. Cài ÿһt tӯ mã nguӗn..................................................................... 35
3.3. Sӱ dөng MySQL ................................................................................ 36
3.3.1. LӋnh mysql .................................................................................. 36
3.3.2. LӋnh mysqladmin ........................................................................ 36
3.3.3. LӋnh mysqlshow.......................................................................... 36
3.3.4. LӋnh grant.................................................................................... 37
3.3.5. LӋnh Revoke................................................................................ 38
3.3.6. Ví dө vӅ tҥo mӝt cѫ sӣ dӳ liӋu ..................................................... 38
3.4. Lұp trình MySQL trên ngôn ngӳ C .................................................... 38
4.4.1 mysql_init..................................................................................... 38
3.4.2 mysql_real_connection ................................................................. 39
3.4.3 mysql_query ................................................................................. 40
3.4.4. mysql_affected_rows ................................................................... 40
3.4.5. mysql_store_result ....................................................................... 40
3.4.6. mysql_fetch_row ......................................................................... 40
3.4.7. mysql_row_seek .......................................................................... 41
3.4.8. mysql_free_result ........................................................................ 41
Các danhPөc
12
Chѭѫng 4: Lұp trình socket .......................................................................... 42
4.1. Giӟi thiӋu vӅ lұp trình socket ............................................................. 42
4.2. Nguyên lý hoҥt ÿӝng Fӫa socket......................................................... 42
4.3. Lұp trình vӟi socket ........................................................................... 44
4.3.1. Các thuӝc tính Fӫa socket............................................................. 44
4.3.1.1. Vùng( domain) ...................................................................... 44
5.3.1.2. KiӇu socket(type)................................................................... 46
4.3.1.3. Giao thӭc Fӫa socket( protocol) ............................................. 47
4.3.2. 7ҥo socket.................................................................................... 48
4.3.3. Ĉӏnh ÿӏa chӍ cho socket................................................................ 49
4.3.4. Ĉһt tên cho socket........................................................................ 51
4.3.5. 7ҥo hàng ÿӧi cho socket .............................................................. 52
4.3.6. Chӡ và chҩp nhұn kӃt nӕi............................................................. 53
4.3.7. Yêu cҫu kӃt nӕi ............................................................................ 54
4.3.8. Ĉóng kӃt nӕi ................................................................................ 55
4.3.9. Giao tiӃp bҵng socket................................................................... 56
4.4. Sӱ dөng socket trong ӭng Gөng minh Kӑa ....................................... 58
PHҪN 3: XÂY DӴNG ӬNG 'ӨNG THӰ NGHIӊM PACKETCAP ......... 59
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap .................................................. 60
5.1. Khҧo sát hiӋn trҥng ............................................................................ 60
5.2. Phân tích và xác ÿӏnh yêu cҫu ............................................................ 61
5.2.1. Phân tích ...................................................................................... 61
5.2.2. Xác ÿӏnh yêu cҫu ......................................................................... 61
5.3. Các hѭӟng xây dӵng ӭng Gөng PacketCap......................................... 63
5.3.1. Phân tích hѭӟng phát triӇn dӵa trên Ethereal................................ 63
5.3.2. Phân tích hѭӟng phát triӇn dӵa trên libcap ................................... 64
5.3.3. Lӵa chӑn hѭӟng phát triӇn PacketCap ......................................... 64
5.4. Các thành phҫn PacketCap ................................................................. 65
5.5. Xây dӵng mô hình use case................................................................ 66
5.5.1. Xác ÿӏnh Actor và use case .......................................................... 66
5.5.2. Mô hình use case ......................................................................... 66
5.6. Ĉһt Wҧ use case.................................................................................... 67
5.6.1. Connect........................................................................................ 67
5.6.2. StartCapture................................................................................. 68
5.6.3. StopCapture ................................................................................. 69
5.6.4. GetFilter....................................................................................... 70
5.6.5. Terminate..................................................................................... 71
Các danhPөc
13
5.7.ThiӃt kӃ dӳ liӋu ................................................................................... 72
5.7.1. Phân tích các hѭӟng lѭu trӳ ......................................................... 72
5.7.2. ThiӃt kӃ Fѫ sӣ Gѭ liӋu................................................................... 75
5.7.2.1. Danh sách các ÿәi tѭӧng (table)............................................. 75
5.7.2.2 Table PACKET ...................................................................... 75
6.7.2.4. Table IP ................................................................................. 76
5.7.2.5. Table TCP ............................................................................. 76
5.7.2.6. Table UDP............................................................................. 77
5.7.2.7 Table ICMP ............................................................................ 77
5.7.2.8 Table IGMP............................................................................ 78
5.7.2.9. Table ARP............................................................................. 80
5.8. Xây dӵng PCServer( server), PCManager(client)............................... 81
5.8.1. Lѭu ÿӗ PCServer ......................................................................... 81
5.8.2. Lѭu ÿӗ PCManager( Client)......................................................... 82
5.8.3. Cҩu trúc dӳ liӋu trao ÿәi giӳa PCServer và PCManager............... 83
5.9.ThiӃt kӃ giao diӋn PCManager( phiên Eҧn chҥy trên Windows) .......... 85
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm................................................................. 87
6.1. Cài ÿһt................................................................................................ 87
6.2. Thӱ nghiӋm........................................................................................ 88
6.2.1. Mô hình thӱ nghiӋm 1.................................................................. 88
6.2.2. Mô hình thӱ nghiӋm 2.................................................................. 89
6.2.3. Mô hình thӱ nghiӋm 3.................................................................. 90
Chѭѫng 7: Tәng kӃt ..................................................................................... 91
7.1. KӃt luұn.............................................................................................. 91
7.1.1. KӃt quҧ ÿҥt ÿѭӧc.......................................................................... 91
7.1.2. +ҥn chӃ........................................................................................ 91
7.2. Hѭӟng phát triӇn ................................................................................ 92
PHӨ LӨC Hѭӟng dүn sӱ dөng PacketCap ................................................... 93
1.Chѭѫng trình PCServer.......................................................................... 93
2. Chѭѫng trình PCManager ..................................................................... 93
2.1. PCManager trên môi trѭӡng Linux ................................................. 93
2.2. PCManager trên môi trѭӡng Windows............................................ 94
TÀI LIӊU THAM KHҦO............................................................................ 95
Các danhPөc
14
DANH SÁCH HÌNH
Hình 5-1 Các thành phҫn Fӫa PacketCap...................................................... 65
Hình 5-2 Mô hình use case ........................................................................... 66
Hình 5-3 Mô hình lѭu trӳ 1 .......................................................................... 72
Hình 5-4 Mô hình lѭu trӳ 2 .......................................................................... 73
Hình 5-5 Mô hình lѭu trӳ 3 .......................................................................... 74
Hình 5-6 Lѭu ÿӗ PCServer........................................................................... 81
Hình 5-7 Lѭu ÿӗ PCManager ....................................................................... 82
Hình 6-1 Mô hình thӱ nghiӋm 1 ................................................................... 88
Hình 6-2 Mô hình thӱ nghiӋm 2 ................................................................... 89
Hình 6-3 Mô hình thӱ nghiӋm 3 ................................................................... 90
Các danhPөc
15
DANH SÁCH %ҦNG
%ҧng 4-1 Các giá trӏ cӫa domain .................................................................. 48
%ҧng 4-2 Các mã lӛi Fӫa hàm bind() ............................................................ 51
%ҧng 4-3 Các mã lӛi Fӫa domain AF_UNIX ................................................ 52
%ҧng 4-4 Mã lӛi Fӫa hàm connect().............................................................. 55
%ҧng 5-1 Xác ÿӏnh yêu cҫu........................................................................... 62
%ҧng 5-2 Danh sách các ÿӕi tѭӧng ............................................................... 75
%ҧng 5-3 Table PACKET............................................................................. 75
%ҧng 5-4 Table IP ........................................................................................ 76
%ҧng 5-5 Table TCP..................................................................................... 76
%ҧng 5-6 Table UDP.................................................................................... 77
%ҧng 5-7 Table ICMP .................................................................................. 77
%ҧng 5-8 Table IGMP.................................................................................. 78
%ҧng 5-9 Table ARP .................................................................................... 80
%ҧng 5-10 Mô Wҧ màn hình PCManager ....................................................... 86
Phҫn 1: Tәng quan
16
PHҪN 1: TӘNG QUAN
Chѭѫng 1. Giӟi thiӋu ÿӅ tài
Chѭѫng 1: Giӟi thiӋu ÿӅ tài
17
Chѭѫng 1: Giӟi thiӋu ÿӅ tài
1.1. Ĉһt vҩn ÿӅ
Ngày nay công nghӋ thông tin nói chung và Intenet nói riêng ngày càng
phát triӇn Pҥnh PӁ và trӣ thành không thӇ thiӃu trong cuӝc sӕng chúng ta.
Xuҩt phát tӯ nhu cҫu trao ÿәi thông tin ngày càng nhanh và nhiӅu giӳa
các doanh nghiӋp, các tә chӭc và công ty trong nӅn kinh tӃ thӏ trѭӡng hôm
nay, sӕ lѭӧng các doanh nghiӋp thiӃt lұp các hӋ thӕng mҥng và kӃt nӕi Intenet
ngày càng nhiӅu.
ViӋc Công nghӋ thông tin và mҥng Intenet phát triӇn và ngày càng nhiӅu
các thông tin quan trӑng ÿѭӧc trao ÿәi trên mҥng làm nҧy sinh mӝt sӕ vҩn ÿӅ
quan trӑng là bҧo mұt thông tin trên mҥng ÿӇ tránh rò rӍ hay ngăn không cho
truy cұp vào các dӳ liӋu không cho phép gây thiӋt hҥi kinh tӃ, quҧn lý băng
thông ÿӇ tăng khҧ năng ÿáp ӭng thông tin, giao dӏch vӟi khách hàng ÿӗng thӡi
tránh ÿѭӧc tình trҥng nghӁn mҥch lѭu thông trên mҥng.
ViӋc phân tích lѭu lѭӧng mҥng ÿòi hӓi năng lӵc tính toán rҩt lӟn, vì vұy
muӕn làm ÿѭӧc viӋc này cҫn phҧi trang bӏ các siêu máy tính ÿӇ thӵc hiӋn bài
toán này. Trong ÿLӅu kiӋn kinh tӃ nѭӟc ta thì không thӇ trang bӏ nhӳng hӋ
thӕng này ÿѭӧc vì chúng quá ÿҳt ÿӓ.
Chѭѫng 1: Giӟi thiӋu ÿӅ tài
18
9ұy giҧi pháp nào ÿӇ giҧi quyӃt bài toán này ?
· Grid Computing là hӋ thӕng tính toán song song và phân tán
cho phép chúng ta thӵc hiӋn nhӳng bài toán lӟn dӵa trên các
KӋ thӕng nhӓ gӗm nhiӅu máy tính ÿѭӧc nӕi mҥng vӟi nhau.
· HiӋn nay chúng ta lҥi có rҩt nhiӅu hӋ thӕng máy tính nӕi
Pҥng nhѭng chѭa sӱ dөng ÿѭӧc hӃt khҧ năng tính toán cӫa
chúng.
· 9ӟi sӕ lѭӧng các máy tính ÿӫ lӟn thì viӋc triӇn khai Grid
Computing sӁ cho chúng ta mӝt hӋ thӕng tính toán cӵc kì
Pҥnh gҩp nhiӅu lҫn 1 siêu máy tính ( lúc ÿó các siêu máy tính
có thӇ chӍ là mӝt node trong hӋ thӕng Grid Computing).
9ӟi nhӳng ѭu ÿLӇm trên chúng tôi chӑn ÿӅ tài “Ӭng dөng thӱ nghiӋm
Grid Computing trong viӋc phân tích thông tin mҥng phөc vө quҧn lý”.
1.2. Giӟi thiӋu ÿӅ tài
ĈӅ tài “Ӭng Gөng thӱ nghiӋm Grid Computing trong viӋc phân tích
thông tin Pҥng phөc Yө quҧn lý” là mӝt ÿӅ lӟn gӗm 2 nhóm thӵc hiӋn.
Nhóm thӭ 1 VӁ xây dӵng ӭng dөng phân tán trên mҥng cho phép thiӃt lұp tӯ
xa chӃÿӝ lӑc và bҳt các gói tin, trích lӑc và lѭu vào các cѫ sӣ dӳ liӋu trên
PҥngÿӇ phөc Yө cho viӋc theo dõi và phân tích thông tinPҥng (Phҫn I).
Nhóm thӭ 2 VӁ tìm hiӇu Grid Computing và xây dӵng ӭng Gөng ÿӇ phân
tích hiӋn trҥng cӫa mҥng dӵa trên thông tin tӯ Fѫ sӣ dӳ liӋu do nhóm thӭ 1
xây dӵng (Phҫn II).
Chѭѫng 1: Giӟi thiӋu ÿӅ tài
19
1.3. Yêu cҫu Fӫa ÿӅ tài
· Xây dӵng ӭng dөng phân tán thӱ nghiӋm cho phép bҳt các gói tin
dùng ÿӇ phân tích thông tinPҥng phөc Yө quҧn lý.
· Các gói tin sau khi bҳt, ÿѭӧc trích thông tin và lѭu vào các cѫ sӣ dӳ
liӋu phân tán trên mҥng theo nhu cҫu cӫa ngѭӡi quҧn trӏ.
· +Ӌ thӕng cho phép cҩu hình ӭng dөng tӯ xa.
· Hә trӧ Oѭu kӃt quҧ bҳt ÿѭӧc theo ÿӏnh Gҥng Fӫa các ӭng Gөng bҳt
gói tin khác nhѭ Ethereal, TCPDump...
Phҫn 2: Tìm hiӇu các vҩn ÿӅ lұp trình
20
PHҪN 2: TÌM HIӆU CÁC VҨN Ĉӄ LҰP TRÌNH
Chѭѫng 2. Thѭ viӋn lұp trình Pҥng libpcap
Chѭѫng 3. HӋ quҧn trӏ Fѫ sӣ dӳ liӋu MySQL
Chѭѫng 4. Lұp trình socket
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
21
Chѭѫng 2 : Thѭ viӋn lұp trình Pҥng libpcap
2.1. Giӟi thiӋu libpcap
Libpcap là mӝt thѭ viӋn mã nguӗn mӣ Kӛ trӧ lұp trình Pҥng cҩp thҩp,
cho phép bҳt các gói tin trên ÿѭӡng truyӅn theo nhiӅu hѭӟng khác nhau, cho
phép phân tích các frame vӯa tìm ÿѭӧc.
Thѭ viӋn libcap ÿѭӧc sӱ dөng rӝng rãi trong các phҫn mӅm sniffer
packet. Các phҫn mӅm sӱ dөng libcap phә biӃn là TCPdump, TCPflow.
HiӋn nay phiên Eҧn mӟi nhҩt Fӫa libpcap là 0.9.1.
2.2. Cài ÿһt thѭ viӋn libpcap
Chѭѫng trình nguӗn cӫa libpcap có thӇ download ӣ ÿӏa chӍ
www.tcpdump.org , các phiên Eҧn mӟi nhҩt Fӫa libpcap ÿӅu có ӣ ÿӏa chӍ này.
Giҧ sӱ bҥn Wҧi vӅ gói libpcap-0.8.3.tar.tar, tiӃnhànhcài ÿһt:
· Giҧi nén gói tar
tar –xzvf libpcap-0.8.3.tar.tar
· ChuyӇn vào thѭ mөc libpcap
cd libpcap-0.8.3
· gõ lӋnh ./configure
· Gõ lӋnh make
· Gõ lӋnh make install
NӃu không có lӛi gì xҧy ra thì quá trình cài ÿһt ÿã hoàn tҩt.
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
22
3.3. Các bѭӟc xây dӵng chѭѫng trình sӱ dөng libpcap
Có 5 bѭӟc chính trong viӋc sӱ dөng thѭ viӋn libpcap
· %ѭӟc 1: Xác ÿӏnh interface (card Pҥng) mà ta muӕn bҳt frame vào
(Trong Linux, interface thѭӡng là eth0,eth1…..Ta có thӇ dùng các
hàm pcap_lookupdev() cӫa thѭ viӋn libpcap ÿӇ lҩy tҩt cҧ các
inteface.
· %ѭӟc 2: Khӣi tҥo pcap. Cung cҩp cho pcap biӃt interface nào trong
Vӕ các interface ÿã lҩy vӅӣ bѭӟc trên sӁÿѭӧc chӑn ÿӇ sniff.
· %ѭӟc 3: Lӑc frame .pcap cho chúng ta cѫ chӃ chӑn lӵa khi lӑc các
frame khi bҳt (ví dө chӍ bҳt frame TCP/IP có source IP
192.168.8.8 và port 23 …). ta phҧi tҥo ra filter rӗi biên Gӏch filter
này ÿӇ báo cho pcap biӃt bӝ lӑc nó sӁ dùng.
· %ѭӟc 4: Pcap thӵc thi viӋc sniff frames.
· %ѭӟc 5: Ĉóng phiên làm viӋc và kӃt thúc ӭng dөng
Trên ÿây là qui trình tәng quát cách libpcap bҳt gói tin trong ÿó bѭӟc 3
là tùy chӑn có thӇ có hoһc không.
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
23
3.4. Chi tiӃt các bѭӟc
3.4.1. Chӑn Interface( cardPҥng)
Có 3 cách thiӃt lұp devices ÿӇ sniff các frames dӳ liӋu
· Cách 1 : Cho ngѭӡi dùng nhұp tên thiӃt bӏ tӯ dòng lӋnh
#include
#include
int main(int argc , char* argv[])
{
Char * dev = argv[1]
Printf(³Devices : %s \n³,dev);
}
Trong ÿó argv[1] là tham sӕ dòng lӋnh ÿҫu tiên
· Cách 2 : Sӱ dөng hàm pcap_lookupdev() cӫa libpcap ÿӇ tìm
kiӃm các interface tӗn Wҥi trên máy tính.
#include
#include
int main(int argc , char* argv[])
{
Char* dev,errbuf[PCAP_ERRBUF_SIZE]
dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
printf("%s\n",errbuf);
exit(1);
}
printf("DEV: %s\n",dev);
}
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
24
Trong trѭӡng hӧp này, pcap tӵ tìm ra thiӃt bӏ. errbuf là chuӛi chӭa
thông báo lӛi nӃu có.
· Cách 3 : Dùng hàm pcap_findalldevs ÿӇ tìm tҩt cҧ thiӃt bӏ sau ÿó
ÿѭa vào mӝt mҧng
#include
#include
int main(int argc , char* argv[])
{
pcap_if_t *devlist;
char devname[10][100];
Char* dev,errbuf[PCAP_ERRBUF_SIZE]
int devcount=0;
retvalue=pcap_findalldevs(&devlist,err);
if(retvalue==-1 || devlist==NULL)
return 0;
for(d=devlist,i=0; d && inext,i++)
sprintf(devname[i],"%s",d->name);
devcount=i;
}
3.4.2. Mӣ device ÿӇ lҳng nghe( sniff) dӳ liӋu
Khӣi tҥo phiên làm viӋc cho các thiӃt bӏ sӱ dөng hàm
pcap_open_live(). Cҩu trúc hàm này nhѭ sau :
pcap_t *pcap_open_lives(
char* device,int snaplen,int promisc,int yo_ms,char *ebuf)
Tham sӕ:
· device là thiӃt bӏÿã ÿѭӧc ÿӏnh nghƭa ӣ trên
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
25
· snaplen cho biӃt sӕ byte lӟn nhҩt mà pcap có thӇ bҳt frames
· promisc nӃu ÿһt bҵng 1 thì interface sӁ hoҥt ÿӝng trong chӃÿӝ
promiscuos mode. Ĉây là chӃÿӝ libpcap sӁ sniff tҩt cҧ các frame
trên dây dүn. NӃu ÿһt bҵng 0 thì interface sӁ hoҥt ÿӝng ӣ chӃÿӝ
non promiscuos mode, trong chӃ ÿӝ này,pcap chӍ sniff nhӳng
frame gӱi ÿӃn máy.
Pcap_t *descr
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
Dev là ÿӏnh danh thiӃt bӏ.
3.4.3. /ӑc traffic
Trong trѭӡng hӧp không bҳt tҩt cҧ các gói tin mà chӍ bҳt các gói tin
theo mӝt yêu cҫu nào ÿó ta thì sӱ dөng pcap_compile() pcap_setfilter()
có cҩu trúc nhѭ sau:
int pcap_compile(pcap_t *p, struct bpf_program *ft, char *str,
int optimize, bpf_u_int32 netmask )
Tham sӕÿҫu tiên là handle cӫa phiên làm viӋc (pcap_t). Tham sӕ
thӭ hai là tham sӕ chӍ ÿӃn nѫi lѭu compile version cӫa filter. str là
chuӛi mô tҧ cho filter biӃt nhӳng gói tin cҫn bҳt. KӃÿӃn là sӕ nguyên
cho biӃt str là opyimize hay không (1 là true, 0 là false). Cuӕi cùng là
netmask cӫa ÿѭӡng mҥng.
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
26
int pcap_setfilter(pcap_t *p,struct_bpf_program *fp)
Tham sӕ thӭ nhҩt là handle quҧn lý phiên làm viӋc. Tham sӕ thӭ hai
là tham chiӃu chӍ ÿӃn compile version cӫa filter (ÿã ÿѭӧc ÿӏnh nghƭa
trong pcap_compile())
Ĉӏnh dҥng str mô tҧ cho filter:
· Filter theo source ip
Ví dө ," src net 172.168.8.8 "
· Filter theo dest ip :
Ví dө ," dst net 172.168.8.8 "
· Filter theo source và dest ip
Ví dө ," src and dst net 172.168.8.8 "
· Filter theo source hay dest ip
Ví dө ," src or dst net 172.168.8.8 "
· Filter theo source port :
Ví dө ," src port 23 "
· Filter theo dest port :
Ví dө ," dst port 23 "
· Filter theo source và dest port
Ví dө ," src and dst port 23 "
· Filter theo source hay dest port
Ví dө ," src or dst port 172.168.8.8 "
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
27
· Filter theo protocal
Ví dө ," tcp "
· Ngoài ra còn có thӇ filter tәng hӧp :
Ví dө ," dst net 172.168.8.8 and src port 23 tcp"
Ví dө vӅ filter ÿѫn giҧn
#include
««.
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct bpf_program fp; /* hold compiled program */
bpf_u_int32 maskp; /* subnet mask */
bpf_u_int32 netp; /* ip */
dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
fprintf(stderr,"%s\n",errbuf);
exit(1);
}
descr = pcap_open_live(dev,BUFSIZ,1,-1,errbuf);
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
28
if(pcap_compile(descr,&fp,´ port 23 ´,0,netp) == -1)
{
fprintf(stderr,"Error calling pcap_compile\n");
exit(1);
}
pcap_setfilter(descr,&fp)
Quá trình bҳt frame thұt sӵ :
Ӣÿây ta ÿӏnh nghƭa mӝt thiӃt bӏ mӝt thiӃt bӏÿӇ chuҭn bӏ sniff frame
(thiӃt lұp filter nӃu cҫn). Có 2 kƭ thuұt chính ÿѭӧc dùng trong viӋc sniff
frame. Chúng ta có thӇ bҳt frame và ÿѭa vào vòng lһp chӡ xӱ lý. Ĉҫu
tiên ta xem cách bҳt frame sӱ dөng hàm pcap_next cӫa libpcap.
Hàm này có cҩu trúc sau :
u_char *pcap_next(pcap_t *p,struct pcap_hkthdr *h )
Tham sӕÿҫu tiên là handle quҧn lý phiên làm viӋc. Tham sӕ thӭ
hai là pointer chӍÿӃn cҩu trúc lѭu giӳ thông tin chung vӅ frame ( thӡi
gian bҳt, chiӅu dài frame …). pcap_next trҧ vӅ mӝt con trӓ có dҥng
u_char trӓÿӃn frame ÿѭӧc mô tҧ bӣi cҩu trúc này
struct pcap_pkthdr
{
struct timeval ts; time stamp
bpf_u_int32 caplen; length of portion present
bpf_u_int32; lebgth this packet (off wire)
}
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
29
Ví dө vӅ sniff frame sӱ dӵng cҩu trúc này
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct ether_header *eptr; /* net/ethernet.h */
u_char *ptr; /* printing out hardware header info */
dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
printf("%s\n",errbuf);
exit(1);
}
printf("DEV: %s\n",dev);
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
30
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
packet = pcap_next(descr,&hdr);
if(packet == NULL)
{
printf("Didn't grab packet\n");
exit(1);
}
printf("Grabbed packet of length %d\n",hdr.len);
printf("Recieved at ..... %s\n",ctime((const
time_t*)&hdr.ts.tv_sec));
pcap_close(descr);
}
Chѭѫng trình này in ra chiӅu dài và thӡi gian bҳt gói tin ÿҫu tiên mà
nó bҳt ÿѭӧc. Hàm pcap_close() dùng ÿӇÿóng phiên làm viӋc.
0ӝt kӻ thuұt khác phӭc tҥp hѫn là dùng hàm pcap_loop() cӫa
libpcap. Cҩu trúc hai hàm này nhѭ sau :
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback,
u_char *user)
Tham sӕÿҫu tiên là handle quҧn lý phiên làm viêc, tham sӕ thӭ hai
là sӕ frame sӁÿѭӧc sniff trѭӟc khi thoát ra. NӃu tham sӕ này là sӕ âm
thì sӁ sniff ÿӃn khi nào có lӛi xҧy ra. Tham sӕ thӭ ba là tên cӫa hàm
callback. Tham sӕ cuӕi cùng ÿѭӧc sӱ dөnng trong mӝt sӕ ӭng dөng,
ÿѫn giҧn hãy dһt là NULL.
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
31
Cҩu trúc cӫa hàm callback :
void my_callback(u_char *useless,const struct pcap_pkthdr*
pkthdr,const u_char* packet)
Tham sӕÿҫu tiên là tham sӕ cuӕi cùng cӫa hàm pcap_loop truyӅn
vào (thѭӡng là NULL). Tham sӕ thӭ hai là cҩu trúc pcap_pkthdr.
Ví dө vӅ cách sӱ dөng pcap_loop :
#include
#include
#include
#include
void my_callback(u_char *useless,const struct pcap_pkthdr*
pkthdr,const u_char*packet)
{
tatic int count = 1;
fprintf(stdout,"%d, ",count);
if(count == 4)
fprintf(stdout,"Come on baby sayyy you love me!!!
");
if(count == 7)
fprintf (stdout,"Tiiimmmeesss!! ");
fflush(stdout);
count++;
}
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
32
int main(int argc,char **argv)
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct ether_header *eptr; /* net/ethernet.h */
if(argc != 2)
{
fprintf(stdout,"Usage: %s numpackets\n",argv[0]);
return 0;
}
dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
printf("%s\n",errbuf);
exit(1);
}
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
Chѭѫng 2: Thѭ viӋn lұp trình Pҥng libpcap
33
pcap_loop(descr,atoi(argv[1]),my_callback,NULL);
fprintf(stdout,"\nDone processing packets... wheew!\n");
return 0;
}
Chѭѫng 3: HӋ quҧn trӏ cѫ sӣ dӳ liӋu MySQL
34
Chѭѫng 3: HӋ quҧn trӏ Fѫ sӣ dӳ liӋu MySQL
3.1. Giӟi thiӋu vӅ MySQL
Công ty Tcx muӕn phát triӇn mӝt ӭng dөng web và muӕn sӱ dөng cѫ sӣ
Gӳ liӋu cӫa riêng mình. Tcx ÿã dӵa trên tiӃp cұn lұp trình API cӫa mSQL và
ngôn ngӳ SQL ÿӇ phát triӇn nên MySQL
MySQL hoҥt ÿӝng theo mô hình client-server, rҩt ÿѫn giҧn, không có các
tính năng cao cҩp nhѭ quҧn lý giao tác, chia sҿ kӃt nӕi. Ĉѭӧc sӱ dөng rӝng rãi
trong Linux ÿӕi vӟi các ӭng dөng cgi hay Perl trong môi trѭӡng Web,
Internet.
Ĉӏa chӍ download MySQL :
3.2. Cài ÿһt MySQL
3.2.1. Cài Ĉһt MySQL tӯ các gói nhӏ phân
Các gói cҫn thiӃt:
· Gói trình chӫ (server package):
MySQL-version-architecture.rpm
· Gói trình khách (client package):
MySQL-client-version-architecture.rpm
· +ӛ trӧ thѭ viӋn cho trình khách:
MySQL-shared-version-architecture.rpm
· Gói phát triӇn ӭng dөng trên MySQL:
MySQL-devel-version-architecture.rpm
Ta cài tӯng gói bҵng lӋnh
rpm –ivh
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
35
Trình cài ÿһt script sӁ tӵÿӝng tҥo:
· 0ӝt CSDL database mүu
· Script init.d và mysql ÿӇ khӣi ÿӝng và dӯng dӏch vө
kiӇm soát database cӫa MySQL.
· Script mysql chӭa các khai báo biӃn môi trѭӡng cho CSDL
cho biӃt vӏ trí các file CSDL cӫa MySQL:
bindir=/usr/bin
datadir=/var/lib/mysql
pid_file=/var/lib/mysql/mysqld.pid
mysql_daemon_user=mysql # Run mysql as this
user
· User mang tên mysql dùng ÿӇÿăng nhұp và khӣi ÿӝng dӏch
Yө daemon cӫa trình chӫ.
Khӣi ÿӝng trình chӫ bҵng tay:
· Ĉăng nhұp quyӅn user mysql:
$ su mysql
· Khӣi ÿӝng trình chӫ:
# /etc/rc.d/init.d/mysql start
3.2.2. Cài ÿһt tӯ mã nguӗn
· GLҧi nén file chӭa mã nguӗn
· Thӵc hiӋn cài ÿһt bҵng tә hӧp lӋnh sau :
$ ./configure
$ make
$ su
$ make intall
$scripts/mysql_intal.db
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
36
3.3. Sӱ dөng MySQL
3.3.1. LӋnh mysql
Ĉây là lӋnh thâm nhұp trình quҧn lý cѫ sӣ dӳ liӋu và ÿѭa ra các
OӋnh quҧn trӏ khác .
Cú pháp
mysql ±u username ±p password databasename
Ví dө
Truy xuҩt cѫ sӣ dӳ liӋu packet voi username la “pac” va
password la “ket”.
$ mysql –I pac –p ket packet
3.3.2. LӋnh mysqladmin
Là công cө chính cӫa ngѭӡi quҧn trӏ cѫ sӣ dӳ liӋu vӟi 2 tham sӕ -u,-
p . Vӟi mysqladmin có mӝt sӕ lӋnh quҧn trӏ sau
· create databasename : tҥo csdl
· drop database name :xóa cѫ sӣ dӳ liӋu
· password newpassword : ÿәi mұt khҭu
· status: thông tin vӅ trҥng thái hiӋn hành cӫa trình chӫ
· version cho biӃt thông tin vӅ phiên bҧn cӫa trình chӫ my sql
3.3.3. LӋnh mysqlshow
LӋnh này cho biӃt thông tin vӅ database. NӃu không có tham sӕ sӁ
hiӇn thӏ toàn bӝ database, ngѭӧc Oҥi nӃu có tham sӕ là tên database thì
hiӇn thӏ tҩt cҧ các bҧng trong database.
1Ӄu tham sӕ là tên database và tên bҧng thì toàn bӝ tên các cӝt
trong bҧng sӁÿѭӧc hiӇn thӏ
1Ӄu tham sӕ là tên database,tên bҧng,tên cӝt thì thông tin cӫa cӝt sӁ
ÿѭӧc liӋt kê.
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
37
3.3.4. LӋnh grant
&ҩp quyӅn cho ngѭӡi dùng database
Cú pháp :
grant privilege on object to user[user-password] [opt]
· privilege là quyӅn cҩp cho tài khoҧn ngѭӡi dùng bao gӗm:
§ Alter : quyӅn thay ÿәi bҧng và file chӍ mөc
§ Creat : quyӅn tҥo bҧng vàdatabase
§ Delete : quyӅn xoá dӳ liӋu trong database
§ Drop : quyӅn xoá database
§ Index : quyӅn quҧn lý chӍ mөc index
§ Insert : quyӅn chèn dӳ liӋu mӟi vào
§ Select : quyӅn xem dӳ liӋu
§ Update : quyӅn cұp nhұt dӳ liӋu
§ All : tҩt cҧ các quyӅn
· Object : databasename.table
Có thӇ dùng databasename.* sӁ tác ÿӝng ÿӃn mӑi bҧng
trên databasename.
/ѭu ý: mysql cho phép cҩp quyӅn trên database chѭa có
cho mӝt ngѭӡi dùng sau này sӁ tҥo
· User : username.host
Ví dө rick@”%”
· Password : nӃu grant taӑ mӟi user ta ÿһt password bҵng
cách thêm identyfied by password
· Ví dө : tҥo mӟi user khtn vӟi password cntt toàn quyӅn trên
database tên packet(packet có thӇ chѭa có)
mysql>grant all on packet.* to khtn@”%” indentified by cntt
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
38
3.3.5. LӋnh Revoke
LӋnh này dùng ÿӇ Wѭӟc quyӅn ngѭӡi dùng
Cú pháp:
revoke privilege on object from user
3.3.6. Ví dө vӅ tҥo mӝt cѫ sӣ dӳ liӋu
7ҥo cѫ sӣ dӳ liӋu packet vӟi username là khtn và password la cntt :
$mysql>grant all on packet.* to khtn@´´ identified by cntt;
/Ӌnh trên ÿѭӧc thӵc hiӋn vӟi tѭ cách quҧn trӏ root cӫa MySQL.
(Thoát vӅ dҩu nhҳc lӋnh $mysql>quit )
Rӗi gõ tiӃp các lӋnh sau:
$mysql ±u khtn ±p cntt
$ mysql>create database packet;
$mysql>use packet (sӱ dөng database tên packet)
Bây giӡ mӑi truy vҩn sql ÿӅu lác ÿӝng lên database packet.
3.4. Lұp trình MySQL trên ngôn ngӳ C
Mӝt sӕ hàm thѭӡng dùng khi lұp trình vӟi MySQL
4.4.1 mysql_init
Khӣi tҥo cҩu trúc xӱ lý kӃt nӕi
Cú pháp :
MYSQL *mysql_init (MYSQL *old_connect)
Tham sӕ:
· old_connect =NULL :tҥo kӃt nӕi mӟi
· old_connect khác NULL :tái kӃt nӕi vӟi con trӓ old_connect
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
39
3.4.2 mysql_real_connection
Thӵc hiӋn kӃt nӕi vұt lý ÿӃn máy chӫ nѫi Mysql sever ÿang chҥy
Cú pháp :
MYSQL *mysql_real_connect(MYSQL *connection ,
const char* server_host, const char * sql_username,
const char *sql_pass, const char* db_name,
unsigned port_num ,const char * unit_socket_name ,
unsigned int flag )
Tham sӕ :
· Connection : trӓÿӃn cҩu trúc MYSQL ÿѭӧc khӣi tҥo bӣi hàm
mysqlconnect.
· Server_host : ÿӏa chӍ IP cӫa máy chӫ nѫi dӏch vu mysql
server ÿang chҥy.
· sql_username,sql_pass : là ÿӕi sӕ chӭng thӵc quyӅn ÿăng
nhұp hӋ thӕng
· db_name : tên cӫa database
· port_num : sӕ hiӋu cәng mysql dùng (mһc ÿӏnh bҵng 0)
· unit_socket_name kiӇu socket (mһc ÿӏnh NULL)
· flag: kiӇu giao thӭc sӁ kӃt nӕi
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
40
3.4.3 mysql_query
Thӵc thi câu lӋnh sql query.
Cú pháp:
int mysql_query(MYSQL *connect,const char* query)
Tham sӕ:
· query : câu lӋnh sql cҫn thӵc hiӋn
KӃt quҧ trҧ vӅ
· Bҵng 0 nӃu thӵc thi thành công
· Bҵng 1 nӃu thҩt bҥi
3.4.4. mysql_affected_rows
Cho biӃt sӕ dòng bӏҧnh hѭӣng sau lӋnh query
Cú pháp :
my_ulonglong mysql_affected_rows(MYSQL *connection)
Khi sӱ dөng hàm này phҧi ép kiӇu giá trӏ trҧ vӅ là unsigned long
3.4.5. mysql_store_result
/ҩy giá trӏ trҧ vӅ sau khi gӑi hàm mysql_query ÿѭa vào cҩu trúc
MYSQL_RES
Cú pháp :
MYSQL_RES *mysql_store_result(MYSQL -*connection)
3.4.6. mysql_fetch_row
/ҩy ra mӝt dònh dӳ liӋu tӯ MYSQL_RES . Bҥn cNJng có thӇ di
chuyӇn ÿӃn 1 dòng dӳ liӋu bҩt kì nhӡ hai hàm mysql_row_seek và
mysql_row_tell.
Cú pháp :
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Chѭѫng 3: HӋ quҧn trӏ cѫ sӱ dӳ liӋu MySQL
41
3.4.7. mysql_row_seek
Di chuyӇn ÿӃn vӏ trí offset và trҧ vӅ vӏ trí con trӓ trѭӟc ÿó
Cú pháp :
MYSQL_ROW_OFFSET myql_row_seek(
MYSQL_RES *result MYSQL_ROW_OFFSET offset)
3.4.8. mysql_free_result
Giҧi phóng tài nguyên.
Cú pháp:
void mysql_free_result (MYSQL_RES *result)
Chѭѫng 4: Lұp trình socket
42
Chѭѫng 4: Lұp trình socket
4.1. Giӟi thiӋu vӅ lұp trình socket
Khi viӃt ӭng Gөng và có nhu cҫu tѭѫng tác vӟi mӝt ӭng Gөng khác,
chúng ta thѭӡng dӵa vào mô hình khách/ chӫ (client/server). Theo mô hình
này, ӭng Gөng có khҧ Qăng phөc Yө hoһc cung cҩp nhӳng thông tin gì ÿó gӑi
là ӭng Gөng chӫ (trình chӫ hay server). Ӭng Gөng gӱi yêu cҫu ÿӃn trình chӫ
ÿѭӧc Jӑi là ӭng Gөng khách (trình khách hay client). Mӣ rӝng hѫn nӳa, server
có thӇ là mӝt máy tính vӟi cҩu hình Pҥnh còn client là rҩt nhiӅu máy con khác
nӕi vào máy chӫ.
Nhѭ vұy, trѭӟc khi yêu cҫu mӝt Gӏch Yө cӫa trình chӫ thӵc hiӋn ÿiӅu gì
ÿó, trình khách (client) phҧi có khҧ Qăng kӃt nӕi ÿѭӧc vӟi trình chӫ. Quá trình
kӃt nӕi này ÿѭӧc thӵc hiӋn thông qua mӝt cѫ chӃ trӯu tѭӧng hóa Jӑi là socket
(Wҥm Gӏch là “cѫ chӃә cҳm”). KӃt nӕi giӳa trình khách và trình chӫ Wѭѫng tӵ
nhѭ viӋc cҳm phích ÿiӋn vào ә cҳm ÿiӋn. Trình khách thѭӡng ÿѭӧc coi nhѭ
phích cҳm ÿiӋn, còn trình chӫ ÿѭӧc coi nhѭ ә cҳm ÿiӋn, mӝt ә cҳm có thӇ cҳm
vào ÿó nhiӅu phích ÿiӋn khác nhau FNJng nhѭ mӝt máy chӫ có thӇ kӃt nӕi và
phөc Yө cho rҩt nhiӅu máy khách.
NӃu kӃt nӕi thành công thì trình khách và trình chӫ có thӇ trao ÿәi dӳ
liӋu vӟi nhau, thӵc hiӋn các yêu cҫu vӅ trao ÿәi dӳ liӋu.
4.2. Nguyên lý hoҥt ÿӝng Fӫa socket
Ĉҫu tiên server mӣ mӝt ә cҳm socket. Ĉây chӍ là quá trình hӋ ÿiӅu hành
phân bә tài nguyên ÿӇ chuҭn Eӏ kӃt nӕi. Dùng hàm socket() ÿӇ tҥo “ә cҳm”
cho trình chӫ server.
TiӃp ÿӃn, ÿӇӭng Gөng khách biӃt ÿӃn ә cҳm socket Fӫa trình chӫ, Eҥn
phҧi ÿһt cho server chӫ mӝt cái tên. NӃu trên máy Fөc bӝ và dӵa vào hӋ thӕng
file Fӫa UNIX hay Linux, Eҥn có thӇ ÿһt tên cho socket nhѭ là mӝt tên file
Chѭѫng 4: Lұp trình socket
43
(vӟi ÿҫy ÿӫ ÿѭӡng dүn). %ҥn chӍ cҫn ÿһt tên còn ÿѭӡng dүn thѭӡng ÿһt trong
thѭ Pөc /tmp hay /usr/tmp. Ĉӕi vӟi giao tiӃp Pҥng thông qua giao thӭc
TCP/IP tên Fӫa socket ÿѭӧc thay thӃ bҵng khái niӋm cәng (port). Cәng là mӝt
sӕ nguyên 2 bytes (khoҧng 65000 cәng Eҥn có thӇ chӑn ÿһt cho socket) thay
thӃ cho tên tұp tin. NӃu trình khách và trình chӫ nҵm trên hai máy khách
nhau, giao thӭc TCP/IP còn yêu cҫu xác ÿӏnh thêm ÿӏa chӍ IP ÿӇ kӃt nӕi ÿӃn
máy chӫӣ xa.
Sau khi ÿã chӍ ÿӏnh tên hoһc sӕ hiӋu port cho socket, Eҥn Jӑi hàm bind()
ÿӇ ràng buӝc hay ÿһt tên chính thӭc cho socket Fӫa trình chӫ. TiӃp ÿӃn là chӡ
kӃt nӕi tӯ phía trình khách, trình chӫ sӁ gӑi hàm listen() ÿӇ tҥo hàng ÿӧi nhұn
các kӃt nӕi do trình khách ÿѭa ÿӃn. NӃu có yêu cҫu kӃt nӕi tӯ phía trình
khách, trình chӫ gӑi hàm accept() ÿӇ tiӃp nhұn yêu cҫu Fӫa trình khách.
accept() VӁ tҥo mӝt socket vô danh khác (unnamed socket), cҳm kӃt nӕi Fӫa
trình khách vào socket vô danh này và thӵc hiӋn quá trình chuyӇn dӳ liӋu trao
ÿәi giӳa khách chӫ. Socket ÿѭӧc ÿһt tên trѭӟc ÿó vүn tiӃp Wөc hoҥt ÿӝng ÿӇ
chӡ nhұn yêu cҫu tӯ trình khách khác.
0ӑi giao tiӃp ÿӑc ghi thông qua socket FNJng ÿѫn giҧn nhѭ viӋc dùng
lӋnh read/write ÿӇ ÿӑc ghi trên file. NӃu file dӵa vào sӕ mô Wҧ (file descriptor)
ÿӇ xác ÿӏnh socket cҫn ÿӑc ghi cho hàm read/write.
Phía trình khách chӍ cҫm Wҥo mӝt socket vô danh, chӍ ÿӏnh tên và vӏ trí
socket Fӫa trình chӫ. Yêu cҫu kӃt nӕi bҵng hàm connect() và ÿӑc ghi, truy
xuҩt dӳ liӋu Fӫa socket bҵng lӋnh read/ write hoһc lӋnh send/ recv.
Chѭѫng 4: Lұp trình socket
44
4.3. Lұp trình vӟi socket
4.3.1. Các thuӝc tính Fӫa socket
Socket ÿѭӧc ÿӏnh nghƭa dӵa trên 3 thành phҫn thuӝc tính( attribute)
ÿó là: vùng( domain), kiӇu( type) và giao thӭc( protocol). Socket còn căn
cӭ vào mӝt ÿӏa chӍ kӃt hӧp vӟi nó. Ĉӏa chӍ này phө thuӝc vào vùng Fӫa
socket và thѭӡng ÿѭӧc Jӑi là dòng giao thӭc (protocol family). Ví dө
nhѭ dòng giao thӭc theo hӋ thӕng file Fӫa Sun thѭӡng lҩy tên file làm
ÿѭӡng dүn ÿӏa chӍ, trong khi giao thӭc TCP/IP Oҥi lҩy ÿӏa chӍ IP (32 bits)
ÿӇ tham chiӃu và thӵc hiӋn kӃt nӕi vұt lý.
4.3.1.1. Vùng( domain)
Vùng dùng xác ÿӏnh Kҥ tҫng Pҥng nѫi giao tiӃp Fӫa Socket
diӉn ra. Vùng giao tiӃp Socket thông Gөng nhҩt hiӋn nay là
AF_INET hay gia tiӃp socket theo chuҭn Pҥng Internet. Chuҭn này
sӱ dөng ÿӏa chӍ IP ÿӇ xác ÿӏnh nút kӃt nӕi vұt lý trên Pҥng. Ngoài
ra, nӃu Eҥn chӍ cҫn giao tiӃp Fөc bӝ, Eҥn có thӇ dùng vùng giao tiӃp
theo chuҭn Fӫa Sun AF_UNIX, ÿó là dùng ÿѭӡng dүn và hӋ thӕng
file ÿӇ ÿһt tên và xác ÿӏnh kӃt nӕi giӳa hai hay nhiӅu ӭng Gөng.
Chҷng Kҥn nhѭ ví dө trên, chúng ta ÿã thӵc hiӋn bҵng cách ÿһt tên
cho socket là server_socket, và Linux ÿã tҥo ra file server_socket
ngay trên thѭ Pөc hiӋn hành (hay trong thѭ Pөc Wҥm /tmp tùy theo
phiên Eҧn Fӫa Linux và UNIX). Tuy nhiên vùng giao tiӃp
AF_UNIX lҥi ít ÿѭӧc sӱ dөng trong thӵc tӃ. Ngày nay hҫu hӃt các
ӭng Gөng Pҥng sӱ dөng socket ÿӅu theo vùng AF_INET là chӫ yӃu.
Chúng ta VӁ bàn sâu vӅ phân vùng này ngay sau ÿây.
Vùng AF_INET nhѭ ÿã nêu sӱ dөng ÿӏc chӍ IP (Internet
Protocol) là mӝt chӫ nghƭa sӕ 32 bits ÿӇ xác ÿӏnh kӃt nӕi vұt lý. Sӕ
này thѭӡng ÿѭӧc viӃt ӣ dҥng nhòm nhѭ 192.168.1.1, 203.162.42.1
Chѭѫng 4: Lұp trình socket
45
hay 127.0.0.1 là các ÿӏa chӍ IP hӧp lӋ. Ĉӏa chӍ IP có thӇ ÿѭӧc ánh [ҥ
thành mӝt tên dӉ nhӟ Kѫn nhѭ www.yahoo.com hay
www.microsoft.com, chúng ÿѭӧc Jӑi là tên vùng (domain name).
ViӋc ánh [ҥ ÿӏa chӍ IP thành tên vùng thѭӡng do máy chӫ DNS
(Domain Name Server) thӵc hiӋn. Tuy nhiên, Eҥn FNJng có thӇ tӵ
ánh [ҥ tên vùng ngay trên mày Fөc bӝ bҵng cách sӱ dөng tұp tin dӳ
liӋu /etc/hosts.
Socket theo dòng giao thӭc IP sӱ dөng port (sӕ hiӋu cәng) ÿӇ
ÿһt tên cho mӝt socket. Cәng dùng ÿӇ phân biӋt dӳ liӋu gӱi ÿӃn VӁ
chuyӇn cho ӭng Gөng nào. %ҥn hình dung nӃu ÿӏa chӍ IP dùng ÿӇ
xác ÿӏnh ÿѭӧc máy hay nѫi kӃt nӕi vұt lý ÿӇ ÿѭa dӳ liӋu ÿӃn thì
cәng là ÿӏa chӍ phө dùng ÿӇ gӱi chính xác dӳ liӋu ÿӃn nѫi ӭng Gөng
cҫn. ĈiӅu này do trên mӝt máy có thӇ có nhiӅu ӭng Gөng cùng chҥy
và cùng sӱ dөng trùng sӕ cәng. Do cәng là mӝt giá trӏ nguyên 2
bytes nân Eҥn có thӇ sӱ dөng khoҧng 65000 cәng ÿӇ tӵ do ÿһt cho
socket. Trӯ các sӕ hiӋu cәng nә tiӃng nhѭ FTP, Web ÿã nêu ӣ phҫn
trên Eҥn không nên sӱ dөng, còn thì bҥn có thӇ chӑn sӕ cәng lӟn
Kѫn 1024ÿӇ mӣ cho socket Fӫa ӭung Gөng.
Mӣ socket theo AF_INET không khác mҩy so vӟi AF_UNIX
ngoài viӋc ÿһt tên và chӍ ÿӏnh sӕ hiӋu cәng. Ví dө:
/* Mͧ socket theo k͇t n͙i IP */
server_sockfd = socket (AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(“127.0.0.1”);
server_address.sin_port = 1234;
Chѭѫng 4: Lұp trình socket
46
Ngoài vùng giao tiӃp AF_UNIX và AF_INET, Eҥn còn có thӇ
gһp AF_ISO dành cho chuҭn giao thӭc Pҥng theo ISO hay AF_NS
dành cho hӋ thӕng Pҥng Xerox, tuy nhiên chúng không ÿѭӧc sӱ
Gөng thѭӡng xuyên, cho nên ta VӁ không ÿӅ cұp ÿӃn chi tiӃt.
5.3.1.2. KiӇu socket(type)
Vӟi mӛi vùng domain Fӫa socket, Eҥn có thӇ có nhiӅu cách
giao tiӃp. Có hai kiӇu giao tiӃp kiӇu giao tiӃp ÿiӇn hình ÿs là giao
tiӃp mӝt chiӅu (SOCK_DGRAM) và giao tiӃp Eҧo ÿҧm hai chiӅu
(SOCK_STREAM). Dӳ liӋu khi chuyӇn ÿi ÿѭӧc ÿóng thành tӯng
gói (data package hay datagram). SOCK_STREAM và
SOCK_DGRAM qui ÿӏnh cách chuyӇn gói dӳ liӋu theo hai cách
nhѭ sau:
SOCK_STREAM luôn giӳ kӃt nӕi và bҧo ÿҧm gói thông tin
gӱi ÿi ÿѭӧc chuyӇn ÿӃn ÿích và nhұn ÿҫy ÿӫ. Sau khi nhұn xong dӳ
liӋu, nѫi nhұn VӁ gӱi thông tin phҧn hӗi cho nѫi gӱi và quá trình gӱi
chӍ ÿѭӧc xác nhұn hoàn tҩt khi nhұn ÿѭӧc ÿҫy ÿӫ thӗng tin gӱi nhұn
ӣ cҧ hai phía khách chӫ. KiӇu truyӅn dӳ liӋ socket này trong vùng
giao thӭc Pҥng Internet AF_INET ÿѭӧc Jӑ là giao thӭc truyӅn
TCP. Khi kӃt hӧp vӟi cѫ chӃ ÿӏnh tuyӃn theo ÿӏa chӍ IP chúng ÿѭӧc
Jӑi tҳt là TCP/IP. KӃt nӕi và truyӅn dӳ liӋu theo cách này tuy Eҧo
ÿҧm nhѭng tӕn nhiӅu tài nguyên Fӫa hӋ thӕng do kӃt nӕi phҧi duy
trì và theo dõi thѭӡng xuyên.
SOCK_DGRAM cách gӱi nhҥn dӳ liӋu này chӍ diӉn ra mӝt
chiӅu. Trình khách, nѫi gӱi dӳ liӋu ÿi không cҫn biӃt trình chӍ (nѫi
nhұn) có nhұn ÿѭӧc gói dӳ liӋu ÿҫy ÿӫ hay không. Trình chӫ khi
nhұn ÿѭӧc dӳ liӋu FNJng không cҫn thông báo hay xác nhұn vӟi trình
khách là dӳ liӋu ÿã nhұn xong. Cách gӱi này có vҿ không an toàn
Chѭѫng 4: Lұp trình socket
47
nhѭng bù lҥi thӵc hiӋn nhanh và không tiêu tӕn nhiӅu tài nguyên ÿӇ
duy trì kӃt nӕi và kiӇm tra dӳ liӋu nhұn gӱi. KiӇu truyӅn dӳ liӋu
socket này trong vùng giao thӭc Pҥng Internet AF_INET ÿѭӧc Jӑi
là giao thӭc truyӅn UDP (User Datagram Protocol). Khi kӃt hӧp vӟi
Fѫ chӃ ÿӏnh tuyӃn theo ÿӏc chӍ IP chúng ÿѭӧc Jӑi tҳt là UDP/IP. Do
tính chҩt không ÿҧm Eҧo nên UDP ÿѭӧc dùng nhiӅu trong Pҥng vӟi
Pөc ÿích thông báo hay gӱi tin tin ÿӃn mӝt nhóm máy tính nào ÿó
trong Pҥng. Nó ít khi ÿѭӧc dùng trong các Gӏch Yө cҫn sӵ chính xác
cao nhѭ gӱi nhұn file hay kӃt nói cѫ sӣ dӳ liӋu.
4.3.1.3. Giao thӭc Fӫa socket( protocol)
Giao thӭc là cách qui ѭӟc gӱi nhұn dӳ liӋu giiӳa hai hay nhiӅu
máy tính trong mҥng. Tùy theo mӛi kiӇu gӱi nhұn dӳ liӋu mà ta có
các giao thӭc khác nhau. HiӋn nay kiӇu gӱi nhұn theo giao thӭc
TCP và UDP là sӱ dөng nhiӅu nhҩt. Tuy nhiên ÿiӅu này không bҳt
buӝc, TCP và UDP chӍ là cách cài ÿһt cho vùng socket AF_INET
theo giao tiӃp Internet mà thôi. Ví dө, ban có thӇ cài ÿһt mӝt giao
thӭc khác thay cho UDP áp Gөng cho cách chuyӇn dӳ liӋu không
Eҧo ÿҧm. Mõi kiӇu socket ÿӅu có giao thӭc mһc ÿӏnh áp Gөng cho
nó. Trong tҩt Fҧ các hàm socket sau này, tùy chӑn protocol nӃu có
yêu cҫu Eҥn có thӇ ÿһt giá trӏ 0ÿӇ yêu cҫu sӱ dөng giao thӭc mһc
ÿӏnh.
Trong các ví dөӣ phҫn sau ta chӍ tұp trung nghiên cӭu vӅ vùng
socket AF_INET và ÿӏa chӍ IP thay cho vùng AF_UNIX. Vӟi
AF_INET Pӑi ӭng Gөng Pҥng Fӫa Eҥn ÿӅu có thӇ giao tiӃp ÿѭӧc
vӟi nhau bҩt kӇ chúng ÿang chҥy trên Windows, Linux hay UNIX.
Chѭѫng 4: Lұp trình socket
48
4.3.2. Tҥo socket
HӋ thӕng cung cҩp cho Eҥn hàm socket() ÿӇ tҥo mӟi mӝt socket.
Hàm socket() trҧ vӅ sӕ nguyên int cho biӃt sӕ mô Wҧ hay ÿӏnh danh dùng
ÿӇ truy cұp socket sau này.
#include
#include
int socket(int domain, int type, int protocol);
Tham sӕ domain chӍ ÿӏnh vùng hay Kӑ ÿӏa chӍ áp ÿһt cho socket.
domain có thӇ nhұn mӝt trong các giá trӏ sau:
AF_UNIX Mͧ socket k͇t n͙i theo giao thͱc file (xṷt nh̵p socket da
trên xṷt nh̵p (file) Fͯa UNIX/Linux
AF_INET Mͧ socket theo giao thͱc Internet (s͵ dͭng ÿ͓a ch͑ IP ÿ͋ k͇t
n͙i)
AF_IPX Vùng giao thͱc IPX (P̩ng Novell)
AF_IS Chu̱n giao thͱc ISO
AF_NS Giao thͱc Xerox Network System
%ҧng 4-1 Các giá trӏ cӫa domain
Hҫu nhѭ Eҥn chӍ sӱ dөng AF_UNIX và AF_INET là chính. Các
vùng giao thӭc khác ÿã lӛi thӡi và hiӋn nay ít còn ÿѭӧc sӱ dөng.
Tham sӕ type trong hàm socket() dùng chӍ ÿӏnh kiӇu giao tiép hay
truyӅn dӳ liӋu Fӫa socket. %ҥn có thӇ chӍ ÿӏnh bҵng SOCK_STREAM
dùng cho truyӅn dӳ liӋu Eҧo ÿҧm hoһc SOCK_GRAM dùng cho truyӅn
không Eҧo ÿҧm.
Chѭѫng 4: Lұp trình socket
49
Tham sӕ protocol dùng ÿӇ chӑn giao thӭc áp Gөng cho kiӇu socket(
trong trѭӡng hӧp có nhiӅu giao thӭc áp Gөng cho mӝt kiӇu truyӅn). Tuy
nhiên Eҥn chӍ cҫn ÿһt giá trӏ 0 (lҩy giao thӭc mһc ÿӏnh). AF_INET chӍ cài
ÿһt mӝt giao thӭcduy nhҩt cho các kiӇu truyӅn SOCK_STREAM và
SOCK_DGRAM ÿó là TCP và UDP.
NӃu Wҥo socket thành công, hàm VӁ trҧ vӅ sӕ ÿӏnh danh socket(
descriptor). %ҥn sӱ dөng sӕ ÿӏnh danh này trong tҩt Fҧ các lӡi Jӑi truy
xuҩt socket khác nhѭ read/write. Sӕ này tѭѫng tӵ nhѭ sӕ ÿӏnh danh file
mà bҥn thѭӡng dùng ÿӇ ÿӑc và ghi file. Ĉӑc/ ghi vào socket FNJng ÿӗng
nghƭa vӟi gӱi và nhұn dӳ liӋu giӳa trình khách và trình chӫ.
4.3.3. Ĉӏnh ÿӏa chӍ cho socket
Khi socket ÿã ÿѭӧc Wҥo ra, Eҥn chӍ cҫn chӍ ÿӏnh ÿӏa chӍ và tên cho
socket. Mӝt socket cҫn phҧi có ÿӏa chӍ và tên ÿӇ các trình khách có thӇ
tham chiӃu ÿӃn. Tùy mӛi vùng giao thӭc mà cách ÿánh ÿӏa chӍ có thӇ
khác nhau.
Ví dө khi Eҥn dùng vùng giao thӭc AF_UNIX dӵa trên hӋ thӕng tұp
tin, ÿӏa chӍ socket ÿѭӧc ÿӏnh nghƭa trong cҩu trúc sockaddr_un Fӫa file
include sys/un.h nhѭ sau:
struct sockaddr_un{
sa_family_t sun_family; /* AF_UNIX */
char sun_path []; /* ÿ˱ͥng d̳n */
};
Chѭѫng 4: Lұp trình socket
50
Trong Linux sa_family_t ÿѭӧc ÿӏnh nghƭa là kiӇu short. sun_path là
ÿѭӡng dүn ÿӇ tҥo tұp tin socket.
Vùng AF_UNIX ÿѭӧc sӱ dөng nhiӅu trong các ӭng Gөng Fөc bӝ
trên Pӑt máy vì nó phө thuӝc vào ÿѭӡng dүn tұp tin tuyӋt ÿӕi Fӫa hӋ
ÿiӅu hành.
Thӵc tӃ bҥn VӁ dùng AF_INET vӟi cҩu trúc ÿӏa chӍ ÿѭӧc ÿӏnh nghƭa
trong sockadd_in Fӫa file include netinet/in.h nhѭ sau:
struct sockadd_in{
short in sin_family; /* AF_INET */
unsigned short int sin_port; /* s͙ c͝ng */
struct in_addr sin_addr; /* Ĉ͓a ch͑ IP */
};
Cҩu trúc in_addr mô Wҧ ÿӏa chӍ IP ÿѭӧc ÿӏnh nghƭa nhѭ sau:
struct in_addr{
unsigned long int s_addr;
};
Nhѭ Eҥn thҩy ÿӏa chӍ IP là mӝt sӕ long (4 bytes hay 32 bits). Ĉây
FNJng chính là cҩu trúc ÿӏa chӍ cho mӝt chѭѫng trình giao tiӃp vӟi nhau
qua Pҥng Internet.
Trên quan ÿiӇm Fӫa lұp trình ӭng Gөng, cho dù socket có ÿӏnh ÿӏa
chӍ theo vùng nào ÿi chăng nӳa mӝt khi ÿã mӣ ÿѭӧc socket, Eҥn chӍ cҫn
xem socket nhѭ mӝt tұp tin và thӵc hiӋn thao tác read/write trên ÿó(
Wѭѫng ӭng vӟi send và receive trên Winsock Fӫa Microsoft).
Chѭѫng 4: Lұp trình socket
51
4.3.4. Ĉһt tên cho socket
Sau khi ÿã ÿӏnh ÿӏa chӍ, Eҥn chӍ cҫn ÿһt tên cho socket. Ĉӕi vӟi
AF_UNIX ÿӏc chӍ chính là ÿѭӡng dүn, còn tên chính là tên tұp tin ÿӇ tҥo
socket. Ĉӕi vӟi vùng giao thӭc AF_INET ÿӏa chӍ chính là sӕ IP còn tên
chính là sӕ hiӋu cәng (sin_port) trong cҩu trúc sockaddr_in. Khi ÿã gán
thông tin ÿҫy ÿӫ cho socket Eҥn cҫn Jӑi hàm bind() ÿӇ rabgd buӝc nhӳng
thông tin này cho socket ÿã mӣ ra trѭӟc ÿó.
#include
int byte (int socket, const struct sockaddr *address, size_t address_len);
Hàm hӋ thӕng bind() sӱ dөng các thông tin trong cҩu trúc address
ÿӇ gán cho socket sӕ ÿӏnh danh socketd trҧ vӅ bӣi hàm socket() trѭӟc ÿó.
Tham sӕ address_len cho biӃt chièu dài Fӫa cҩu trúc (struct sockaddr*)
truyӅn vào hàm. %ҥn lѭu ý sockaddr là cҩu trúc tәng quát cho Fҧ
sockaddr_un và sockaddr_in
Khi ràng buӝc thành công bind() VӁ trҧ vӅ trӏ 0. NӃu không hàm VӁ trҧ vӅ
-1 và errno VӁ chӭa mӝt trong các lӛi sau:
Mã lӛi Mô Wҧ
EBADF S͙ mô W̫ file không hͫp l͏
ENOTSOCK S͙ mô W̫ file không dành cho socket
EINVAL S͙ mô W̫ file tham chi͇u ÿ͇n m͡t socket ÿã có.
EADDRNOTAVAIL Ĉ͓a ch͑ không xác ÿ͓nh
EADDRINUSE Ĉ͓a ch͑ và c͝ng ràng bu͡c ÿã b͓ m͡t socket khác
chi͇m Gͭng
%ҧng 4-2 Các mã lӛi Fӫa hàm bind()
Chѭѫng 4: Lұp trình socket
52
NӃu Eҥn mӣ socket thuӝc vùng AF_UNIX errno có thӇ nhұn thêm
các lӛi sau:
Mã lӛi Mô Wҧ
EACCESS Không th͋ t̩o file cho socket do không có
quy͉n W̩o file
ENOTDIR,
ENAMETOOLONG
Tên file không hͫp l͏
%ҧng 4-3 Các mã lӛi Fӫa domain AF_UNIX
Ràng buӝc tên socket là bѭӟc quan trӑng nhҩt ÿӇ socket Fӫa Eҥn có
khҧ Qăng nhìn thҩy và truy xuҩt ÿѭӧc tӯ các ӭng Gөng bên ngoài.
Mӝt socket nӃu chѭa ÿѭӧc ÿһt tên Jӑi là socket vô danh ( unnamed
socket).
4.3.5. 7ҥo hàng ÿӧi cho socket
ĈӇ ÿón nhұn các kӃt nӕi chuyӇn ÿӃn, socket trình chӫ phҧi Wҥo ra
mӝt hàng ÿӧi (queue). 0өc ÿích Fӫa hành ÿӧi là Oѭu Oҥi các kӃt nӕi chѭa
ÿѭӧc trình chӫ xӱ lý kӏp. Hàm hӋ thӕng listen() VӁ thӵc hiӋn công viӋc
này.
#include
int listen(int socketd, int backlog);
Tham sӕ socketd cho biӃt sӕ mô Wҧ socket cҫn Wҥo hàng ÿӧi. backlog
là sӕ kӃt nӕi tӕi ÿa ÿѭӧc phép ÿѭa vào hàng ÿӧi. NӃu mӝt kӃt nӕi ÿӃn
trình chӫ trong khi ÿã có backlog kӃt nӕi trѭӟc ÿó chѭa xӱ lý thì kӃt nӕi
này VӁ bӏ thҩt Eҥi. Lý do hàng ÿӧi ÿã ÿҫy, trình chӫ server không muӕn
nhұn thêm kӃt nӕi nӳa. Thông thѭӡng backlog mang giá trӏ 5 là sӕ trung
bình khҧ thi nhҩt.
Chѭѫng 4: Lұp trình socket
53
Hàm listen() VӁ trҧ vӅ 0 nӃu Wҥo hàng ÿӧi thành công, nӃu thҩt Eҥi trӏ
trҧ vӅ sӁ là -1 và biӃn errno VӁ chӭa trӏ EBADF, EINVAL, hoһc
ENOTSOCK.
4.3.6. Chӡ và chҩp nhұn kӃt nӕi
Mӝt khi ÿã tҥo ÿѭӧc socket, ÿһt tên cho nó và chuҭn Eӏ xong hàng
ÿӧi ÿӇ tiӃp nhұn kӃt nӕi, công viӋc sau cùng là chӡ kӃt nӕi Fӫa trình
khách gӱi ÿӃn. %ҥn Jӑi hàm accept() ÿӇ thӵc hiӋn công viӋc này.
#include
int accept(int socketd, struct sockaddr *address, size_t
*address_len);
Hàm hӋ thӕng accept() VӁ trӣ vӅ khi có mӝt trình khách muӕn kӃt
nӕi vӟi ә cҳm socket chӍ ÿӏnh sӕ mô Wҧ socketd. KӃt nӕi Fӫa trình khách
trѭӟc hӃt ÿѭӧc ÿһt vào hàng ÿӧi. Khi accept() phát hiӋn ra có socket
trong hàng ÿӧi, nó sӁ tӵ ÿӝng lҩy ÿӏa chӍ cӫa máy khách ÿһt vào cҩu trúc
address, chiӅu dài thұt sӵ cӫa cҩu trúc ÿӏa chӍ trҧ vӅ trong biӃn
address_len. TiӃp ÿӃn accept() Wҥo ra mӝt socket vô danh. KӃt quҧ trҧ vӅ
Fӫa accept() là sӕ mô Wҧ cho socket vô danh, Eҥn có thӇ sӱ dөng sӕ này
ÿӇ liên Oҥc vӟi trình khách. Socket vô danh mӟi này có cùng kiӇu vӟi
socket ÿһt tên ÿang lҳng nghe trên hàng ÿӧi.
Do cҩu trúc struct sockaddr không có ÿӏnh cho nên Eҥn cҫn thiӃt lұp
kích thѭӟc vӯa ÿӫ ÿӇ tiӃp nhұn ÿӏa chӍ trình khách. NӃu ÿӏa chӍ trình
khách dài hѫn không gian Eҥn dành cho cҩu trúc sockaddr, phҫn dѭ ra VӁ
Eӏ cҳt Eӓ .
Chѭѫng 4: Lұp trình socket
54
NӃu chѭa có kӃt nӕi nào trong hàng ÿӧi, accept() VӁ dӯng Oҥi chӡ –
block( trình chӫ sӁ không thӵc thi các lӋnh kӃ tiӃp) cho ÿӃn khi có kӃt
nӕi Fӫa client gӱi ÿӃn. Bàn có thӇ thay ÿәi cѫ chӃ chӡ này bҵng cách Jӑi
hàm fcntl() ÿiӅu chӍnh và thêm vào cӡ O_NONBLOCK cho socket nhѭ
sau:
int flags=fcntl(socketd, F_GETFL, 0);
fcntl(socketd, F_SETFL, O_NONBLOCK | flags);
Sau khi ÿһt cӡ này cho socket, hàm accept() VӁ không dӯng Oҥi chӡ
khi Eҥn Jӑi nó. accept() VӁ trҧ vӅ ngay sӕ mô Wҧ cho socket nӃu có kӃt nӕi
trong hàng ÿӧi, nӃu không nó sӁ trҧ vӅ -1 và thӵc thi dòng lӋnh kӃ tiӃp.
4.3.7. Yêu cҫu kӃt nӕi
Trình chӫ cӫa Eҥn thѭӡng thӵc hiӋn chӭac năng Wҥo, ÿһt tên, chӡ kӃt
nӕi bҵnh các hàm socket(), bind(), và accept(). Tuy nhiên phía trình
khách ÿѫn giҧn hѭn, Eҥn chӍ cҫn Jӑi hàm connect() ÿӇ yêu cҫu kӃt nӕi
vӟi trình chӫ. connect() ÿѭӧc khai báo nhѭ sau:
#include
int connnect(int socketd, const struct sockaddr *address,
size_t address_len);
Tham sӕ socketd là sӕ mô Wҧ trҧ vӅ bӣi hàm socket(). address là cҩu
trúc ÿӏa chӍ trӓ ÿӃn socket Fӫa trình chӫ. address_len là chiӅu dài Fӫa
biӃn cҩu trúc address. KӃt quҧ trҧ vӅ cӫa hàm là 0 nӃu thành công và
ngѭӧc Oҥi là -1. Trong trѭӡng hӧp -1, biӃn errno VӁ chӭa mӝt trong nhӳng
trӏ sau:
Chѭѫng 4: Lұp trình socket
55
Mã lӛi Mô Wҧ
EBADF S͙ mô W̫ socket truy͉n cho hàm không hͫp l͏
EALREADY Kêt n͙i ÿã ÿ˱ͫc thi͇t l̵p tr˱ͣc ÿó
ETIMEOUT Quá thͥi gian chͥ k͇t n͙i
ECONNREFUSED Trình chͯ server tͳ ch͙i k͇t n͙i
%ҧng 4-4 Mã lӛi Fӫa hàm connect()
NӃu kӃt nӕi không thành công hàm connect() VӁ có gҳng chӡ kӃt nӕi
Oҥi. NӃu sau mӝt sӕ lҫn kӃt nӕi không thành công connect() VӁ trҧ vӅ lӛi
ETIMEOUT.
7ѭѫng tӵ accept() Eҥn có thӇ ÿәi chӃ ÿӝ chӡ cӫa hàm connect()
bҵng cách Jӑi fcntl() ÿһt Oҥi cӡ ENONBLOCK. Bҵng cách này, khi kӃt
nӕi không thành công ӣ lҫn ÿҫu tiên, hàm connect() VӁ không chӡÿӇ lұp
Oҥi kӃt nӕi. Hàm VӁ kӃt thúc và trҧ vӅ mã lӛi ngay lұp tӭc.
4.3.8. Ĉóng kӃt nӕi
7ѭѫng tӵ nhѭ xӱ lý trên file. %ҥn có trách nhiӋm ÿóng các kӃt nӕi
ÿã tҥo ra bҵng cách gӑ hàm close(). Ĉóng kӃt nói VӁ giҧi phóng tài
nguyên và bҧo ÿҧm dӳ liӋu ÿã chuyӇn Wҧi hoàn tҩt ӣ cҧ hai ÿҫu gӱi và
nhұn.
#include
int close(int sockd);
Ĉӕi vӟi Fҧ hai phía trình khách và trình chӫ, Eҥn nên Jӑi close()
ÿóng socket khi lӋnh read trҧ vӅ trӏ 0 (không còn dӳ liӋu ÿӇ ÿӑc).
Chѭѫng 4: Lұp trình socket
56
Thѭӡng thì close() trӣ vӅ ngay tӭc khҳc, tuy nhiên có thӇ close() VӁ Uѫi
vào trҥng thái chӡ (block) nӃu scoket Fӫa Eҥn thiӃt lұp kiӇu kӃt nӕi hai
chiӅu (SOCK_STREAM) cùng vӟi tùy chӑn SOCK_LINGER và dӳ liӋu
ÿang ӣ trҥnh thái chѭa chuyӇn hӃt. Tùy chӑn SOCK_LINER VӁ ÿѭӧc ÿӅ
cұp sau.
4.3.9. Giao tiӃp bҵng socket
Chúng ta vӯa xem qua các hàm hӋ thӕng dùng Wҥo và xӱ lý socket,
giӡ ÿây ta có thӇ trӣ lҥi nhӳng ví dө vӅ sӱ dөng socket Fө thӇ Kѫn.
Nhѭÿã nêu, Eҥn nên sӱ dөng socket theo vùng AF_INET thay cho
AF_UNIX. Socket dӵa trên hӋ thӕng file thѭӡng gһp phҧi mӝt sӕ vҩn ÿӅ
nhѭ chúng chӍ ÿѭӧc truy xuҩt trên hӋ thӕng file chӍ ÿӏnh Fӫa
UNIX/Linux. ViӋc phân quyӅn cho phép ÿӑc ghi file FNJng là mӝt vҩn ÿӅ.
Thѭӡng file socket Wҥo ra trong thѭ Pөc hiӋn hành hoһc thѭ Pөc Wҥm
/tmp và bҥn phҧi cho phép hҫu nhѭ toàn quyӅn truy cұp các thѭ Pөc này
ÿӇ socket hoҥt ÿӝng. Vӟi AF_INET thì vҩn ÿӅ này không phát sinh,
AF_INET dӵa vào cәng và ÿӏa chӍ IP ÿӇ kӃt nӕi. Ӭng Gөng Fӫa Eҥn trên
Linux sӱ dөng AF_INET VӁ dӉ chuyӇn ÿәi sang Windows hѫn là
AF_UNIX.
Trong AF_INET, khi Wҥo mӟi mӝt socket trên trình chӫ, Eҥn phҧi
chӑn mӝt sӕ hiӋu cәng ÿһt cho socket. ViӋc chӑn sӕ hiӋu cәng phҧi loҥi
trӯ nhӳng cәng ÿã ÿѭӧc các ӭng Gөng khác sӱ dөng. %ҥn có thӇ tham
khҧo tұp tin /etc/services, ÿây là tұp tin văn Eҧn liӋt kê danh sách các
Gӏch Yө và cәng ÿã ÿѭӧc ÿӇ dành sӱ dөng, sӕ cәng Fӫa Eҥn không nên
trùng vӟi nhӳng sӕ ÿã có trong danh sách này. Ban FNJng không thӇ sӱ
Gөng các cәng nhӓ Kѫn 1024, chúng dành cho các Gӏch Yө cӫa hӋ thӕng.
Giao tiӃp Pҥng không ÿòi Kӓi phҧi kӃt nӕi vӟi mӝt hӋ thӕng Pҥng
thұt sӵ. Ngay trên mӝt máy, Eҥn có thӇ sӱ dөng giao tiӃp Pҥng ÿӇ liên
Chѭѫng 4: Lұp trình socket
57
Oҥc giӳa các tiӃn trình ÿang chҥy. NӃu cҫn sӕ ÿӏa chӍ IP, Eҥn có thӇ sӱ
Gөng sӕ 127.0.0.1, ÿây là ÿӏa chӍ IP “hӗi qui” (loop back) thѭӡng dùng
cho các ӭng Gөng Fөc bӝ. Vӟi ÿӏa chӍ này, dӳ liӋu gӱi ÿi VӁ quay vӅ ÿúng
ÿӏa chӍ ban ÿҫu, có nghƭa là máy gӱi và máy nhұn ÿѭӧc xem là mӝt. Do
tính chҩt ÿһc biӋt này, nӃu trình khách trên máy Fөc bӝ gӱi dӳ liӋu ÿӃn
trình chӫ theo IP 127.0.0.1 thì trình chӫ cNJng trên máy này VӁ nhұn ÿѭӧc
dӳ liӋu và hӗi âm Oҥi. NӃu máy Eҥn hòa Pҥng, Eҥn nên Kӓi ngѭӡi quҧn trӏ
Pҥng ÿӇ xin mӝt ÿӏa chӍ IP thích hӧp.
Ĉӏa chӍ mҥng IP thѭӡng khó nhӟ, Eҥn có thӇ yêu cҫu socket tiӃp
nhұn mӝt tên gӧi nhӟ khách thay cho sӕ IP. Chҷng Kҥn localhost hay
my.computer.home thay cho 127.0.0.1. Tұp tin văn Eҧn /etc/hosts chӭa
các danh sách chuyӇn ÿәi này. Ví dө, Eҥn có thӇ dùng trình soҥn thҧo vi
hay gnotepad sӱa nӝi dung tұp tin này nhѭ sau:
127.0.0.1 localhost
127.0.0.1 my.computer.home
207.46.131.91 www.microsoft.com
Nhѭ Eҥn thҩy, mӝt ÿӏa chӍ IP có thӇ ánh [ҥ bҵng nhiӅu tên khác
nhau (ÿӏa chӍ IP và tên thѭӡng cách nhau bҵng khoҧng trҳng hay tab).
Thѭӡng ÿӏa chӍ IP 127.0.0.1 ÿѭӧc Jӑi là localhost và không có gì trӣ
ngҥi nӃu Eҥn dӵ ÿӏnh ÿһt cho nó mӝt cái tên khác chҷng Kҥn nhѭ
my.computer.home. Các ÿӏa chӍ Web mà bҥn thѭӡng thҩy nhѭ
www.yahoo.com hay www.microsoft.com là các ÿӏa chӍ toàn cҫu ÿѭӧc
quҧn lý bӣi tә chӭc quӕc tӃ InterNIC. ĈӇ biӃt mӝt tên Jӑi ӭng vӟi mӝt
ÿӏa chӍ IP có tӗn Wҥi hay không, Eҥn có thӇ gӑi lӋnh ping nhѭ sau:
Chѭѫng 4: Lұp trình socket
58
$ ping localhost
PING (127.0.0.1) from 127.0.0.1 : 56 (84) bytes of data.
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=67 usec
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=48 usec
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=51 usec
4.4. Sӱ dөng socket trong ӭng Gөng minh Kӑa
Phҫn lұp trình socket này VӁ ÿѭӧc sӱ dөng ÿӇ thӵc hiӋn viӋc trao ÿәi
thông tin giӳa thành phҫn client và server trong phҫn ӭng Gөng minh
Kӑa.
&ө thӇ thành phҫn client VӁ dùng socket kӃt nӕi ÿӃn thành phҫn
server. Sau khi kӃt nӕi thành công client VӁ gӱi các lӋnh nhѭ Start
Capture, Stop Capture, Get Filter... ÿӃn server, server nhұn các lӋnh này,
thӵc hiӋn xong nó sӁ trҧ lӡi kӃt quҧ thӵc hiӋn là thành công hay thҩt Eҥi
cho client.
Phҫn 3: Xây dӵng ӭng dөng thӱ nghiӋm PacketCap
59
PHҪN 3: XÂY DӴNG ӬNG 'ӨNG THӰ NGHIӊM PACKETCAP
Chѭѫng 5. Phân tích và thiӃt kӃ PacketCap
Chѭѫng 6. Cài ÿһt và thӱ nghiӋm
Chѭѫng 7. Tәng kӃt
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
60
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
5.1. Khҧo sát hiӋn tUҥng
HiӋn nay có rҩt nhiӅu phҫm mӅm bҳt gói tin nhѭ Tcpdump, Microsoft
Network Monitor, Ethereal...Trong ÿó phҫn mӅm nguӗn mӣ Ethereal nәi bұt
vӟi nhiӅu ѭu ÿiӇm nhѭ chҥy trên nhiӅu hӋ ÿiӅu hành, hә trӧ bҳt gói tin theo
nhiӅu giao thӭc khác nhau...
Các phҫn mӅm này có hҥn chӃ chung là khi chúng ÿang bҳt các gói tin
thì chúng ta không thӇ ÿӑc, phân tích các thông tin bҳt ÿѭӧc, hay nói cách
khác khi kӃt thúc quá trình bҳt các gói tin rӗi thì mӟi phân tích các thông tin
này ÿѭӧc.
Nhӳng phҫn mӅm này không hә trӧ viӋc ghi kӃt quҧ vào cѫ sӣ dӳ liӋu,
mà chӍ Oѭu vào các file có cҩu trúc theo ÿӏnh Gҥng riêng Fӫa chúng. NӃu file
này có kích thѭӟc lӟn thì viӋc tìm kiӃm, xӱ lý các thông tin ÿӇ phân tích VӁ rҩt
chұm.
Nhӳng phҫn mӅm này chӍ chҥy trên môi trѭӡng desktop là chӫ yӃu do ÿó
không cho phép cҩu hình tӯ xa (ví dө: ÿLӅu chӍnh bӝ lӑc , thiӃt lұp ÿѭӡng dүn
Oѭu trӳ trên mҥng ….tӯ xa. HiӋn nay các phҫn mӅm này ÿang ÿѭӧc phát triӇn
sang mô hình client/server).
Trong khi ÿó thì nhu cҫu ngѭӡi quҧn trӏ mҥng rҩt ÿa dҥng:
· &ҫn có thông tin vӅ lѭu lѭӧng mҥng ÿӇ ÿLӅu chӍnh băng
thông theo yêu cҫu cӫa khách hàng cNJng nhѭ phát hiӋn
trѭӟc các sӵ cӕ nӃu ÿѭӧc.
· Theo dõi hành ÿӝng truy cұp và xâm nhұp mҥng bҩt hӧp
pháp.
· 7ҩt cҧ hành ÿӝng trên nên là online (phân tích và ÿLӅu
khiӇn) nӃu ÿѭӧc.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
61
5.2. Phân tích và xác ÿӏnh yêu cҫu
5.2.1. Phân tích
ViӋc trao ÿәi thông tin trên mҥng ngày càng nhiӅu, nhu cҫu cӫa các
nhà quҧn trӏ mҥng ÿòi hӓi ngày càng ÿa dҥng, cҫn thiӃt có mӝt chѭѫng
trình có thӇ bҳt gói tin cho phép phân tích, trích lӑc thông tin ngay trong
khi bҳt (các phҫn mӅm bҳt gói tin hiӋn nay không cho phép các nhà quҧn
trӏ sӱ dөng thông tin thu thұp ÿѭӧc khi quá trình bҳt gói tin ÿang thӵc
hiӋn).Ӭng Gөng này VӁ lҩy tên là PacketCap.
Trên cѫ sӣ ÿó, mӝt hӋ thӕng phân tán bҳt gói tin, trích lӑc và luu trӳ
vào cѫ sӣ dӳ liӋu trên mҥng ÿѭӧc xây dӵng ÿӇ khҳc phөc phҫn nào
khuyӃt ÿLӇm trên. HӋ thӕng cho phép nhà quҧn trӏ sӱ dӵng thông tin
ngay trong khi bҳt, tùy chӑn vӏ trí lѭu thông tin và cho phép cҩu hình tӯ
xa viӋc filter các gói tin.Các nhà quҧn trӏ mҥng cNJng có thӇ dùng hӋ
thông này làm cѫ sӣÿӇ phát triӇn tiӃp các ӭng dөng vӅ quҧn trӏ mҥng.
5.2.2. Xác ÿӏnh yêu cҫu
0өc tiêu Fӫa ÿӅ tài là mӝt xây dӵng ӭng Gөng phân tán bҳt các gói
tin, ӭng này VӁ cung cҩp cho quҧn trӏ mҥng nhӳng thông tin phөc Yө cho
viӋc theo dõi và phân tích thông tin Pҥng, dӵa trên nhӳng thông tin ÿѭӧc
cung cҩp này cho phép quҧn trӏ mҥng có thӇ xác ÿӏnh ÿѭӧc tình trҥng Fӫa
toàn bӝ hӋ thӕng Pҥng.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
62
Ӭng Gөng PacketCap này VӁ bao gӗm các chӭc năng:
STT Chӭc năng
1
Bҳt và phân tích ÿѭӧc các gói tin Fӫa nhӳng protocol thông Gөng
nhѭ TCP, UDP, ICMP, ARP...
2
Cho phép lѭu trӳ thông tin bҳt ÿѭӧc dѭӟi Gҥng cѫ sӣ dӳ liӋu và
chӑn hӋ quҧn trӏ Fѫ sӣ dӳ liӋu ÿӇ Oѭu trӳ.
3
Cho phép lѭu trӳ thông tin bҳt theo cҩu trúc file Fӫa Ethereal hoһc
các phҫn mӅm bҳt gói tin khác.
4
ĈiӅu khiӇn tӯ xa viӋc bҳt các gói tin, bao gӗm:
· Khӣi ÿӝng bҳt gói tin
· Dӯng bҳt gói tin
· Lҩy bӝ lӑc hiӋn thӡi
· KӃt thúc chѭѫng trình bҳt gói tin
%ҧng 5-1 Xác ÿӏnh yêu cҫu
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
63
5.3. Các hѭӟng xây dӵng ӭng Gөng PacketCap
HiӋn nay có rҩt nhiӅu phҫn mӅm bҳt gói tin có mã nguӗn mӣ nhѭ
TCPTrace, TcpDump, WinDump, Ethereal,..trong sӕ này thì Ethereal là phҫn
mӅm tӕt nhҩt. Nó hә trӧ rҩt nhiӅu protocol, hә trӧ các ÿӏnh dҥng lѭѭ trӳ cӫa
các phҫn mӅm bҳt gói tin khác, tích hӧp thêm phҫn phân tích thông tin bҳt
ÿѭӧc.
Các phҫn mӅm nguӗn mӣ này ÿӅu sӱ dөng thѭ viӋn lұp trình libcap hoһc
winpcap(tên Fӫa phiên Eҧn libpcap chҥy trên hӋ ÿiӅu hành Windows).
Do có rҩt nhiӅu phҫn mӅm nguӗn mӣ hә trӧ bҳt gói tin nên VӁ có 2
hѭӟng lӵa chӑn ÿӇ phát triӇn ӭng Gөng PacketCap:
Ø Hѭӟng 1: Tìm hiӇu cҩu trúc Fӫa phҫn mӅm Ethereal, tích hӧp thêm
chӭc năng lѭu các gói tin vào cѫ sӣ dӳ liӋu và cҩu hình tӯ xa vào
phҫn mӅm Ethereal.
Ø +ѭóng 2: Sӱ dөng thѭ viӋn lұp trình Pҥng libpcap ÿӇ viӃt lҥi toàn bӝ
ӭng dөng.
5.3.1. Phân tích hѭӟng phát triӇn dӵa trên Ethereal
· Thuұn lӧi
o Source code cӫa Ethereal mӣ có thӇ dӇ dàng download trên
nhiӅu trang web. (www.ethereal.com)
o Không cҫn xây dӵng lҥi các module bҳt gói tin và filter cho
ӭng dөng.
· Khó khăn
o Mã nguӗn Ethereal rҩt nhiӅu và khó hiӇu rõ ÿѭӧc do ÿó viӋc
tích hӧp thêm chӭc năng vào Ethereal là rҩt phӭc tҥp.
o Ethereal chӍ cung cҩp free user guide không cung cҩp
developer guide do ÿó muӕn tìm hiӇu vӅ ethereal phҧi ÿӑc
Wҩt cҧ source code.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
64
5.3.2. Phân tích hѭӟng phát triӇn dӵa trên libcap
· Thuұn lӧi :
o Thѭ viӋn mã nguӗn mӣ libpcap download miӉn phí, ÿѭӧc
nhiӅu nhà phát triӇn sӱ dөng. Phҫn mӅm bҳt gói tin
Tcpdump là mӝt ÿiӇn hình.
o Có nhiӅu tài liӋu hѭӟng dүn lұp trình
o Có thӇ dӉ dàng xây dӵng chѭѫng trình theo ý muӕn
· Khó khăn
o Phҧi viӃt lҥi tҩt cҧ các module capture và filtering trѭӟc khi
thêm vào các yêu cҫu cӫa luұn văn.
5.3.3. Lӵa chӑn hѭӟng phát triӇn PacketCap
Tӯ nhӳng phân tích khó khăn và thuұn lӧi Fӫa 2 hѭӟng phát triӇn
ӭng Gөng PacketCap, chúng em quyӃt ÿӏnh lӵa phát triӇn PacketCap theo
hѭӟng thӭ 2, nghƭa là sӁ xây dӵng tӯ ÿҫu ӭng Gөng bҳt gói tin PacketCap
dӵa trên thѭ viӋn libpcap.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
65
5.4. Các thành phҫn PacketCap
PacketCap có hә chӭc năng ÿiӅu khiӇn xa nên nó sӁ ÿѭӧc xây dӵng theo
mô hình ӭng Gөng Client/ Server.
PacketCap gӗm 3 thành phҫn:
· Thành phҫn thӵc hiӋn viӋc lҳng nghe yêu cҫu tӯ phía client và
bҳt gói tin: PCServer( PacketCap Server)
· Thành phҫn ÿiӅu khiӇn tӯ xa: PCManager.
· Thành phҫn lѭu trӳ: PCStore, thành phҫn này chӍ là Qѫi lѭu trӳ
dӳ liӋu bҳt ÿѭӧc. PCStore thӇ là mӝt máy tính bҩt kì có chҥy hӋ
quҧn trӏ Fѫ sӣ dӳ liӋu MySQL.
Trong mô hình client/ server thì PCServer là thành phҫn server, còn
PCManager là client.
PCServer mӣ cәng 8088 và chӡ kӃt nӕi, nhұn yêu cҫu và thӵc hiӋn yêu
cҫu khi ÿã có client kӃt nӕi vào.
PCManager VӁ kӃt nӕi ÿӃn PCServer và ÿiӅu khiӇn Pӑi hoҥt ÿӝng Fӫa
PCServer.
Hình 5-1 Các thành phҫn Fӫa PacketCap
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
66
5.5. Xây dӵng mô hình use case
5.5.1. Xác ÿӏnh Actor và use case
· Actor là ngѭӡi dùng chѭѫng trình PCManager (client)
· Use case
o Connect: Dùng PCManager kӃt nӕi vào PCServer
o StartCapture: Yêu cҫu PCServer bҳt ÿҫu thӵc hiӋn viӋc bҳt
gói tin.
o StopCapture: Yêu cҫu PCServer dӯng viӋc bҳt gói tin
o GetFilter: lҩy bӝ lӑc hiӋn Wҥi
o Terminate: yêu cҫu PCServer kӃt thúc.
5.5.2. Mô hình use case
Hình 5-2 Mô hình use case
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
67
5.6. Ĉһt Wҧ use case
5.6.1. Connect
· Tên use case: Connect
· Mô Wҧ
Use-case này mô tҧ quá trình quҧn trӏ viên yêu cҫu
PCManager(client) kӃt nӕi ÿӇ quҧn trӏ viӋc bҳt gói tin ӣ máy server.
· Dòng sӵ kiӋn
o Dòng sӵ kiӋn chính
Use-case bҳt ÿҫu khi có yêu cҫu tӯ máy client xin kӃt
Qӕi. Máy client gӱi yêu cҫu ÿӃn máy server.
Sau khi máy server nhұn ÿѭӧc yêu cҫu, nӃu chҩp
nhұn yêu cҫu máy server sӁ gӱi vӅ sӕ port ÿӇ giao
tiӃp, kӃt nӕi thanh công.
1Ӄu máy sever không nhұn yêu cҫu hoһc có sai sót
thì client thông báo lӛi.
o Dòng sӵ kiӋn phө
Không có
o Các dòng sӵ kiӋn khác
· Các yêu cҫu ÿһc biӋt.
o Không có.
· ĈLӅu kiӋn tiên quyӃt.
o Phҧi ÿăng nhұp quyӅn quҧn trӏ mӟi ÿѭӧc thӵc hiӋn Use-
Case này.
o Máy sever cҫn kӃt nӕi phҧi sҹn sàng.
· ĈLӇm mӣ rӝng
o Không có.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
68
5.6.2. StartCapture
· Tên use case: StartCapture
· Mô Wҧ
Use-case này mô tҧ quá trình quҧn trӏ viên yêu cҫu máy client
gӱi lӋnh yӃu cҫu server bҳt ÿҫu viӋc bҳt gói tin.
· Dòng sӵ kiӋn
o Dòng sӵ kiӋn chính
Use-case bҳt ÿҫu khi có yêu cҫu tӯ máy client. Máy client
gӱi yêu cҫu ÿӃn máy server.
Sau khi máy server nhұn ÿѭӧc yêu cҫu sӁ kiӇm tra tiӃn
trình bҳt gói tin ÿã ÿѭӧc thӵc thi chѭa.
1Ӄu tiӃn trình chѭa thӵc thi thì thӵc thi viӋc bҳt gói tin
Oѭu vào cѫ sӣ dӳ liӋu, thông báo vӅ máy client yêu cҫu
ÿã ÿѭӧc ÿáp ӭng.
1Ӄu tiӃn trình ÿã ÿѭӧc thӵc thi thì gӱi thông báo lӛi vӅ.
o Dòng sӵ kiӋn phө
KiӇm tra CSDL ngày ÿó ÿã có chѭa. NӃu có rӗi thì mӣ
Fѫ sӣ dӳ liӋu ÿӇ lѭu. NӃu chѭa có thì tҥo cѫ sӣ dӳ liӋu
Pӟi.
Quҧn trӏ viên chӍnh sӱa các thông tin liên quan ÿӃn
phòng ban, rӗi cұp nhұt lѭu lҥi. Use-case kӃt thúc.
Máy client yêu cҫu quҧn trӏ nhұp cҩu trúc filter gói tin.
KiӇm tra tính hӧp lӋ cӫa cҩu trúc filter.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
69
o Các dòng sӵ kiӋn khác
Không có
· Các yêu cҫu ÿһc biӋt
o Không có.
· ĈLӅu kiӋn tiên quyӃt
o Phҧi ÿăng nhұp quyӅn quҧn trӏ mӟi ÿѭӧc thӵc hiӋn Use-
Case này.
· ĈLӇm mӣ rӝng
o Không có.
5.6.3. StopCapture
· Tên use case: StopCapture
· Mô Wҧ:
Use-case này mô tҧ quá trình quҧn trӏ viên yêu cҫu máy
client gӱi ÿӃn server yêu cҫu kӃt thúc bҳt gói tin.
· Dòng sӵ kiӋn
o Dòng sӵ kiӋn chính
Use-case bҳt ÿҫu khi có yêu cҫu tӯ máy client. Máy
client gӱi yêu cҫu ngѭng bҳt gói tin ÿӃn máy
server.
Sau khi máy server nhұn ÿѭӧc yêu cҫu sӁ kiӇm tra
tiӃn trình bҳt gói tin ÿã ÿѭӧc thӵc thi chѭa.
1Ӄu tiӃn trình chѭa thӵc thi thì thӵc thi thì ngѭng
Eҳt gói tin, thông báo vӅ máy client yêu cҫu ÿã
ÿѭӧc ÿáp ӭng.
1Ӄu tiӃn trình chѭa ÿѭӧc thӵc thi thì gӱi thông báo
Oӛi vӅ.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
70
o Dòng sӵ kiӋn phө
Ĉóng cѫ sӣ dӳ liӋu
· Các dòng sӵ kiӋn khác
o Không có.
· Các yêu cҫu ÿһc biӋt
o Không có.
· ĈLӅu kiӋn tiên quyӃt
Phҧi ÿăng nhұp quyӅn quҧn trӏ mӟi ÿѭӧc thӵc hiӋn Use-Case
này.
· ĈLӇm mӣ rӝng
o Không có.
5.6.4. GetFilter
· Tên use case: GetFilter
· Mô Wҧ
Use-case này mô tҧ quá trình quҧn trӏ viên yêu cҫu máy client
gӱi yêu cҫu cho server trҧ lӡi bӝ lӑc hiӋn thӡi.
· Dòng sӵ kiӋn
o Dòng sӵ kiӋn chính
Use-case bҳt ÿҫu khi có yêu cҫu tӯ máy client yêu
Fҫu thay lҩy filter hiӋn Wҥi ÿang dùng ÿӇ bҳt gói tin.
Sau khi máy server nhұn ÿѭӧc yêu cҫu sӁ kiӇm tra
tiӃn trình bҳt gói tin ÿã ÿѭӧc thӵc thi chѭa.
1Ӄu tiӃn trình ÿã thӵc thi thì nó sӁ gӱi trҧ lӡi cho
client
1Ӄu tiӃn trình chѭa ÿѭӧc thӵc thi thì gӱi thông báo
Oӛi vӅ cho client.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
71
o Dòng sӵ kiӋn phө
Ĉóng cѫ sӣ dӳ liӋu
o Các dòng sӵ kiӋn khác
· Các yêu cҫu ÿһc biӋt
o Không có.
· ĈLӅu kiӋn tiên quyӃt:
o Không có
· ĈLӇm mӣ rӝng:
o Không có.
5.6.5. Terminate
· Tên use case: Terminate
· Mô Wҧ:
Use-case này mô tҧ quá trình quҧn trӏ viên yêu cҫu máy
client gӱi ÿӃn server yêu cҫu server kӃt thúc( thoát).
· Dòng sӵ kiӋn
o Dòng sӵ kiӋn chính
Use-case bҳt ÿҫu khi có yêu cҫu tӯ máy client. Máy
client gӱi yêu cҫu kӃt thúc chѭѫng trình server.
Sau khi máy server nhұn ÿѭӧc yêu cҫu sӁ kiӇm tra
nӃu quá trình bҳt gói tin ÿang chҥy thì nó sӁ chҩm
dӭt.
Thoát ra khӓi chѭѫng trình. (chҩm dӭt)
o Dòng sӵ kiӋn phө
Ĉóng cѫ sӣ dӳ liӋu
· Các dòng sӵ kiӋn khác
o Không có.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
72
· Các yêu cҫu ÿһc biӋt
o Không có.
· ĈLӅu kiӋn tiên quyӃt
Phҧi ÿăng nhұp quyӅn quҧn trӏ mӟi ÿѭӧc thӵc hiӋn Use-Case
này.
· ĈLӇm mӣ rӝng
o Không có.
5.7.ThiӃt kӃ dӳ liӋu
5.7.1. Phân tích các hѭӟng lѭu trӳ
Có 3 hѭӟng
· +ѭӟng 1: Các máy client bҳt gói tin trên các mҥng khác nhau và
Gӳ liӋu ÿѭӧc truyӅn vӅ lѭu trӳ trên mӝt máy server.
Hình 5-3 Mô hình lѭu trӳ 1
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
73
o Ѭu ÿLӇm :
'ӳ liӋu ÿѭӧc lѭu tұp trung dӉ dàng cho viӋc xӱ lý sau này.
o KhuyӃt ÿLӇm
Khi sӕ lѭӧng các gói tin bҳt ÿѭӧc quá nhiӃu viӋc truyӅn dӳ
liӋu vӅ máy server có thӇ làm bұn ÿѭӡng truyӅn cӫa mҥng.
Ĉòi hӓi dung lѭӧng lѭu trӳ rҩt lӟn ӣ máy server.
· +ѭӟng 2 : Giӕng nhѭ hѭӟng 1 nhѭng thiӃt lұp thêm mӝt mҥng
LAN giӳa các máy client và sever ÿӇ truyӅn dӳ liӋu.
Hình 5-4 Mô hình lѭu trӳ 2
o Ѭu ÿLӇm :
Khҳc phөc ÿѭӧc khuyӃt ÿLӇm cӫa hѭӟng 1
o KhuyӃt ÿLӇm
Tӕn kém trong viӋc thiӃt lұp mҥng LAN.
ViӋc thiӃt lұp mҥng LAN có thӇ gһp khó khăn trong trѭӡng
Kӧp các máy client ӣ quá xa nhau.
Ĉòi hӓi dung lѭӧng lѭu trӳ rҩt lӟn ӣ máy server.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
74
· +ѭӟng 3 : Lѭu phân tán trên các máy client và chӍ truyӅn dӳ liӋu
YӅ theo yêu cҫu cӫa client.
Hình 5-5 Mô hình lѭu trӳ 3
o Ѭu ÿLӇm:
ChӍ truyӅn nhӳng dӳ liӋu ÿѭӧc client yêu cҫu nên phҫn
nào khҳc phөc ÿѭӧc khuyӃt ÿLӇm cӫa hѭӟng 1.
ViӋc lѭu trӳ phân tán sӁ không ÿòi hӓi dung lѭӧng lѭu trӳ
Oӟn ӣ mӝt máy.
ViӋc xây dӵng chѭѫng trình thӵc hiӋn lѭu trӳ phân tán sӁ
GӉ dàng hѫn.
o KhuyӃt ÿiӇm
Ӭng Gөng PacketCap cho phép lѭu trӳ theo Fҧ 3 hѭóng trên.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
75
5.7.2. ThiӃt kӃ Fѫ sӣ Gѭ liӋu
5.7.2.1. Danh sách các ÿәi tѭӧng (table)
STT Tên ÿӕi tѭӧng Mô Wҧ
1 PACKET Thông tin chung tҩt cҧ các gói tin bҳt ÿѭӧc
2 IP Thông tin vӅ IP header cӫa gói tin
3 TCP Thông tin chi tiӃt vӅ gói tin TCP
4 UDP Thông tin chi tiӃt vӅ gói tin UDP
5 ICMP Thông tin chi tiӃt vӅ gói tin ICMP
6 IGMP Thông tin chi tiӃt vӅ gói tin IGMP
7 ARP Thông tin chi tiӃt vӅ gói tin ARP
%ҧng 5-2 Danh sách các ÿӕi tѭӧng
Sau ÿây là mô tҧ chi tiӃt mӝt sӕ lӟp ÿӕi tѭӧng quan trӑng cӫa hӋ
thӕng.
5.7.2.2 Table PACKET
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2 Source Mac Chuӛi (10)
Ĉӏa chӍ mac cӫa máy gӱi
gói tin
3
Dest Mac
Chuӛi (10)
Ĉӏa chӍ mac cӫa máy
nhұn gói tin
4 Packetlength Chuӛi (10) chiӅu dài gói tin
5 Time Chuӛi (20) Thӡi gian nhұn gói tin
6 Data Chuӛi (1000) Dӳ liӋu cӫ gói tin
%ҧng 5-3 Table PACKET
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
76
6.7.2.4. Table IP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏa chӍ mac cӫa máy gӱi
2 Service Chuӛi (10) Service cӫa gói tin
3 ID Chuӛi (10) ID cӫa gói tin
4 TTL Chuӛi (20) Time to live
5 ChecksumIP Chuӛi (20) Checksum cӫa IP
6 SourceIP Chuӛi (20) Ĉӏa chӍ IP nguӗn
7 Dest IP Chuӛi (20) Ĉӏa chӍ IP ÿích
%ҧng 5-4 Table IP
5.7.2.5. Table TCP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2 Source Port Chuӛi (10) Port nguӗn
3 Dest Port Chuӛi (10) Port ÿích
4 Seg No Chuӛi (20) Sӕ segment
5 Ack No Chuӛi (20) Ack
6 Winsize Chuӛi (20) Winsize
7 checksumTCP Chuӛi (20) Checksum cӫa TCP
8 Type Chuәi (20)
%ҧng 5-5 Table TCP
Type : {"FIN ","SYN ","RST ","PUSH ","ACK ","URG ","ECE ","CWR "}
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
77
5.7.2.6. Table UDP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2 Source Port Chuӛi (10) Port nguӗn
3 Dest Port Chuӛi (10) Port ÿích
4 ChecksumUDP Chuӛi (20) Checksum cӫa UDP
%ҧng 5-6 Table UDP
5.7.2.7 Table ICMP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2
ICMP message
group
Chuӛi (10)
3 Type Chuӛi (10)
4 Code Chuӛi (20)
5 Id Chuӛi (20)
6 Seg No Chuӛi (20)
%ҧng 5-7 Table ICMP
Các hҵng và ý nghƭa cӫa ICMP message group
( 0, "Echo Reply"},
{ 3, "Destination Unreachable"},
{ 4, "Source Quench"},
{ 5, "Redirect Message"},
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
78
{ 6, "Alternate Host Address"},
{ 8, "Echo Request"},
{ 9, "Router Advertisement"},
{ 10, "Router Selection"},
{ 11, "Time Exceeded"},
{ 12, "Parameter Problem"},
{ 13, "Timestamp Request"},
{ 14, "Timestamp Reply"},
{ 15, "Information Request"},
{ 16, "Information Reply"},
{ 17, "Address Mask Request"},
{ 18, "Address Mask Reply"},
5.7.2.8 Table IGMP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2
IGMP message
group
Chuӛi (10)
3 Type Chuӛi (10)
4 Response Time Chuӛi (20)
5 Checksum Chuӛi (20)
6 Group Addr Chuӛi (20)
%ҧng 5-8 Table IGMP
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
79
Các hҵng và ý nghƭa cӫa IGMP message group:
{ 0x11 ," Group Membership Query."},
{0x12 ,"IGMPv1 Membership Report." },
{0x13 ,"DVMRP. "},
{0x14 ,"PIMv1. "},
{0x15 ,"Cisco Trace Messages. "},
{0x16 ,"IGMPv2 Membership Report. "},
{0x17 ,"IGMPv2 Leave Group." },
{0x1E ,"Multicast Traceroute Response. "},
{0x1F ,"Multicast Traceroute. "},
{0x22 ,"IGMPv3 Membership Report. "},
{0x24 ,"Multicast Router Advertisement. "},
{0x25 ,"Multicast Router Solicitation. "},
{0x26 ,"Multicast Router Termination. "}
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
80
5.7.2.9. Table ARP
ST
T
Tên thuӝc tính KiӇu dӳ liӋu Ý nghƭa
Ràng
buӝc
1 Ma Chuӛi (10) Ĉӏnh danh gói tin
2 ARP type Chuӛi (10)
3 ARP Source IP Chuӛi (10)
4 ARPDest IP Chuӛi (20)
5 Group Addr Chuӛi (20)
%ҧng 5-9 Table ARP
ARP type:
ARP Request frame
ARP Reply frame
RARP Request frame
RARP Reply frame
Unknown ARP
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
81
5.8. Xây dӵng PCServer( server), PCManager(client)
5.8.1. Lѭu ÿӗ PCServer
Hình 5-6 Lѭu ÿӗ PCServer
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
82
5.8.2. Lѭu ÿӗ PCManager( Client)
Hình 5-7 Lѭu ÿӗ PCManager
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
83
5.8.3. Cҩu trúc dӳ liӋu trao ÿәi giӳa PCServer và PCManager
Sau khi Client kӃt nӕi thành công vӟi PCServer, PCManager và
PCServer VӁ trao ÿәi các thông ÿiӋp vӟi nhau. &ө thӇ là PCManger sӁ
gӱi yêu cҫu lên cho PCServer và sau khi thӵc hiӋn yêu cҫu Fӫa
PCManager, Server VӁ gӱi trҧ lӡi kӃt quҧ thӵc hiӋn cho Client.
Cҩu trúc Fӫa mӛi thông ÿiӋp nhѭ sau:
struct tagCMD
{
int CmdCode;
int IPFilterType;
int b1,b2,b3,b4;//4 parts of IP address(for filter)
int PortFilterType;
int Port;
int ProtocolFilter;//TCP, UDP, ICMP..
int mb1,mb2,mb3,mb4;//MySQL
int NumberPacket;
};
Vӟi CmdCode là mã lӋnh cҫn gӱi, các mã lӋnh mày ÿѭӧc ÿӏnh
nghƭa bҵng các hҵng ÿӇ dӉ dàng cho viӋc lұp trình.
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
84
IPFilterType xác ÿӏnh kiӇu Oӑc theo ÿӏa chӍ IP, giá trӏ cӫa nó ÿѭӧc
ÿӏnh nghƭa nhѭ sau:
#define NO_FILTER 0
#define SOURCE_FILTER 1
#define DEST_FILTER 2
#define SOURCE_OR_DEST_FILTER 3
#define SOURCE_AND_DEST_FILTER 4
NӃu IPFilterType=NO_FILTER nghƭa là không thӵc hiӋn viӋc
Oӑc các gói tin theo ÿӏa chӍ IP, nӃu IPFilterType khác 0 thì lúc ÿó
b1,b2,b3,b4 sӁ là ÿӏa chӍ IP cҫn Oӑc. Bӕn sӕ nguyên này VӁ hình thành
ÿӏa chӍ IP theo Gҥng b1.b2.b3.b4
SOURCE_FILTER lӑc theo ÿӏa chӍ IP nguӗn, các gói tin có ÿӏa
chӍ nguӗn (nѫi gӱi) bҵng b1.b2.b3.b4 VӁ ÿѭӧc bҳt Oҥi.
DEST_FILTER lӑc theo ÿӏa chӍ ÿích, các gói tin có ÿӏa chӍ ÿích
(nѫi ÿӃn) bҵng b1.b2.b3.b4 sӁ ÿѭӧc bҳt Oҥi.
PortFilterType xác ÿӏnh kiӇu Oӑc theo Port Fӫa ӭng Gөng, giá trӏ cӫa
nó ÿѭӧc ÿӏnh nghƭa nhѭ Fӫa IPFilterType.
SOURCE_OR_DEST nhӳng gói tin có ÿӏa chӍ nguӗn hoһc ÿích
bҵng b1.b2.b3.b4 VӁ ÿѭӧc bҳt.
SOURCE_AND_DEST nhӳng gói tin có ÿӏa chӍ nguӗn bҵng
b1.b2.b3.b4 VӁ ÿѭӧc bҳt và nhӳng gói tin có ÿӏa chӍ ÿích bҵng
b1.b2.b3.b4 VӁ ÿѭӧc bҳt.
Tѭѫng tӵ Yѫí IPFilterType là PortFilterType
Protocol là giao thӭc cҫn Oӑc, 0 có nghƭa là không Oӑc, 1 là lӑc theo
TCP...
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
85
Mb1, mb2, mb3,mb4 là 4 thành phҫn Fӫa ÿӏa chӍ IP Fӫa máy tính
chҥy hӋ quҧn trӏ Fѫ sӣ dӳ liӋu mà ta muӕn lѭu thông tin bҳt ÿѭӧc vào ÿó.
NumberPacket xác ÿӏnh sӕ gói tin cҫn bҳt.
5.9.ThiӃt kӃ giao diӋn PCManager( phiên Eҧn chҥy trên Windows)
Mô Wҧ
6ӕ
thӭ
Wӵ
Tên ÿӕi tѭӧng KiӇu ÿӕi
Wѭӧng
Ghi chú
1 IDC_STATIC Label IP
2 IDC_IPADDR_SOURCE IP Address Nhұp IP cҫn filter
3 CboFilterIP Combobox Lӵa chӑn kiӇu filter theo IP
4 IDC_STATIC Label Port
5 IDC_SOURCEPORT Textbox Nhұp port cҫn filter
6 CboFilterPORT Combobox Lӵa chӑn kiӇu filter theo IP
Chѭѫng 5: Phân tích và thiӃt kӃ PacketCap
86
7 IDC_STATIC Label Protocol
8 CboProtocol Combobox Chӑn protocol cҫn filter
9 IDC_STATIC Label Thông báo nhұp IP
10 IDC_IPADDR_MYSQL IP Address Chӑn máy chҥy MySQL
11 IDC_STATIC Label Number of packet
12 IDC_NUMBER Combo
box
6ӕ lѭӧng packet cҫn bҳt
13 IDC_STATIC Label Server IP
14 IDC_IPADDR_SERVER Textbox Nhұp ÿӏa chӍ IP máy
PCServer cҫn ÿLӅu khiӇn
15 IDC_STATUS Label Báo tình trҥng kӃt nӕi
16 BtnStart button Bҳt ÿҫu bҳt gói tin
17 BtnStop Button KӃt thúc viӋc bҳt gói tin
18 BtnGetFilter Button Lҩy thông tin filter hiӋn
thӡi
19 BtnTermServer Button KӃt thúc liên kӃt vӕ server
20 BtnConnect Button KӃt nӕi ÿӃn ma1y server
21 BtnExit Button Thoát khӓi chѭѫng trình
%ҧng 5-10 Mô Wҧ màn hình PCManager
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm
87
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm
6.1. Cài ÿһt
Phҫn PCServer VӁ ÿѭӧc cài ÿһt trên môi trѭӡng Linux, PCManager VӁ ÿѭӧc
cài ÿһt trên Fҧ 2 môi trѭӡng Linux và Windows.
· Môi trѭӡng cài ÿһt ӭng Gөng
o Windows XP Professional
o Linux Redhat 9.0
· Môi trѭӡng lұp trình
o C for Linux
o Visual C++ 6.0
· Môi trѭӡng cài ÿһt thӱ nghiӋm
o PCServer: Linux Redhat 9.0
o PCManager: Windows XP Professional
o PCManager: Linux Redhat 9.0
· Các phҫn mӅm hә trӧ
PCServer : MySQL, thѭ viӋn libpap
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm
88
6.2. Thӱ nghiӋm
6.2.1. Mô hình thӱ nghiӋm 1
Hình 6-1 Mô hình thӱ nghiӋm 1
· Mô Wҧ: PCServer và PCStore cùng chҥy trên mӝt máy,
PCManager và PCServer cùng trong mӝt LAN segment
· KӃt quҧ:
o PCManager kӃt nӕi vào PCServer thành công
o PCServer thӵc hiӋn tӕt tҩt Fҧ các yêu cҫu do PCManager
gӱi ÿӃn
o PCServer ghi kӃt quҧ bҳt ÿѭӧc vào cѫ sӣ dӳ liӋu MySQL
thành công.
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm
89
6.2.2. Mô hình thӱ nghiӋm 2
Hình 6-2 Mô hình thӱ nghiӋm 2
· Mô Wҧ: PCServer và PCStore có thӇ lӵa chӑn chҥy trên cùng 1
máy hoһc ӣ 2 máy khác nhau.
· KӃt quҧ:
o PCManager kӃt nӕi vào PCServer thành công
o PCServer thӵc hiӋn tӕt tҩt Fҧ các yêu cҫu do PCManager
gӱi ÿӃn
o PCServer ghi kӃt quҧ bҳt ÿѭӧc vào cѫ sӣ dӳ liӋu MySQL
thành công.
Chѭѫng 6: Cài ÿһt và thӱ nghiӋm
90
6.2.3. Mô hình thӱ nghiӋm 3
Hình 6-3 Mô hình thӱ nghiӋm 3
· Mô Wҧ
PCServer và PCManager chҥy trên 2 Pҥng LAN khác nhau
ÿѭӧc nӕi qua 1 router.
· KӃt quҧ
Chѭa thӱ nghiӋm ÿѭӧc mô hình này do không có thiӃt Eӏ.
Chѭѫng 7: Tәng kӃt
91
Chѭѫng 7: Tәng kӃt
7.1. KӃt luұn
7.1.1. KӃt quҧ ÿҥt ÿѭӧc
Sau khi thӵc hiӋn xong ÿӅ tài, chúng em ÿã thu ÿѭӧc mӝt sӕ kӃt
quҧ:
· Tìm hiӇu ÿѭӧc thѭ viӋn mã nguӗn mӣ libpcap và viӃt ÿѭӧc ӭng
Gөng bҳt gói tin dӵa vào thѭ viӋn này. Ĉây là bӝ thѭ viӋn mã
nguӗn mӣ hә trӧ lұp trình Pҥng cҩp thҩp ÿѭӧc sӱ dөng rҩt nhiӅu
trong các phҫn mӅm hә trӧ bҳt gói tin nhѭ TcpDump, TCPFlow,
Ethereal...
· Tìm hiӇu hӋ quҧn trӏ Fѫ sӣ dӳ liӋu mã nguӗn mӣ MySQL.
· Tìm hiӇu vҩn ÿӅ lұp trình socket, multithread trên môi trѭӡng
Linux.
· Xây dӵng ÿѭӧc ӭng Gөng phân tán bҳt các gói tin phөc Yө cho
viӋc phân tích thông tin Pҥng.
7.1.2. +ҥn chӃ
· Chѭa thӇ bҳt gói tin ÿӗng trên nhiӅu card Pҥng
· 6ӕ lѭӧng protocol có thӇ phân tích và trích Oӑc thông tin không
nhiӅu
· Chѭa hӛ trӧ chӭc năng phân tích thông tin tӯ nhӳng dӳ liӋu ÿã
bҳt ÿѭӧc.
Chѭѫng 7: Tәng kӃt
92
7.2. Hѭӟng phát triӇn
Trong tѭѫng lai, ӭng Gөng PacketCap VӁ ÿѭӧc phát triӇn thêm nhӳng
chӭc năng mӟi và nâng cҩp chӭc năng hiӋn Wҥi chѭa ÿѭӧc tӕt.
· Hә trӧ bҳt các gói tin ÿӗng thӡi trên nhiӅu card Pҥng
· 7ăng thêm sӕ lѭӧng protocol mà chѭѫng trình có thӇ phân tích và
trích Oӑc thông tin.
· +ӛ trӧ Oѭu thông tin bҳt ÿѭӧc theo các ÿӏnh Gҥng Fӫa Ethereal,
TcpDump..
Phө Lөc
93
PHӨ LӨC Hѭӟng dүn sӱ dөng PacketCap
1.Chѭѫng trình PCServer
ĈӇ chҥy chѭѫng trình Server Eҥn chӍ cҫn vào thѭ Pөc chӭa chѭѫng trình
server và gõ lӋnh ./pcserver thì chѭѫng trình VӁ ÿѭӧc thӵc thi.
ĈӇ thoát khӓi chѭѫng trình PCServer Eҥn có thӇ dùng chѭѫng trình
Client gӱi yêu cҫu kӃt thúc chѭѫng trình PCServer, hoһc nhҩn tә hӧp phím
Ctrl-C trên console ÿang chҥy PCserver.
2. Chѭѫng trình PCManager
2.1. PCManager trên môi trѭӡng Linux
7ѭѫng tӵ nhѭ khi chҥy PCServer, Eҥn vào thѭ Pөc có chӭa chѭѫng
trình PCManager rӗi gõ lӋnh ./pcman.Chѭѫng trình VӁ yêu cҫu nhұp ÿӏa
chӍ IP Fӫa máy chҥy PCServer. NӃu kӃt nӕi thành công thì chѭѫng trình
VӁ hiӇn thӏ các dòng thông báo, Eҥn chӍ cҫn nhұp các giá trӏ hiӇn thӏ trên
màn hình là có thӇ ÿiӅu khiӇn ÿѭӧc hoҥt ÿӝng Fӫa PCServer.
Phө Lөc
94
2.2. PCManager trên môi trѭӡng Windows
Double click chuӝt vào file PCManager.exe, giao diӋn Fӫa chѭѫng trình
Hình 7-1 Màn hình PCManager
Ĉánh ÿӏa chӍ IP Fӫa PCServer vào Pөc PCServerIP, click chuӝt vào
nút Connect nӃu kӃt nӕi thành công thì dòng trҥng thái phía dѭӟi nút
Connect VӁ thông báo kӃt quҧ kӃt nӕi thành công hay không.
NӃu thành kӃt nӕi thành công thì các nút lӋnh VӁ có hiӋu lӵc. Lúc
này ta mӟi có thӇ thӵc hiӋn các thao tác ÿiӅu khiӇn ÿѭӧc.
Ví dөÿӇ bҳt tҩt Fҧ các gói tin ÿi qua card Pҥng( Fӫa máy ÿang chҥy
PCServer) và Oѭu kӃt quҧ vào chính máy tính ÿang chҥy PCServer thì chӍ
cҫn click chuӝt vào nút StartCapture
ĈӇ kӃt thúc chѭѫng trình PCServer thì click chuӝt vào nút
Terminate Server.
Tài liӋu tham khҧo
95
TÀI LIӊU THAM KHҦO
[1] NguyӉn Phѭѫng Lan – Hoàng Ĉӭc +ҧi, Lұp trình Linux tұp 1, NXBGiáo
Dөc, Hӗ Chí Minh, 2001
[2] Sams, Linux Programming Unleashed, 1999
Website
[3] VietNam OpenSource Forum, www.vnoss.org
[4] MySQL, www.mysql.com
[5] libpcap, www.tcpdump.org
[6] SourceForge, www.sourceforge.net
Các file đính kèm theo tài liệu này:
- Unlock-0112016-0112081.pdf