Socket API per il Multicast Massimo Bernaschi Istituto per le Applicazioni del Calcolo Mauro Picone Consiglio Nazionale delle Ricerche Viale del Policlinico, 137-00161 Rome - Italy http://www.iac.cnr.it/ e-mail: massimo@iac.rm.cnr.it
Cosa è il Multicast Il multicast è utilizzato per trasmettere informazioni a più host contemporaneamente. Una tipica situazione è quella in cui si vuole trasmettere in tempo reale audio e/o video a sistemi che partecipano ad una multiconferenza distribuita. 2
L unicast L unicast è la normale situazione in cui un mittente invia ed un destinatario riceve (eventualmente invertendo i ruoli). Il TCP è, per la sua natura di protocollo orientato alla connessione, sempre unicast. L UDP supporta più paradigmi di comunicazione anche se il più utilizzato è sempre l unicast. 3
Selezione nel caso del Multicast Non tutti i pacchetti di multicast sono ricevuti e processati. Solo quelli la cui destinazione (indirizzo e numero di porta) sono stati in precedenza registrati come di interesse. I pacchetti multicast sono presentati a livello kernel come qualsiasi altro pacchetto IP. La sola differenza può essere nell algoritmo di instradamento che definisce dove instradare (o non instradare) i pacchetti stessi. 4
Indirizzi Multicast 0 31 Address Range: +-+----------------------------+ 0 Class A Address 0.0.0.0-127.255.255.255 +-+----------------------------+ +-+-+--------------------------+ 1 0 Class B Address 128.0.0.0-191.255.255.255 +-+-+--------------------------+ +-+-+-+------------------------+ 1 1 0 Class C Address 192.0.0.0-223.255.255.255 +-+-+-+------------------------+ +-+-+-+-+----------------------+ 1 1 1 0 MULTICAST Address 224.0.0.0-239.255.255.255 +-+-+-+-+----------------------+ +-+-+-+-+-+--------------------+ 1 1 1 1 0 Reserved 240.0.0.0-247.255.255.255 +-+-+-+-+-+--------------------+ 5
Indirizzi Multicast Quelli che ci interessano sono gli indirizzi di classe D. Ogni datagram IP il cui indirizzo di destinazione inizia con 1110 è un datagram IP di tipo multicast. I rimanenti 28 bit identificano il gruppo di multicast a cui deve essere inviato il datagram. Viene spesso utilizzata l analogia della radio: per ascoltare un certo programma bisogna sintonizzare la radio su una certa specifica frequenza; allo stesso modo bisogna sintonizzare il kernel per ricevere i pacchetti inviati ad uno specifico gruppo di multicast. 6
Gruppi multicast speciali Esistono alcuni gruppi di multicast speciali che non dovrebbero essere usati nelle normali applicazioni: [224.0.0.1] è il gruppo all-hosts. Se si invia un pacchetto di ping a questo gruppo, tutti gli host che supportano il multicast dovrebbero rispondere dato che un host deve fare il join a questo gruppo all atto dell inizializzazione delle interfacce che supportano il multicast; [224.0.0.2] è il gruppo all-routers. Tutti i router devono fare il join a questo gruppo sulle interfacce che supportano il multicast. [224.0.1.1] è l indirizzo per NTP (Network Time Protocol). Questi gruppi sono regolamente pubblicati tra gli Assigned Numbers RFC. 7
Scope degli indirizzi multicast IPv4 non definisce un ambito dei pacchetti multicast (mentre IPv6 ha un campo esplicito di 4 bit per questo scopo). TTL Scope ---------------------------------------------------------------------- 0 Limitato allo stesso host. Non viene inviato all esterno. 1 Limitato alla stessa subnet. Non viene inviato da un router. <32 Limitato alla stessa organizzazione. <64 Limitato alla stessa regione. <128 Limitato allo stesso continente. <255 Nessuna restrizione. Globale. L intervallo di indirizzi da 239.0.0.0 a 239.255.255.255 è riservato per l administrative scoping. 8
Indirizzi Multicast IPv6 112-bit group ID ------------------------------------------------------------------- FF flag scope 10 bytes ignored 32 bits ------------------------------------------------------------------- 4-bit 4-bit --------------------- IPv6 Ethernet address 3333 --------------------- Il flag di 4-bit di multicast IPv6 differenzia tra un gruppo well-known (con valore 0) ed un gruppo transiente di multicast (con valore 1). I 3 bit superiori di questo campo sono riservati. Il campo di 4-bit scope specifica quanto lontano può arrivare il pacchetto di multicast. 9
IPv6 scope Scope IPv4 TTL ---------------------------------------------------------------------- 1 node-local 0 2 link-local 1 5 site-local <32 8 organization-local 14 global <255 ---------------------------------------------------------------------- 10
Invio di datagram multicast Il traffico di multicast è gestito a livello di transporto con UDP. In linea di principio, un applicazione deve solo aprire un socket UDP e riempire un indirizzo di multicast di classe D con la destinazione a cui devono essere inviati i dati. Ci sono, comunque, alcune operazioni, che un processo che invia deve poter controllare. 11
Ricevere Datagram Multicast Il broadcast è, in un certo senso, più semplice da implementare del multicast. Non è richiesto ai processi di dare indicazioni su cosa fare con i pacchetti di broadcast. Il sistema operativo sa di dover leggere e consegnare tutti i pacchetti di broadcast alle applicazioni. Con il multicast è necessario informare il kernel di quali gruppi di multicast si è interessati a ricevere i pacchetti. Con il multicast è possibile per più processi su un dato host appartenere allo stesso gruppo di multicast (con UDP un solo processo riceverebbe un datagram unicast ). 12
Programmazione Multicast L API per il multicasting richiede solo cinque nuove opzioni per i socket che sono quindi gestite con le setsockopt() e getsockopt(): int getsockopt(int s, int level, int optname, void* optval, int* optlen); int setsockopt(int s, int level, int optname, const void* optval, int optlen); Per il multicast, il level è sempre IPPROTO IP. 13
Programmazione Multicast Le opzioni per il multicast sono le seguenti: optname setsockopt() optval type getsockopt() IP(V6)_MULTICAST_LOOP yes u_char (u_int) yes IP(V6)_MULTICAST_TTL(HOPS) yes u_char yes IP(V6)_MULTICAST_IF yes struct in_addr (u_int) yes IP(V6)_ADD_MEMBERSHIP yes struct ip(v6)_mreq no IP(V6)_DROP_MEMBERSHIP yes struct ip(v6)_mreq no Uno degli errori più comuni è quello di invocare setsockopt con un int come argomento per specificare il TTL o il loopback. 14
Programmazione Multicast: IP ADD MEMBERSHIP La struttura ip mreq (/usr/include/linux/in.h) contiene i seguenti elementi: struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ }; Per ricevere un datagram multicast, un processo deve fare il join al gruppo di multicast e deve anche fare il bind del socket UDP al numero di porta che viene utilizzato come destinazione dei datagram inviati a quel gruppo 15
Per l IPv6 si utilizza la struttura seguente: struct ipv6_mreq { /* IPv6 multicast address of group */ struct in6_addr ipv6mr_multiaddr; }; /* local IPv6 address of interface */ int ipv6mr_ifindex; 16
Opzioni socket per il multicast L opzione IP(V6) MULTICAST IF specifica l interfaccia per i datagram outgoing inviati attraverso il socket. L interfaccia locale specificata quando un processo esegue la join ad un gruppo è quello da cui i datagram multicast in arrivo saranno ricevuti. Se non viene specificata nessuna opzione prima di inviare un socket in multicast, l interfaccia viene scelta dal kernel, il TTL o hop limit è definito uguale ad 1 ed una copia del datagram viene inviata in loopback. 17
Mapping degli indirizzi IP Multicast sugli indirizzi Ethernet I frame Ethernet hanno un campo di destinazione di 48 bit. Per facilitare l associazione degli indirizzi IP di Multicast agli indirizzi Ethernet, l IANA ha riservato un range di indirizzi per il multicast. Ogni frame Etherne con destinazione nel range da 01-00-5e-00-00-00 a 01-00-5e-ff-ff-ff (hex) contene dati per un gruppo di multicast: il prefisso 01-00-5e identifica il frame come multicast; il bit successivo è sempre 0. Rimangono in questo modo solo 23 bit per l indirizzo di multicast. Dato che i gruppi di multicast sono di 28 bit, l associazione non può essere uno-a-uno. 18
Solo i 23 bit meno significativi del gruppo di multicast sono utilizzati nel frame. I rimanenti 5 bit sono ignorati e si hanno quindi 32 differenti gruppi di multicast associati allo stesso indirizzo Ethernet. 28 bit +-+-+-+-+----------------------+ D MULTICAST Address 224.0.0.0-239.255.255.255 +-+-+-+-+----------------------+ --------------------- 01005e 23 bit IPv4 Ethernet address --------------------- 19
Multicast on a WAN Quando un processo su un host effettua la join ad un gruppo di multicast, l host invia un messaggio Internet Group Management Protocol (IGMP) a tutti i router multicast notificandoli di aver effettuato la join. Il router multicast scambia questa informazione utilizzando il protocollo di routing del multicast, in modo che ogni router multicast sappia cosa fare quando riceve un pacchetto destinato all indirizzo di multicast. Se più processi su un host effettuano il join allo stesso gruppo, viene inviato il messaggio IGMP solo la prima volta. Nel caso del invio in multicast, un router può dover copiare il datagram. 20
In genere per il pacchetti inviati in unicast non viene mai effettuata una copia. 21
IGMP I messaggi IGMP hanno la seguente struttura: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Type Max Resp Time Checksum +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Group Address +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 22
IGMP (V1) Quando un host effettua il join ad un nuovo gruppo, il kernel invia un messaggio IGMP report (type 2). Questo pacchetto IGMP è generato dal kernel come risposta al comando IP ADD MEMBERSHIP. I routers inviano periodicamente IGMP Host Membership Queries all all-hosts group (224.0.0.1) con TTL 1 (ogni 60-120 secondi). Tutti gli host che supportano il multicast li ricevono ma non rispondono immediatamente per evitare una IGMP Host Membership Report storm. Viene inviata una risposta dopo un intervallo di tempo (ritardo) random per ogni gruppo a cui appartengono sulla stessa 23
interfaccia da cui hanno ricevuto la richiesta 24
Broadcast Con il Broadcast ogni host su una subnet che non partecipa all applicazione deve processare il datagram UDP. I kernel derivati da BSD non permettono di frammentare un datagram da inviare in broadcast. L indirizzo Ethernet per i pacchetti di broadcast è ff:ff:ff:ff:ff:ff. 25