Khóa luận Nghiên cứ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 liệu Khóa luận Nghiên cứ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 ........................................................................................................................... ........................................................................................................................... ........................................................................................................................... ......................

pdf91 trang | Chia sẻ: hunglv | Lượt xem: 1028 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Khóa luận Nghiên cứ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 d͹a 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:

  • pdf01120160112081.pdf