[LinuxFocus-icon]
Home  |  Map  |  Index  |  Search

News | Archives | Links | About LF  
This document is available in: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  Arabic  

[Photo of the Author]
������ Angel Lopez

���� �� ������:

���� ���� ������� �� ����� �������. � ���� ������ ��� �� �����������, ����� ����� ������� ������ ������� . ���� ���� �� ����� ���� ����� ��������. ������� �������� ��� ����� ���������. ���� ����� �������� � ������ ����� ��� ������ � ������. � ����� ���� ������ ���� ������ ��� ���� ��� ����� ����.


���������:

 

������� MultiCast

[Ilustration]

���� ������:

��� ������ ����� ����� �� ������ ������� ��� ����� TCP/IP. ���� �������� ������� ������� � ������ ������� ����� ����� ��������� API ���� ������� ��� ����� ������� �������. � ���� ���� ����� ������ ���� ���� ��� ������� �������� ������ ������ �� ��� ������� �� �������. � ���� ������ ����� ���� �� ����� ������� ���� C ������ ������ �������.



 

�����

��� ���� ��� ����� (����) ��� �����ɡ������ �� ������ ������ �� ��� ����� ����� ������ �� ��������:



������ ������� ����� ��� ����� ����� ��� �������� ��� ����� ��������� �� ������. ��� ������ ����� ����� ������ ����� ������� ������ ������� ( ������ � ������ ��� ����� ����) ��� ��� ���������. ��� ���� ������� ��������� ����� ����� � ����� ����- ����� ����� �� ������ ����� ��������� �� ������ ������� � �� ����� ����� � ������ �� ��� ��� ��������� ���� �� ������

 

����� �������

���� ��� ���� �� ������ �������� IP ����� ����� �� A, B, C � ��� ���� D ����� �������. �������� �� IPv4 �� ��� 224.0.0.0 � 239.255.255.255 ����� ��� ����� D.

������� ������� ������ �� ����� ����� �������� ������ �� ��� ����� ��� 224 � 239. ����� ������� �������� � ������� ������� ������ ������ ������ ������� � ��� ���� �� ������

[grouped bits]


�� ����� �����ɡ ��� �� ������ ����� Ipv4 �� ������� ������� ������ ���� ���� �����. ��� ��� ���� ������ ���� unicast� ���� ����� ������� ������� �������� ARP ����� �� ���� ���� �� ������ �������.��� ������ ����� ����. ��� ����� RFC ����� �� ��� ��� �����.

�������



�� ����� Ethernet ������ ������ ���� � �������� ��� �� ������� ��24 ������ ������ 01:00:5E . � ���� ������� ����� �� ����� ����ѡ �������� ��23 ������ ������ ������ ��23 ������ �� ����� ����� ��� ���� �� ����� :
[transform to Ethernet]

���� ����� Ipv4 ������� 224.0.0.5 ������ ������� ������� �������� 01:00:5E:00:00:05 .

���� ��� ������ ������� ������ :

���� �� ������ ������� ������ ��� �������� ���� . ����� �� ����� ��� ������� ����� �� ��� ���� �� " ������� ��������" ����� RFC.

���� ����� ���� �� ���� ������ ������� �� ������� ������� ��� ���� � ����� ( ������ �� ��� ������ �� ���� ����� ������ �� ���� ip TTL's (time to live counter in ip packet) ) . ����� TTL ������. ������ ����� � ���� ����� ������ � ��� ����� �� ��� ������ ��� ���� ��� ����� ��� �� �� ��� ������ ���� ���� �� ���� ����� -. � ������ ������ ��� ���� ���� ���� �������� ��� �� ����� ������. ��� ���� ����� ������ ������� ������� ��� ��� ��� ��������.

������ align=CENTER>TTL ���� ��������<</TD> �����
������ 0   ��� ���� �������� ������ ��� ������� ������. � �� ��� ���� �� ����� ������.
������ 1 224.0.0.0 - 224.0.0.255 ���� �������� ������ ��� ������ ������ �� ������ ������� � ��� ������ �� ����.
����� < 32 239.255.0.0 - 239.255.255.255 ����� ��� ��� ���� �� �������.
������� < 64 239.192.0.0 - 239.195.255.255 ����� ��� ����� �����.
�����\���� < 255 224.0.1.0 - 238.255.255.255 ��� ��ϡ ����� ���.


 

������ �������� �� �����

�� ���� ����� LAN � ����� ������ ����� �� ���� ����� ���� ���� ����� ������ ����� ��� ������� ������ .��� ����� ��� ���� ����� ������� ������ �� �� ��� �����. ��� ���� ������� ��� ���� ������ � ��� ����� ������ ������ ���� ������ ���� ���� ������ �� �� ���� ���� ����� ���� ������� ���� ����� ����� ������. ��� ��� ��� ����� ������ ������� 80:C0:F6:A0:4A:B1 ���� ��� ���� ������ ������� 224.0.1.10 ������� ��� ����� ���� ����� ��� ��� �������� :

������� ��� ���� ����� WAN ��� �� ���� �������� �������. ����� ���� "����" process ��� ���� �� ���� ������ ����� IGMP (Internet Group Management Protocol) � ����� ����� ��� �������� ��� �� ���� ������ �� ������ ������ɡ �������� �� ������ ������� ����� ��� ������ ������� ������ ������ �� ���������. � �������� ����� �������� ������ �� ���� ����� ��� ����� ������� ���� ������� �������.

�������� ���� ���� ����� IGMP ��� ������ 224.0.0.1 ���� ��� ��������� ������� �� ������ ���� ���� ����� ������. � ����� ����� ������ ��� ������� ��� �� ���� ������ ���� �� �������� � � ����� ����� �����. ��� �� ���� ��� ��������� �� ����� ���� ��� ����� ������ ���� ����� . ���� ���� ������ ���� ����� ��� ����� ������ �������� �� �������� �������. ��� ������ ������� �� ���� ���� ���� ��� ������ ���� ������ ������� �� ������� ��������� ���� ������

��� ����� ��� ��������� �� ������ ��� ��� ����ȡ ����� ���� ������ �� �� ��� ���� ���� ������ ������� � �� ���� ����� �� �����. ���� ��� ����� �� IGMPv2 �� �� ���� ������ ����� ������ �� ������ ��� ������� 224.0.0.2.

 

����� ����� ��������� API

��� ������ ������� �� ����� ������ӡ ���� ������ ���� �� ������ ������� ������� ��� ������� �� ������ ������� . ������ setsockopt () ������� ������ ��� �������� � getsockopt () ��������. � ������ ���� ������ ������� � ����� �������� ��������� � ���� �����:

������ IPv4 ��� �������� �����
IP_ADD_MEMBERSHIP struct ip_mreq ����� ��� ���� �������.
IP_DROP_MEMBERSHIP struct ip_mreq ����� �� ���� �������.
IP_MULTICAST_IF struct ip_mreq ���� ���� ������� ������� ���������.
IP_MULTICAST_TTL u_char ���� TTL ���� ������� ������� ���������.
IP_MULTICAST_LOOP u_char ���� ���� ������� ��������� �� ����� loopback


������ ip_mreq ����� �� ��� ������� <linux/in.h> ����:

struct ip_mreq {
   struct in_addr imr_multiaddr; /* IP multicast address of group */
   struct in_addr imr_interface; /* local IP address of interface */
};
������� ������� �� ��� ����� ��:
#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

����� ���� process ��� ���� ���� ����� ������� setsockopt(). � ������ ���� ip_mreq: ��� ����� ����� imr_multiaddr ��� ����� ������ �������� � � ������ imr_interface ��� ����� ����� ������.

 

�������� IP_DROP_MEMBERSHIP

������ ��� ������ �������� �� ������. ���� ������ ip_mreq ������� ��� �� ��������.

 

����� �������� IP_MULTICAST_IF

������ ��� ������ ������ ����� ������ ���� �������� ������ �������. ���� ������ ip_mreq ������� ��� �� ��������.

 

����� ����� IP_MULTICAST_TTL

��� �� ��� TTL Time To Live ��� �������������� �������. ������ ������� 1 �� �� ���� �������� �� ������ ������ �������.

 

�������� IP_MULTICAST_LOOP

��� ���� ���� process ����� ������ ��� ������ � ������ ��� ������� �� ��� ����� ����� � ��� ���� ���� ������. ��� ������ ���� ��� ������ �� �������.

 

���� ����

��� ���� ���� ������� �� ������ ���� �� ����� . ������ ����� ������ � � ������� ������ �� �������� ����� ������� �� ������ ��� ������. ��� ����� ���� ����� ���� ��� ������ 224.0.1.1 �� �� ����� �� ������ ��������. � �� ���� ��� ��� ��� ������� �� ���� ����� ������. ����� �� ���� ������ �������� � ����� ��� �� ����� ����� ��������� ������� ������.

 

������

�������� �������� ���� ��� ����� ���� ������ 224.0.1.1

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


 

������

���� ����� ���� ���� ���� ������. ������ ����� ������� ���� ������ ������ ��� ������. ������� �������� ���� ��� ������ �������. ����� ��� ����� ������� IP_ADD_MEMBERSHIP ��� ��� ��� ���� ������ ������ ��� ����� UDP .

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


 

������ ��������

��� vHdkh ����� ���� ���� ������ ��� ���� �������� ��� ���� ������ ������ ������ setsockopt () ������ ���� IP_ADD_MEMBERSHIP �� ����� IP . ��� ��� ������ ���� �� /usr/src/linux/net/ipv4/ip_sockglue.c . � ���� ��� ������ ���� ���� �� ��� ������ � ���� IP_DROP_MEMBERSHIP .

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


������ ������ ���� ������ ������ ip_mreq struct �� ��� ���� �����. ����� ���� �� �������� ��� ������. ����� ���� ��� ���� �����ء ���� ������ ip_mc_join_group() �������� �� ip_mc_leave_group() ��������. ��� ����� �������� ����� �� /usr/src/linux/net/ipv4/igmp.c . � ���� �� ��� ��������:

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;


���� �� ��� ����� � �������� MULTICAST - �� ����� ������ �� ���� �������� �������� �������. ���� ���� �� ����� �� ������- ������- ������ ����� 224.

  if (!MULTICAST(addr))
    return -EINVAL;

    rtnl_shlock();


��� ������ޡ ���� ����� ������ ������� �� ������ . ��� ���� ������ ������ ������ ��� ������� - ��� ��� ��� IPv6- ���� ������ ������ ������ device ������� ������ IP ������. ������ ���� ���� �� ������ ���� ���� ������ ���� ��� Ipv4 . ��� ��� ������� INADDR_ANY � ��� ������ �� ��� ������ ����� ������ � �� ���� ���� ������� � ����� ������ ������ ���� �� ������� ����� ������ � ����� ���� �������.

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


��� ���� ������� ������ ip_mc_socklist� � ����� �� ����� ������ � ����� ���� �������. ���� ����� ������ ������ �� ����ǡ ���� ������ �� �� ���� �� ���� ����� ���� � �����. ��� �� ��� ������ ����� ������ �� ��� INADDR_ANY ������ ������ ������� ��� �� ����� ������.

  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;


��� ����� ��� ��� ������ ���� ���� ���� ����� ���� ������ ����� ��� ��� ����� ���� ���� � ���� ������ ����� ���� ����� ��� ������. ������� ������ ����ǡ ��� ���� �� ��� ����� ������� �� ������ �������� ������.

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


������ ip_mc_leave_group() ������ �������� �� ���� �������� � �� ���� �� ������ �������. �� ���� �� ����� ������ � ����� ������� �� ��� ������� �������� ������� ���� ������ ������ ��� �������� ��� ���� ����� �� ������. ���� ������ ������ ������� ����� ������.

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


�������� ������� ������ ���� ������ ����� �����. ����� ������� ��� ���� ������ �������� ������ ��������. ��� �� ����� ������ ip_setsockopt().

 ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ �������

 

source code �����
Multicast �������
Broadcast ����
Routing table ���� �������
Function ������
Group ����
multicast ����� ����� ������ : �� ���� ����� ����
broadcast �� ����� ��� �����.
 

������ ��� ��� ������

���� ������ ����� ��� ���� ������� ��� ��� ������
 ï¿½ï¿½ï¿½ï¿½ ������� 

������� ��� ����� ������ ����� ������ �����
© Angel Lopez, FDL
LinuxFocus.org

���� ��� ������� �� ��� �� ����� �������� ��� ����� �����
������� �� �������:
es -> -- Angel Lopez
es -> en Javier Palacios
en -> ar �� �����

2001-05-21, generated by lfparser version 2.13