Giao th ca socket( protocol)

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 43)

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 ng cho cách chuy n d li u không o m. Mõi ki u socket u có giao th c m c nh áp ng cho nó. Trong t t các hàm socket sau này, tùy ch n protocol n u có yêu c u 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 i ng ng ng a 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

4.3.2. T o socket

H th ng cung c p cho 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ô hay nh danh dùng

truy c p socket sau này. #include <sys/types.h> #include <sys/socket.h>

int socket(int domain, int type, int protocol);

Tham s domain ch nh vùng hay 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 (xu t nh p socket d a

trên xu t nh p (file) 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 ( 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 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 a socket. n có th ch nh b ng SOCK_STREAM dùng cho truy n d li u o m ho c SOCK_GRAM dùng cho truy n không o m.

Ch ng 4: L p trình socket

Tham s protocol dùng ch n giao th c áp ng cho ki u socket( trong tr ng h p có nhi u giao th c áp ng cho m t ki u truy n). Tuy nhiên 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 o socket thành công, hàm tr v s nh danh socket( descriptor). n s d ng s nh danh này trong t t các l i 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 ng 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 o ra, 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 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 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

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 ng c b trên t máy vì nó ph thu c vào ng d n t p tin tuy t i a h

i u hành.

Th c t b n dùng AF_INET v i c u trúc a ch c nh ngh a trong sockadd_in 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ô a ch IP c nh ngh a nh sau: struct in_addr{

unsigned long int s_addr; };

Nh n th y a ch IP là m t s long (4 bytes hay 32 bits). ây ng chính là c u trúc a ch cho m t ch ng trình giao ti p v i nhau qua ng Internet.

Trên quan i m a l p trình ng ng, cho dù socket có nh a ch theo vùng nào i ch ng n a m t khi ã m c socket, n ch c n xem socket nh m t t p tin và th c hi n thao tác read/write trên ó(

Ch ng 4: L p trình socket

4.3.4. t tên cho socket

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);

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.

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 ó

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 43)

Tải bản đầy đủ (PDF)

(91 trang)