Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
��� �������� �������� �� ��������� ������: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  Arabic  

[æÏÔÏ Á×ÔÏÒÁ]
����� Angel Lopez

�� ������:

Angel �������� ��������� �������������� �������. ������ �� �������� �������������� � Sun Microsystems, ������ Solaris � ����������������� �����. ������� ���� ������������ ����� Internet protocols. Design and implementation on Unix systems ��� �� �������� ��� ������� Ra-Ma. ��� ��������� ����������� �������� ����, ������������, ���������������� ������/����� ��� unix, � � ��������� ����� ������������ ���� Linux (����� ������ �������� ��� ���������� ;))


����������:

 

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

[Ilustration]

������:

��� ������ �������� ��������� � ���������� �������������� � ����� TCP/IP. ��� ��������� ������������� ��������� ����������������� ������������ � ����������� Linux API, ������� ����� ������������ ��� ���������������� ����������, ������������ �������������. ��� �������� ������� ������ ��������� �������������� � Linux � ������ �������� ������� ����, �������������� ��� ����������. ������ ������������� ������� �������� �� C � ����������������� �������, ��� �������� �������� ���������� ������������� �������������.



 

��������

��� ����, ����� ���������� � ������� ����� (����������) � ����, �� ������ ������������ ��� ��������� ���� ������:



��������� ������ ����� �������, ����� ����������� ���������� �������� �� ��������� ���� � �� �� ����� ������������ ����������������� ������. ���� �������� ������� ��� ��� �������� � ������� ��������� ������� �������������� ���������� (�������� ��������� ����� ��� ����� ���������� � �������� �������) ��������� ������. � ������ ������� ������ ���� ���������� ������� ������� �� unicast ������ � ��� ������ ����� �� ������� ���������� ����������� ����. �������� �� �� ������������������ ������ ���� �� ������ ����������� - ������ ����� ���������� �� ��������� �������, ������� �������� ����������.

 

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

��� �������� �������� ��������, ������������ IP-������� �������� �� ��� ������ �������. ������ - A,B � C. ���� ��� ��������� ����� (D), ����������������� ��� ��������� �������. ������ IPv4 ����� 224.0.0.0 � 239.255.255.255 ����������� ������ D.

4 ������� ���� IP-����� ���������� �������� ����� 224 � 239. ��������� 28 ���, ��������������� ��� �������������� ������, ��� ��� �������� �� ������� ����:

[ÂÉÔÙ ÇÒÕÐÐÙ]


�� ������� ������, ��������� ������ IPv4 ������ ������������ �� ���������� ������ ���� ���� ���� � ������� �� ��������. ���� �� �������� � ������� unicast-�������, �� �� ������ �������� ��������������� ���������� ����� ��������� �������� ARP. � ������ ������������� ���� ���������� ������, ARP ������������ ������, � ���������� ����� ����� ���� ������� ������ ��ԣ�. ���������� ��������� RFC-����������, ���������� ������ ��� ���������� ����� �����������:

� �������� ������������� ����� Ethernet, ����������� ������������ ���������� 24-� ������� ��� Ethernet-������ � 01:00:5E. ��������� ��� ������������ � 0, � 23 ���������� ���������� 23 ������� ���� ���������� ������ IPv4. ���� ������� ������� �� ������� ����:
[ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ × Ethernet]

��������, ��������� ����� IPv4 224.0.0.5 ����� ��������������� ����������� ethernet-������ 01:00:5E:00:00:05.

��� ��������� ����������� ��������� ������� IPv4:

���������� ��� ����� ���������� ��������� �������, �� ��������� ����. ������ �������� ����� ����� � ��������� ��������� ������ "Assigned Numbers" RFC.

������� ���� ������������� ������ ������������ ��������� �������, � �������� ������� ��� ������ ������ ������� � ��������������� � ���� TTL (�ޣ���� ������� ����� ip-������). ��� ��������������, TTL ����� ��� ��������. ��� �������� �������� �����, TTL ������������ ����� ����� ��������� � ���� ��� �������������� ����� ������������, ��������� � ���������� ������������ ������������ ������� �������������. � ������ � ���������������, �������� TTL ����� ���������� ������� ��������� ��������, �. �., ��������� ������ ��� ���������� ����� ��������������� � ����. ��� ��������� ������������� �������, ������ �� ��������� ����������.

������ TTL ������ ������� ��������
���� 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), ������� ��������� ����� ����� �������� �� ������� ������� ��� �� ������ ������� ����� ������� ���������� ���� ����. ��� �� ������, � ������� ����� ���������� �������� ���������� ������� ����������, ���� ����������������� (broadcast) ������.
���� ���� ����ޣ� � multicast-������, ������� ��������� ���������� ����� ������ �������������� ���� ������: ��� �� � ������� ����� ���������� ������������� ��� multicast-������ � ������� ������ ����.

�������������, ���� ��������� ����� ����� ���������� ����� 80:C0:F6:A0:4A:B1 � �� �������� ������ multicast-������ 224.0.1.10, �� ������ ����� ���������� ��� ������������� ����� �����, ������ � ��� ������ ���� ��� ����� ����� ��������� ������ ����������:

��� ������ � ���������� ����� (WAN), �������������� ������ ������������ multicast-�������������. ����� ������� ��������� �� ����� �������������� � multicast-������, ���� �������� IGMP (Internet Group Management Protocol) ��������� ���� multicast-��������������� � �������, ��� ����, ����� ���������������� �� � ���, ��� multicast-��������� �������� multicast-������ ������ ���� ������� � ��������� ������� ��� ���� ����� ���������������� ������� ���� ����������� �� ��������. �������������� � ���� ������� ����������� ��� ��������� multicast-��������������, ������������ �� ������ � ��� ����� multicast-��������� ������ ������������������ � �������.

�������������� ����� �������� IGMP ��������� ������ 224.0.0.1 ���������� ���������� �� ���� ������ � ��� ������� ����� ����� ��� �������. ����, ����� ���� ��� ������� ����� ���������, ������������� �ޣ���� � ��������� �������� � �������� ������ �����, ����� �ޣ���� ������ ������ 0. ��� ���������� ��� ���� ����� ������������ ���� �� ���������� (���� ��� ����� ������� ������������). ����� ���� ��������, �� �������� ��������� multicast-������ ������ � ������ ������ ������ ���� �������� � ��� ������ ������ ��� ���������. �� �� ����� �� ���� ��������, ��� ��� ����� ���� ��� ���� ����������� � ��������������� � ������� ��������� ��� ���� ������ � ���� �������, ������ ������ ��� ������ ��������� �� �� �����, ��������� ������ ��������� ��� ����� ��������� � �������.

���� ��� ����� �������� � ������ ���������� �� ������� � ���, �� �� ���� �� ��� �� ������� � ������������� ������ ������� � ����������� ������������� ��������� ���� ������ � �������. ������ ���������, ������������ � IGMPv2, �������� ������� ������ �������� ����� �� ������ ��������� �� ����� 224.0.0.2.

 

����������� ��������� ���������� (API)

���� �������� ��� ���� ���� ���������������� ������� � �����������, �� ����� �� ������������� ������ ������ ���� ����� �������� � �������� ��� ������ � ������� ������������� ��������. ������� setsockopt() � getsockopt() ������������ ��� ��������� ��� ������ �������� ���� ���� �����. � ������� ����������� ���� �������� ��������� ����� ��� ��������������, � ������ ������������ �� ������ � ������� ���������:

����� IPv4 ��� ������ ��������
IP_ADD_MEMBERSHIP struct ip_mreq �������������� � multicast-������.
IP_DROP_MEMBERSHIP struct ip_mreq ����� �� multicast-������.
IP_MULTICAST_IF struct ip_mreq ������� ��������� ��� ��������� ��������� ���������.
IP_MULTICAST_TTL u_char ������� TTL ��� ��������� ���������.
IP_MULTICAST_LOOP u_char ��������/��������� ��������������� ��������� ���������.


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

struct ip_mreq {
   struct in_addr imr_multiaddr; /* IP multicast-����� ������ */
   struct in_addr imr_interface; /* ��������� IP-����� ���������� */
   };
��� �� ���������� � ����� multicast:
#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-������ ������ ��� ����� � ������� ������� setsockopt(). ���������� �������� ��������� ip_mreq. ������ ���� ��������� imr_multiaddr, �������� ��������� ����� � �������� �� ����� ��������������. ������ ����, imr_interface, �������� IPv4-����� ���������� ������� �� ����� ������������.

 

IP_DROP_MEMBERSHIP

��������� ��� ����� ������� ����� ���������� �� ������� � multicast-������. ���� � ��������� ip_mreq ������������ ����� ��� � � ���������� ������.

 

IP_MULTICAST_IF

��� ����� �������� ��� ������� ������� ���������, ������� ����� ����� ������������ ��� ������� multicast-���������. ��������� ���������� ���������� ip_mreq ����� ��� � � ���������� �������.

 

IP_MULTICAST_TTL

������������� TTL (Time To Live) ��� �������� � ���������� ����������� ��������� � �������������� ������. �������� �� ��������� - 1, ������������, ��� ��������� �� ����� �������� �� ������� ��������� �������.

 

IP_MULTICAST_LOOP

����� ������� ���̣� ��������� multicast-������, �� ����� �������� ��������� ���� ��� ��������� ��������� � ������, ����� ��� � � ������ ����� �� ��������� � ����� ������ ����� ����. � ������� ���� ����� ����� ��������/��������� ���� �����.

 

������

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

��� �����ģ���� ���� ������������ ����� ������ ���������� ������ 224.0.1.1 �ӣ ��� �������� ��� �� ������������ �����. ��� �� ������ ������ �� ���� ����������� ������� ������������� ��������, ��� ���� ����� ������� ������ ����������. ���������� ����� ����� ������.
�� ������ �������� ����� Loopback � TTL, ���� �������� �� ��������� ��� �� ��������.

 

������

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


 

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

��� �� �������� ����, ����� ������� ����� �������������� � multicast-������, �� ���������� ������� 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_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, �� ��������� ������ �� ����� ������ � ������� ���������������� ��� multicast-�������. ��� ����� ���������� ���������, ����� ������� ���� IP-������ ��� ����� 224.

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

    rtnl_shlock();


����� ��������, ������� ��������� ������������� ��� ������ � multicast-�������. ���� ���������� ���������� � ���� �� ������� (�������� � IPv6), ���������� ������� ip_mc_find_dev() ��� ������ ���������� ��������������� � ���� 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() ���������� ��� ������ �� multicast-������, � ��� ������� ����� ��� ���������� �������. ��� �������� ����� ���������� � ������, � ���� �� ����� ������� ����������� � �������� ������. ���� ������� ������, �� ��������� �� ������� ����� ������, ��� ��� �� ���� ������� ��������� � ������� ���������� ������. ���� ����� �������� ����� ����, �� �ޣ���� ���������.

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


��������� multicast-����� ������������� ���� - ����� �������, ��������� ��� �����-���� ������������� �������� � ���� ������ ���������� �������� �������� � �������� � �������� �� � ������ ������ ��������. ��� ������������ ����������� ��������������� ����� ������� ip_setsockopt().

 

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

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ���������.
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Angel Lopez, FDL
LinuxFocus.org

Click here to report a fault or send a comment to LinuxFocus
Translation information:
es -> -- Angel Lopez
es -> en Javier Palacios
en -> ru Denis Kolobynin

2001-09-01, generated by lfparser version 2.17