.t tên cho socket

Một phần của tài liệ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ý (Trang 47)

Sau khi ã nh a ch , 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 n c n i hàm bind() rabgd bu c nh ng thông tin này cho socket ã m ra tr c ó.

#include <sys/socket.h>

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 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 sockaddr_un và sockaddr_in

Khi ràng bu c thành công bind() tr v tr 0. N u không hàm tr v -1 và errno ch a m t trong các l i sau:

Mã l i

EBADF S mô file không h p l

ENOTSOCK S mô file không dành cho socket

EINVAL S mô 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 ng

Ch ng 4: L p trình socket

N u n m socket thu c vùng AF_UNIX errno có th nh n thêm các l i sau:

Mã l i

EACCESS Không th t o file cho socket do không có

quy n o file

ENOTDIR,

ENAMETOOLONG

Tên file không h p l

ng 4-3 Các mã l i a domain AF_UNIX

Ràng bu c tên socket là b c quan tr ng nh t socket a n có kh ng nhìn th y và truy xu t c t các ng ng bên ngoài.

M t socket n u ch a c t tên i là socket vô danh ( unnamed socket). 4.3.5. o hàng i cho socket ón nh n các k t n i chuy n n, socket trình ch ph i o ra m t hàng i (queue). c ích a hành i là u i các k t n i ch a c trình ch x lý k p. Hàm h th ng listen() th c hi n công vi c này. #include <sys/socket.h>

int listen(int socketd, int backlog);

Tham s socketd cho bi t s mô socket c n 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

Ch ng 4: L p trình socket

Hàm listen() tr v 0 n u o hàng i thành công, n u th t i tr tr v s là -1 và bi n errno 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 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 a trình khách g i n. n i hàm accept() th c hi n công vi c này.

#include <sys/socket.h>

int accept(int socketd, struct sockaddr *address, size_t *address_len); (adsbygoogle = window.adsbygoogle || []).push({});

Hàm h th ng accept() 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ô socketd. K t n i 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() o ra m t socket vô danh. K t qu tr v

a accept() là s mô cho socket vô danh, n có th s d ng s này liên 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 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 n dành cho c u trúc sockaddr, ph n d ra

Ch ng 4: L p trình socket

N u ch a có k t n i nào trong hàng i, accept() d ng 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 a client g i n. Bàn có th thay i c ch ch này b ng cách 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() không d ng i ch khi n i nó. accept() tr v ngay s mô 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 n th ng th c hi n ch ac n ng 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, n ch c n 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 <sys/socket.h>

int connnect(int socketd, const struct sockaddr *address, size_t address_len);

Tham s socketd là s mô tr v b i hàm socket(). address là c u trúc a ch tr n socket a trình ch . address_len là chi u dài 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 i là -1. Trong tr ng h p -1, bi n errno ch a m t trong nh ng tr sau:

Ch ng 4: L p trình socket

Mã l i Mô

EBADF S mô 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 a hàm connect()

N u k t n i không thành công hàm connect() có g ng ch k t n i i. N u sau m t s l n k t n i không thành công connect() tr v l i ETIMEOUT.

ng t accept() n có th i ch ch c a hàm connect() b ng cách i fcntl() t 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() không ch l p

i k t n i. Hàm k t thúc và tr v mã l i ngay l p t c.

4.3.8. óng k t n i

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 gi i phóng tài nguyên và b o m d li u ã chuy n i hoàn t t c hai u g i và nh n.

#include <sys/socket.h> int close(int sockd);

i v i hai phía trình khách và trình ch , n nên 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

Th ng thì close() tr v ngay t c kh c, tuy nhiên có th close() i vào tr ng thái ch (block) n u scoket a 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 c c p sau. (adsbygoogle = window.adsbygoogle || []).push({});

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 o và x lý socket, gi ây ta có th tr l i nh ng ví d v s d ng socket th n.

Nh ã nêu, 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 a UNIX/Linux. Vi c phân quy n cho phép c ghi file ng là m t v n . Th ng file socket o ra trong th c hi n hành ho c th c m /tmp và b n ph i cho phép h u nh toàn quy n truy c p các th 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 ng a n trên Linux s d ng AF_INET d chuy n i sang Windows h n là AF_UNIX.

Trong AF_INET, khi o m i m t socket trên trình ch , 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 ng khác s d ng. n có th tham kh o t p tin /etc/services, ây là t p tin v n n li t kê danh sách các ch và c ng ã c dành s d ng, s c ng a n không nên trùng v i nh ng s ã có trong danh sách này. Ban ng không th s

Ch ng 4: L p trình socket

c gi a các ti n trình ang ch y. N u c n s a ch IP, n có th s ng s 127.0.0.1, ây là a ch IP “h i qui” (loop back) th ng dùng cho các ng ng c b . V i a ch này, d li u g i i 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 c b g i d li u n trình ch theo IP 127.0.0.1 thì trình ch c ng trên máy này nh n c d li u và h i âm i. N u máy n hòa ng, n nên i ng i qu n tr

ng xin m t a ch IP thích h p.

a ch m ng IP th ng khó nh , 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 n localhost hay my.computer.home thay cho 127.0.0.1. T p tin v n n /etc/hosts ch a các danh sách chuy n i này. Ví d , 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 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 i là localhost và không có gì tr ng i n u n d nh t cho nó m t cái tên khác ch ng 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 i ng v i m t a ch IP có t n i hay không, n có th g i l nh ping nh sau:

Ch ng 4: L p trình socket

$ 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 ng minh a

Ph n l p trình socket này 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 ng minh

a.

th thành ph n client dùng socket k t n i n thành ph n server. Sau khi k t n i thành công client 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 i cho client.

Ph n 3: Xây d ng ng d ng th nghi m PacketCap

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 5: Phân tích và thi t k PacketCap

Ch ng 5: Phân tích và thi t k PacketCap

5.1. Kh o sát hi n t 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 u vào các file có c u trúc theo nh ng riêng 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 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 : u ch nh b l c , thi t l p ng d n 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). (adsbygoogle = window.adsbygoogle || []).push({});

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 u ch nh b ng thông theo yêu c u c a khách hàng c ng 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.

Ch ng 5: Phân tích và thi t k PacketCap

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 ng này 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 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 c ng 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

c tiêu a tài là m t xây d ng ng ng phân tán b t các gói tin, ng này cung c p cho qu n tr m ng nh ng thông tin ph c cho vi c theo dõi và phân tích thông tin 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 a toàn b h th ng ng.

Ch ng 5: Phân tích và thi t k PacketCap

ng ng PacketCap này 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 a nh ng protocol thông ng nh TCP, UDP, ICMP, ARP...

2 Cho phép l u tr thông tin b t c d i ng c s d li u và ch n h qu n tr s d li u u tr .

3 Cho phép l u tr thông tin b t theo c u trúc file 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

Ch ng 5: Phân tích và thi t k PacketCap

5.3. Các h ng xây d ng ng 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 a phiên 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 có 2 h ng l a ch n phát tri n ng ng PacketCap:

Ø H ng 1: Tìm hi u c u trúc 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 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 (adsbygoogle = window.adsbygoogle || []).push({});

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

Ch ng 5: Phân tích và thi t k PacketCap

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

Một phần của tài liệ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ý (Trang 47)