Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  Arabic  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
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:

Multicast

�eviri : Ceyhun Elmas

[Ilustration]

�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.



 

Giri�

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.

 

Multicast Adres

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 :

[grouped bits]


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:

Ethernet a�lar�nda, en yayg�n olan� ethernet adresinin en �nemli 24 bitinin 01:00:5E haritalanmas�d�r. Sonraki bit 0 'a al�n�r, ve 23 daha az �nemli olan bit multicast IPv4 adresin daha az �nemli olan 23 bitiyle kullan�l�r. Bu i�lem a�a��daki grafikte g�r�l�yor:
[transform to Ethernet]

�rne�in, multicast IPv4 adresleri 224.0.0.5 , 01:00:5E:00:00:05 fiziksel ethernet adresine uyum sa�layacakt�r.

Burada baz� multicast IPv4 adresleri bulunuyor:

Ayr�lm�� multicast adreslerinin b�y�kce bir miktar�, burada g�sterilenlerden ayr�d�r. "Assigned Numbers" RFC'nin son s�r�mde t�m yolg�sterimleri bulabilirsiniz.

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.


 

Multicast �al���yor

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:

Multicast'in WAN �zerinde �al��mas� i�in router'lar�n multicast deste�i olmal�d�r. Multicast gruba ba�l� konakta i�lem ko�maya ba�lad���nda ,konak subnet'teki her router'a IGMP (Internet Group Management Protocol) g�nderir ve multicast mesajlar�n yerel subnet'te i�lemi kabul edenlere g�nderdi�i bilgisini verir. Router'lar kendileri subnet'te hangi multicast mesaj�n�n route edilmesi gerekri�ini bilerek di�er multicast router'leri bilgilendirecektir.

�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.

 

Uygulama Programlama Aray�z� (API)

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


 

IP_ADD_MEMBERSHIP

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.

 

IP_DROP_MEMBERSHIP

Bu se�ene�i kullanarak i�lem multicast grubundan ��kar�labilir. ip_mreq alan yap�s� bir �nceki konudakine benzer �ekilde kullan�l�r.

 

IP_MULTICAST_IF

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.

 

IP_MULTICAST_TTL

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.

 

IP_MULTICAST_LOOP

��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.

 

Basit bir �rnek

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.

 

Sunucu

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


 

�stemci

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


 

�ekirdek ve Multicast

��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..

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

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:
es -> -- Angel Lopez
es -> en JavierPalacios
en -> tr Ceyhun Elmas

2001-02-26, generated by lfparser version 2.9