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 Mô
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 Mô
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 ó