��� �������� �������� �� ��������� ������: 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 (����� ������ �������� ��� ���������� ;)) ����������:
|
������:
��� ������ �������� ��������� � ���������� �������������� � ����� 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-����������, ���������� ������ ��� ���������� ����� �����������:
��� ��������� ����������� ��������� ������� IPv4:
������� ���� ������������� ������ ������������ ��������� �������, � �������� ������� ��� ������ ������ ������� � ��������������� � ���� 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, �� ������ ����� ���������� ��� ������������� ����� �����, ������ � ��� ������ ���� ��� ����� ����� ��������� ������ ����������:
�������������� ����� �������� IGMP ��������� ������ 224.0.0.1 ���������� ���������� �� ���� ������ � ��� ������� ����� ����� ��� �������. ����, ����� ���� ��� ������� ����� ���������, ������������� �ޣ���� � ��������� �������� � �������� ������ �����, ����� �ޣ���� ������ ������ 0. ��� ���������� ��� ���� ����� ������������ ���� �� ���������� (���� ��� ����� ������� ������������). ����� ���� ��������, �� �������� ��������� multicast-������ ������ � ������ ������ ������ ���� �������� � ��� ������ ������ ��� ���������. �� �� ����� �� ���� ��������, ��� ��� ����� ���� ��� ���� ����������� � ��������������� � ������� ��������� ��� ���� ������ � ���� �������, ������ ������ ��� ������ ��������� �� �� �����, ��������� ������ ��������� ��� ����� ��������� � �������.
���� ��� ����� �������� � ������ ���������� �� ������� � ���, �� �� ���� �� ��� �� ������� � ������������� ������ ������� � ����������� ������������� ��������� ���� ������ � �������. ������ ���������, ������������ � IGMPv2, �������� ������� ������ �������� ����� �� ������ ��������� �� ����� 224.0.0.2.
���� �������� ��� ���� ���� ���������������� ������� � �����������, �� ����� �� ������������� ������ ������ ���� ����� �������� � �������� ��� ������ � ������� ������������� ��������. ������� 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
������� ����� �������������� � multicast-������ ������ ��� ����� � ������� ������� setsockopt(). ���������� �������� ��������� ip_mreq. ������ ���� ��������� imr_multiaddr, �������� ��������� ����� � �������� �� ����� ��������������. ������ ����, imr_interface, �������� IPv4-����� ���������� ������� �� ����� ������������.
��������� ��� ����� ������� ����� ���������� �� ������� � multicast-������. ���� � ��������� ip_mreq ������������ ����� ��� � � ���������� ������.
��� ����� �������� ��� ������� ������� ���������, ������� ����� ����� ������������ ��� ������� multicast-���������. ��������� ���������� ���������� ip_mreq ����� ��� � � ���������� �������.
������������� TTL (Time To Live) ��� �������� � ���������� ����������� ��������� � �������������� ������. �������� �� ��������� - 1, ������������, ��� ��������� �� ����� �������� �� ������� ��������� �������.
����� ������� ���̣� ��������� 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().
|
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:
|
2001-09-01, generated by lfparser version 2.17