Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Russian Turkce Arabic |
taraf�ndan Angel Lopez Yazar hakk�nda: Angel Bilgisayar M�hendisli�i mezunu.�u anda ��retmen olarak Sun Microsystems'de �al���yor, Solaris ve a� y�netimi konular�n� anlat�yor. Son g�nlerde yard�mc� yazar olarak Internet protokolleri konusunda Ra-Ma ile �al���yor.Tasarlanmas� ve Unix sistemlerine uyarlanmas� �zerine.. �lgi duydu�u konular�n ba��nda a�, g�venlik, sistem/a� unix programlama ve son zamanlarda Linux �ekirde�ini k�rmak gibi konular uykular�n� azalt�yor. ;) ��erik: |
�zet:
Bu yaz�da TCP/IP a�lar� �zerine multicast teknolojilerine giri� yap�l�yor. Multicast ileti�imlerinin teorisi ve multicast programlama i�in kullanaca��m�z Linux API detaylar� �zerinde duruluyor. �ekirdek fonksiyonlar�n�n bu teknolojiye nas�l uyarland��� g�steriliyor ve genel anlamda Linux alt�nda multicast deste�i g�zden ge�iriliyor. Yaz� bir multicast uygulamas�n�n g�sterildi�i �ok basit bir C soket program�yla bitiyor.
A� �zerinden bir yere eri�mek (bir aray�z ile) istedi�inizde �� �e�it adres kullanabilirsiniz:
Bilgi d�n�c�, tek bir birim de�ilse ve �ok fazla broadcast olu�turmak istemiyorsak Multicast addresleri �ok kullan��l�d�r. �zellikle �o�ulortam bile�enlerinin(ger�ekzamanl� ses ya da video gibi) yo�un kullan�ld��� a� ortamlar�nda bu durum s�zkonusu olacakt�r. Bant geni�li�ini d���nd���m�zde �o�ul ortam verileri i�in unicast en iyi ��z�m olmayacakt�r.�stemcilerden herhangi biri yerel subnet d���nda oldu�u s�rece broadcast da bir ��z�m olmayacakt�r.
B�y�k olas�l�kla bildi�iniz gibi , IP adresleri uzay� 3 s�n�fta gruplan�r. .A, B ve C adres s�n�f�.Burada d�rd�nc� s�n�f olan (D) multicast adresleri i�in ayr�l�r. D s�n�f�na IPv4 adresleri 224.0.0.0 ve 239.255.255.255 uygundur.
IP adreslerinin en �nemli 4 biti 224 ile 239 aras�nda de�erler i�eririr.
Di�er 28 bit, daha az �nemli olan multicast gruplar� i�in ayr�l�r, a�a��da g�r�ld��� gibi :
A� d�zeyinde IPv4 multicast adresleri �zerinde �al���lan a� �e�idinin fiziksel adresleri �zerine haritalanmal�d�r.E�er unicast a� adresleri ile �al���yorsak,ARP protokol� kullanan birle�ik fiziksel adresleri getirmeliyiz. Multicast adreslerinde ARP kullan�lamaz. Bu nedenle fiziksel adresler ba�ka bir yolla al�nmal�d�r. Burada bu haritlama y�ntemiyle ilgili baz� RFC dokumanlar� bulunuyor:
Burada baz� multicast IPv4 adresleri bulunuyor:
A�a��daki tablo her adres aral��� i�in kullan�lan isimlerle ve kendi birle�ik TTL'leri (IP paketindeki canl� zaman sayac�) ile t�m multicast adres uzay�n� g�steriyor. Multicast IPv4'�n alt�nda , TTL iki anlama geliyor. Okuyucular�n b�y�k olas�l�kla bildi�i �zere, yanl�� yap�land�r�lm�� router tablolar�n�n bulundu�u a�larda sonsuz d�ng�leri engellemek i�in datagram'lar�n ya�am-zaman'lar�n� kontrol eder. Multicast ile �al���r, �stelik datagram'a TTL de�eri tan�mlanmas�na olanak tan�r.i. e., a�daki yolculuk ne kadar uzak olacakt�r...Bu durum datagram kategorisi �zerine tan�mlamaya olanak sa�lar.
Scope | align=CENTER>TTL | Adres aral���<</TD> | A��klama |
Node | 0 | Datagram yerel kona�a s�n�rl�d�r. Herhangi bir a� aray�z�ne eri�emeyecektir. | |
Link | 1 | 224.0.0.0 - 224.0.0.255 | Datagram g�nderici konak subnet'ine s�n�rland�r�lacakt�r ve router'�n �tesinde bir i�lem yapamayacakt�r. |
Department | < 32 | 239.255.0.0 - 239.255.255.255 | Organizasyonun bir b�l�m� s�n�rland�r�lm��t�r. |
Organization | < 64 | 239.192.0.0 - 239.195.255.255 | �zel organizasyonlar i�in s�n�rland�r�lm��t�r. |
Global | < 255 | 224.0.1.0 - 238.255.255.255 | Herhangi bir s�n�rlama olmayan genel uygulamalar. |
LAN i�inde, konak �zerindeki a� aray�z� hedef durumundaki kona�a gitmek
i�in gereksinimi olan t�m paketleri alt katmanlara g�nderecektir. Bu paket
hedef nerdeyse orada olacakt�r.(fiziksel ya da broadcast olabilir).
E�er konak bir multicast gruba �ye ise, a� aray�z� bu gruba hedeflenmi�
paketleri tan�yacakt�r: t�m bu hedef adresler �ye oldu�u multicast
gruplarla e�le�ecektir.
Bu nedenle,e�er fiziksel adresi: 0:C0:F6:A0:4A:B1 ve 224.0.1.10 multicast grubuna �ye ise, uygun paketler bir sonraki hedef adresten uygun olan�na y�nelecektir:
�stelik router'lar 224.0.0.1 grubuna IGMP mesajlar� gondererek her konak ile ilgli grup bilgisini yan�tlayacakt�r. Konak, istemini yapt�ktan sonra sayac� kendi de�erine alacakt�r ve saya� s�f�rland���nda yan�tlayacakt�r. Bu t�m konaklar�n ayn� zamanda yan�t vermesini dolay�s�yla a� �zerine a��r� y�klemeyi engelleyecektir. Konak yan�tlad���nda grubun multicast adreslerine mesaj g�nderecektir.Grup �yesi t�m di�er konaklar yan�t� g�recektir ve kendileri yan�tlamayacakt�r, onaylayan bir konak, subnet router'in bu gruba multicast mesaj g�ndermesine yeterlidir.
E�er t�m konaklar onaylad�ysa hi� biri yan�tlamayacakt�r ve router bu grupta hi� bir kona��n ilgisini �ekmedi�ine karar verecektir ve subnet'e giren uyumlu mesajlar�n routing i�lemini sonland�racakt�r. Di�er se�enek IGMPv2 ile uyarlanm�� ,konaktan geri gelen sinyal ileti�imi 224.0.0.2 grubuna mesaj g�nderir.
Bir �nceki deneyim ile soket programlamada okuyucu yaln�zca be� yeni multicast arama se�ene�i bulacakt�r. Fonksiyonlar setsockopt() ve getsockopt() tan�tmak ya da bu be� se�ene�in de�erlerini okumak i�in kullan�lacakt�r.Tablo kendi y�netsel veri �e�itleri ve a��klamalarla multicast i�in sa�lanan de�erleri g�steriyor:
IPv4 Se�ene�i | Veri �e�idi | A��klama |
IP_ADD_MEMBERSHIP | struct ip_mreq | Multicast gruba �ye olma. |
IP_DROP_MEMBERSHIP | struct ip_mreq | Multicast grubundan �ekilmek. |
IP_MULTICAST_IF | struct ip_mreq | struct ip_mreq multicast mesajlar�n uyumu i�in �zel aray�zler. |
IP_MULTICAST_TTL | u_char | multicast mesajlar�n uyumu i�in �zel TTL. |
IP_MULTICAST_LOOP | u_char | Aktif olan ya da olmayan tekrarl� multicast mesajlar�. |
The ip_mreq yap�s� ba�l�k dosyas�nda tan�mlan�r , <linux/in.h> a�a��da g�sterildi�i gibi:
struct ip_mreq { struct in_addr imr_multiaddr; /* Grubun IP multicast adresleri */ struct in_addr imr_interface; /* Aray�z�n yerel IP adresleri */ };ve multicast se�enekleri:
#define IP_MULTICAST_IF 32 #define IP_MULTICAST_TTL 33 #define IP_MULTICAST_LOOP 34 #define IP_ADD_MEMBERSHIP 35 #define IP_DROP_MEMBERSHIP 36
Multicast gruba �yelik olabildi�inde bu se�ene�i soket �zerine setsockopt() fonksiyonu ile g�nderir. ip_mreq parametresi yap�d�r.�lk yap� alan�, imr_multiaddr , �ye olmak istedi�imiz multicast adresleri i�erir. �kinci alan , imr_interface , kullanaca��m�z aray�z�n IPv4 adreslerini i�erir.
Bu se�ene�i kullanarak i�lem multicast grubundan ��kar�labilir. ip_mreq alan yap�s� bir �nceki konudakine benzer �ekilde kullan�l�r.
Bu se�enek multicast mesaj�n� g�nderecek soket olan a� aray�z�n� belirlemede kullan�l�r. Aray�z ip_mreq i�inde bir �nceki konudaki gibi verilecektir.
Datagramlar ile soket kullanan multicast mesajlar� i�in TTL (Time To Live) kullan�l�r. .Kendi de�eri 1'dir ,bu datagram'�n yerel subnet'in �tesine ge�meyece�i anlam�na gelir.
��lem multicast grubu i�in mesaj g�nderdi�inde e�er aray�z gruba �ye ise al�n�r. E�er bu kaynak a� i�erisinde herhangi bir yer ise ayn� yolla al�nacakt�r. Bu se�enek bu davran���n aktif olmas�n� ya da aktif olmamas�n� sa�lar.
Nerede multicast gruba mesaj g�nderen bir i�lem varsa ve baz� i�lemler mesajlar� yan�tlayan gruba aktar�l�yorsa ,bunlar ekranda g�steriliyor.
Bir sonraki kod uyarlamas� sunucunun multicast grup 224.0.1.1 'e t�m
standart giri�leri iletmesi ile ilgili. G�rebildi�iniz gibi multicast gruba
mesaj g�ndermek i�in herhangi �zel bir harakete gerek yok. Hedef grup
adresleri yeterli.
Loopback and TTL de�i�tirilebildi, e�er kendi de�erleri uygulama i�in uygun
de�ilse.
Standard giri� multicast grup 224.0.1.1 'e g�nderiliyor.
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #define MAXBUF 256 #define PUERTO 5000 #define GRUPO "224.0.1.1" int main(void) { int s; struct sockaddr_in srv; char buf[MAXBUF]; bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_port = htons(PUERTO); if (inet_aton(GRUPO, &srv.sin_addr) < 0) { perror("inet_aton"); return 1; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); return 1; } while (fgets(buf, MAXBUF, stdin)) { if (sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&srv, sizeof(srv)) < 0) { perror("recvfrom"); } else { fprintf(stdout, "Enviado a %s: %s\n", GRUPO, buf); } } }
A�a��da sunucu taraf�ndan onaylanan multicast grup bilgisi istemci taraf�n�n kodu g�r�l�yor.Al�nan mesajlar standart ��k�� �zerinde g�r�n�yor. Bu �zellik kodun IP_ADD_MEMBERSHIP se�eneniyle sa�lan�r. Kalan kod UDP mesajlar�n� alma gereksinimi olan standart i�lemler i�in.
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #define MAXBUF 256 #define PUERTO 5000 #define GRUPO "224.0.1.1" int main(void) { int s, n, r; struct sockaddr_in srv, cli; struct ip_mreq mreq; char buf[MAXBUF]; bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_port = htons(PUERTO); if (inet_aton(GRUPO, &srv.sin_addr) < 0) { perror("inet_aton"); return 1; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); return 1; } if (bind(s, (struct sockaddr *)&srv, sizeof(srv)) < 0) { perror("bind"); return 1; } if (inet_aton(GRUPO, &mreq.imr_multiaddr) < 0) { perror("inet_aton"); return 1; } mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); return 1; } n = sizeof(cli); while (1) { if ((r = recvfrom(s, buf, MAXBUF, 0, (struct sockaddr *) &cli, &n)) < 0) { perror("recvfrom"); } else { buf[r] = 0; fprintf(stdout, "Mensaje desde %s: %s\n", inet_ntoa(cli.sin_addr), buf); } } }
��lem multicast gruba ba�lanmak istedi�inde setsockopt fonksiyonu kullan�larak IP d�zeyinde IP_ADD_MEMBERSHIP se�ene�ine kurar. Bu fonksiyon i�in ger�ek bir uyarlama /usr/src/linux/net/ipv4/ip_sockglue.c �zerine bulunabilir. Kod fonksiyonla �al��t�r�larak bu se�ene�e kurulur ya da IP_DROP_MEMBERSHIP a�a��daki gibidir:
struct ip_mreqn mreq; if (optlen < sizeof(struct ip_mreq)) return -EINVAL; if (optlen >= sizeof(struct ip_mreqn)) { if(copy_from_user(&mreq,optval,sizeof(mreq))) return -EFAULT; } else { memset(&mreq, 0, sizeof(mreq)); if (copy_from_user(&mreq,optval,sizeof(struct ip_mreq))) return -EFAULT; } if (optname == IP_ADD_MEMBERSHIP) return ip_mc_join_group(sk,&mreq); else return ip_mc_leave_group(sk,&mreq);
Kodun en ba�taki sat�rlar�nda giri� parametreleri denetlenir. ip_mreq yap�s�, do�ru uzunlu�a sahiptir ve b�y�k olas�l�kla bunu kullan�c�dan �ekirdek alan�na kopyalar. �ncelikle parameternin de�erini al�r�z, ip_mc_join_group() fonksiyonu multicast gruba ba�lanmak i�in �a�r�l�r ya da multicast gruptan ��kmak istiyorsak ip_mc_leave_group() fonksiyonu �a�r�l�r.
Bu fonksiyonlar i�in kod /usr/src/linux/net/ipv4/igmp.c dosyas�nda bulunur. Gruba ba�lanmay� a�a��daki k�s�m sa�lar :
int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr) { int err; u32 addr = imr->imr_multiaddr.s_addr; struct ip_mc_socklist, *iml, *i; struct in_device *in_dev; int count = 0;
Denetlemenin en ba��nda, MULTICAST macro'lar� kullan�l�yor, bu macro'lar multicast adresler i�in ayr�lm�� aral�kta de�i�en adreslerdir. Bu, denetleme i�in yeterlidir. IP adres �zerindeki en �nemli byte 224'e al�n�r.
if (!MULTICAST(addr)) return -EINVAL; rtnl_shlock();
Denetlemeden sonra, a� aray�z� multicast grubu aramak �zere kurulur. E�er a�adaki bir index taraf�ndan bu olanakl� de�ilse, IPv6 alt�nda olmal�d�r, ip_mc_find_dev() fonksiyonu �zel IP adresine birle�ecek ayg�t� bulmak �zere �a�r�l�r. Bu konuya bu yaz�da de�inece�iz ��nk� IPv4 alt�nda �al���yoruz. E�er adres INADDR_ANY ise, �ekirdek a� aray�z�n� kendisi bulmal�d�r, routing tablosunu okur ve burada tan�ml� en iyi aray�z� gruba se�er.
if (!imr->imr_ifindex) in_dev = ip_mc_find_dev(imr); else in_dev = inetdev_by_index(imr->imr_ifindex); if (!in_dev) { iml = NULL; err = -ENODEV; goto done; }
Daha sonra ip_mc_socklist yap�s� i�in bellek ay�r�r�z, ve ayn� grup adres ve aray�z� kar��la�t�r�lan soketlere birle�tirilir. E�er �ncesinde soketlere bir birle�tirme olduysa fonksiyondan ��kar�z , ��nk� grup ve aray�ze �ift birle�tirme yapam�yoruz. E�er a� aray�z adresi INADDR_ANY de�ilse, uygunluk sayac� fonksiyon tamamlanmadan artar.
iml = (struct ip_mc_socklist *)sock_kmalloc(sk, sizeof(*iml), GFP_KERNEL); err = -EADDRINUSE; for (i=sk->ip_mc_list; i; i=i->next) { if (memcmp(&i->multi, imr, sizeof(*imr)) == 0) { /* New style additions are reference counted */ if (imr->imr_address.s_addr == 0) { i->count++; err = 0; } goto done; } count++; } err = -ENOBUFS; if (iml == NULL || count >= sysctl_igmp_max_memberships) goto done;
Bu noktaya gelindiyse, bu durum yeni soketin yeni gruba linklendi�i, dolay�s�yla yeni giri�in olu�turulmas� ve soketlere uygun gruplara linklenmesi gerekti�i anlam�na gelir. Bellek �imdiden ayr�ld�, yaln�zca yap�lar�n gerektirdi�i de�i�ik alanlar i�in do�ru de�erleri kurmam�z gerekiyor.
memcpy(&iml->multi,imr, sizeof(*imr)); iml->next = sk->ip_mc_list; iml->count = 1; sk->ip_mc_list = iml; ip_mc_inc_group(in_dev,addr); iml = NULL; err = 0; done: rtnl_shunlock(); if (iml) sock_kfree_s(sk, iml, sizeof(*iml)); return err; }
p_mc_leave_group() fonksiyonu multicast gruptan ��k�ld���nda uyar�l�r ve bir �nceki fonksiyondan daha kolayd�r. Aray�z ve grup adresleri al�n�r ve aktif soketlerde ger�ekle�en giri�lerin aras�ndan aran�r. Bir kez bulurlar, �nermelerin numaras� kararla�t�r�l�r, burada en k���k bir i�lem gruba birle�tirilir. E�er yeni de�er s�f�rsa,saya� kendisi siler.
int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) { struct ip_mc_socklist *iml, **imlp; for (imlp=&sk->ip_mc_list;(iml=*imlp)!=NULL; imlp=&iml->next) { if (iml->multi.imr_multiaddr.s_addr==imr->imr_multiaddr.s_addr && iml->multi.imr_address.s_addr==imr->imr_address.s_addr && (!imr->imr_ifindex || iml->multi.imr_ifindex==imr->imr_ifindex)) { struct in_device *in_dev; if (--iml->count) return 0; *imlp = iml->next; synchronize_bh(); in_dev = inetdev_by_index(iml->multi.imr_ifindex); if (in_dev) ip_mc_dec_group(in_dev, imr->imr_multiaddr.s_addr); sock_kfree_s(sk, iml, sizeof(*iml)); return 0; } } return -EADDRNOTAVAIL; }
Di�er multicast se�enekleri �ok basit �ekilde yukar�da listelendi ��nk� i� yap�n�n veri alanlar�nda birle�im sa�lanan soketlerle kulland���m�z baz� de�erleri kuruyor. Bu ay�r�mlar ip_setsockopt() fonksiyonu ile sa�lan�yor..
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Angel Lopez, FDL LinuxFocus.org Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz |
�eviri bilgisi:
|
2001-02-26, generated by lfparser version 2.9