[ Pobierz całość w formacie PDF ]
.void *filp;} h;struct sk_buff *data_skb;unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;void (*destructor)(struct sk_buff *);};Istotne pola:next, prev, list - struktura listowask - wskaznik na gniazdo, z ktorym jest zwiazany buforpole unii h.filp - tablica deskryptorow przekazywana przezgniazdo (tylko pr.Unixa); patrz struktury msghdr,cmsghdrlen - aktualna dlugosc danych w buforzetruesize - rozmiar buforahead - wskaznik do buforadata - wskaznik do pierwszego elementu danych w buforzetail - wskaznik do ostatniego elementu danych+1 (buformoze byc niezapelniony)end - wskaznik do ostatniego elementu bufora (data_skb+truesize)destructor - wskaznik do funkcji usuwajacej buforTa struktura jest rowniez wykorzystywana w dziedzine Internetu.Wstep - dziedzina InternetuDziedzina Internetu udostepnia trzy protokoly:TCP (strumieniowy), UDP (datagramowy) i RAW (gniazdasurowe).W odroznieniu od dziedziny Unixa ta dziedzinajest prawdziwie sieciowa tzn.umozliwia komunikacjemiedzy roznymi komputerami.Funkcje dziedziny InternetuWskazniki do funkcji systemowych implementujacych operacje na gniazdachsa zawarte w zmiennej inet_proto_ops wnet/ipv4/af_inet.cPatrz opis struktury proto_opsStruktura protoDefinuje dane o gniazdach i operacje na gniazdach dla protokolow dziedzinyInternetu.Kazdy protokol posiada zdefiniowana zmienna wskazujaca na ta strukture:tcp_prot, udp_prot , raw_prot.Odpowiedni wskaznik jest przypisywany przy tworzeniu gniazdapolu prot w strukturze sock.Funkcje dziedziny Internetu wywolujaodpowiednie funkcje dla protokolow korzystajac wlasnie z tego pola.net/sock.hstruct proto{void (*close)(struct sock *sk, unsigned long timeout);int (*build_header)(struct sk_buff *skb,__u32 saddr,__u32 daddr,struct device **dev, int type,struct options *opt, int len,int tos, int ttl, struct rtable ** rp);int (*connect)(struct sock *sk,struct sockaddr_in *usin, int addr_len);struct sock * (*accept) (struct sock *sk, int flags);void (*queue_xmit)(struct sock *sk,struct device *dev, struct sk_buff *skb,int free);void (*retransmit)(struct sock *sk, int all);void (*write_wakeup)(struct sock *sk);void (*read_wakeup)(struct sock *sk);int (*rcv)(struct sk_buff *buff, struct device *dev,struct options *opt, __u32 daddr,unsigned short len, __u32 saddr,int redo, struct inet_protocol *protocol);int (*select)(struct sock *sk, int which,select_table *wait);int (*ioctl)(struct sock *sk, int cmd,unsigned long arg);int (*init)(struct sock *sk);void (*shutdown)(struct sock *sk, int how);int (*setsockopt)(struct sock *sk, int level, int optname,char *optval, int optlen);int (*getsockopt)(struct sock *sk, int level, int optname,char *optval, int *option);int (*sendmsg)(struct sock *sk, struct msghdr *msg, int len,int noblock, int flags);int (*recvmsg)(struct sock *sk, struct msghdr *msg, int len,int noblock, int flags, int *addr_len);int (*bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len);unsigned short max_header;unsigned long retransmits;char name[32];int inuse, highestinuse;struct sock * sock_array[SOCK_ARRAY_SIZE];};Wskazniki do funkcji okreslaja operacje na gniazdachdla protokolow.Tablica sock_arrayjest tablica haszujaca (operacje na niej zdefiniowanew af_inet.c).Jej elementamisa listy struktur sock, kluczemjest pole sock.num.MAX_ARRAY_SOCKobecnie wynosi 256Pole inuse zawiera liczbe wszystkichstruktur sockw sock_array.Pole highestinusezawiera najwieksza wartosc, ktora dotychczas przyjalinuse (tylko do celowstatystycznych).Struktura sockTa struktura przechowuje wszystkie informacje o gniezdziew dziedzinie Internetu.Umozliwia tworzenielist, ktore sa elementami tablicy haszujacej wstrukturachprotodla kazdego z protokolow.Czesc pol jest wykorzystywana przezprotokoly i nizsze warstwy obslugujace polaczenia.Tam mozna obejrzec strukture sock:net/sock.hCzesc z pol tej struktury ma analogiczne znaczenie jak dla protokolu Unixa.proc - identyfikator procesu lub grupy gniazdwrite_queue, receive_queue - kolejki buforow sk_bufprot - wskaznik na strukture proto dla odpowiedniegoprotokoludaddr - adres stacji-partnera (32 bitowy id-sieci/id-stacji);do lub z funkcji systemowych przekazywany razem zestruktura sockaddr_in w polu sin_addr.s_addrsaddr - adres wysylajacegorcv_saddr - zwykle ten sam co wyzej; wyjatek w przypadkuopcji broadcast lub mulitcastmtu - max rozmiar transmisji (nie mozna przesylac wiekszychpakietow niz mtu)mss - wykorzystywany przy ustalaniu mtuuser_mss - ustalony mtu przez uzytkownikanum - klucz do tablicy haszujacej sock_arrayw strukturze protoerr, err_soft - kody bledowprotocol - identyfikator protokolustate - status gniazda; patrz stale statusowack_backlog - biezaca liczba polaczenmax_ack_backlog - max liczba polaczen (podawane przylisten)debug - ustawione na niezerowa wartosc powoduje wypisywaniekomunikatowtype - type gniazda (SOCK_DGRAM, SOCK_STREAM,.)socket - wskaznik do struktury socketPorownaj z dziedzina Unixa.Struktura sockaddr_inPatrz:nazwy gniazd.Struktura sk_buff (Internet)Dokladnie ta sama struktura co wdziedzine Unixa io analogicznym znaczeniu.W niej mozna zapisywacdane do wyslania i odebrania.Umozliwia tworzenie listi na takie listy wskazuja pola write_queuei recv_queuestruktury sock.Czesc polsk_buff jest wykorzystywanaprzez protokoly nizszych warstw.BibliografiaPliki zrodlowe jadra Linux-a 2.include/linux/fs.hinclude/linux/net.hinclude/linux/socket.hinclude/linux/uio.hinclude/net/sock.hinclude/linux/un.hinclude/linux/skbuff.hnet/core/skbuff.cnet/core/iovec.cnet/core/sock.cnet/ipv4/af_inet.cnet/unix/af_unix.cnet/unix/garbage.cnet/socket.cnet/protocols.c.net/ipv4/tcp.cnet/ipv4/udp.cnet/ipv4/raw.cR.Stevens: "Programowanie zastosowan sieciowych w systemie Unix".Dokumentacja biblioteki libc dostepna w /usr/info/.Kernel Hackers Guide.Pytania i odpowiedziGniazda sa baaaardzo interesujacym i calkiem latwym tematem, dlatego niktnie zadal mi zadnych pytan.Autor: Pawel Gorecki
[ Pobierz całość w formacie PDF ]