Internet Group Management Protocol: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m ortografia |
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti. |
||
(11 versioni intermedie di 8 utenti non mostrate) | |||
Riga 1:
L''''Internet Group Management Protocol''' è un protocollo per la gestione dei gruppi [[multicast]].
Costituisce il mezzo per un [[host]] di informare il [[router]] ad esso collegato che un'applicazione che funziona nell'host vuole unirsi a uno specifico [[multicast|gruppo multicast]]. IGMP opera fra un host e il router ad esso collegato direttamente, per coordinare i router multicast invece è richiesto un altro protocollo, affinché i [[datagramma|datagrammi]] multicast possano essere [[instradamento|instradati]] alle loro destinazioni finali. Questa funzionalità è svolta da algoritmi di instradamento multicast dello strato della rete: [[Protocol Independent Multicast|PIM]], [[Distance Vector Multicast Routing Protocol|DVMRP]], [[Multicast Open Shortest Path First|MOSPF]].
Il protocollo attualmente è alla terza versione (IGMPv3) che ha introdotto un sostanziale cambiamento rispetto alle versioni precedenti per quanto riguarda il modello del multicast in Internet: infatti ora IGMP è compatibile col modello [[
== Indirizzi di gruppo ==
Un indirizzo di gruppo o multicast è un [[indirizzo IP]] di classe D di [[32 bit]] (Ipv4) o multicast di [[128 bit]] (Ipv6). Nel caso Ipv4 i primi 4 bit del primo ottetto sono fissati e corrispondono al pattern 1110 mentre i restanti 28 bit costituiscono il Multicast Group ID, quindi tutti questi indirizzi sono nel range 224.0.0.0
* Il primo ottetto è statico e posto a 00000001;
* Il secondo ottetto è statico e posto 00000000;
Riga 11:
* La parte restante è composta da uno 0 seguito dai 23 low-order bit del multicast address.
Per permettere ad un host di configurare la propria architettura per riconoscere come locale un indirizzo multicast i linguaggi di programmazione mettono a disposizione delle primitive, come la SetSockOpt() in C, che quando invocate scatenano
Del range di indirizzi quelli realmente disponibili per applicazioni multicast sono in realtà un sottoinsieme:
* 224.0.0.0 è riservato;
*
*
*
Chi vuole annunciare
== Overview protocollo ==
Il funzionamento
== Protocollo lato Host ==
Quando
* Socket id con cui
* Interfaccia dalla quale
* Indirizzo multicast dal quale
* Source list che specifica da quali sorgenti ricevere, in accordo al modello Source Specific Multicast (da IGMPv3);
* Un filtro che si applica alla Source list: include se
Questa quintupla va a definire un socket record.
La Source list può essere anche vuota: se il filtro associato è include, include{} significa leave (uscita) dal gruppo; se è exclude, exclude{} significa join (aggancio)
Uno degli scopi di IGMP è sintetizzare il più possibile le informazioni di stato associate ad un gruppo, perciò mentre a livello 4 si usa il socket record a livello 2 si fa uso
Un problema di avere un solo record per ogni gruppo è che
A1: <s1, ifc_i, group_address, include, {a,b,c} ><br />
A2: <s2, ifc_i, group_address, include, {b,c,d} >
< group_address, include, {a,b,c,d} >
Se invece almeno uno dei filtri è exclude, lo standard suggerisce che il filtro risultante dovrà essere exclude e la Source list sarà data
A1: <s1, ifc_i, group_address, exclude, {a,b,c,d} ><br />
Riga 51:
A2: <s3, ifc_i, group_address, include, {d,e,f} >
=== Messaggi scambiati: Query ===
Riga 61:
Tutte le query sono inviate in un pacchetto IP con campo Protocol = 2 (IGMP) e TTL = 1 (diffusione locale su LAN).
Le General Query sono inviate periodicamente e rivolte a tutti gli host. Permettono al DR di rinfrescare il suo stato sulla situazione attuale di membership; le risposte a tali query richiedono poco processing da parte del router e non causano, in genere, un aggiornamento dello stato che esso mantiene per ogni gruppo.
Le Group Specific Query e le Group And Source Specific Query sono rivolte solo agli host che ricevono
Una query IGMP è composta da questi campi:
* ''Type = 0x11'' identifica che questo messaggio è una query IGMP;
* ''Max Resp Code'' (MRC) è un valore su 7 bit (tra 0 e 127) che viene usato dagli host per ricavare un Max Response Time usato per desincronizzare le loro risposte, al fine di evitare collisioni sul mezzo broadcast e il problema
IF (MRC < 128) THEN Response Time = MRC;<br />
ELSE { MRC = [1 <exp> <mantissa> ]; Response Time = (mant | 0x10) << (exp +3); } ;
* ''Checksum'' è usato per ricoverare eventuali errori avvenuti durante la trasmissione;
* ''Group Address'' è non nullo solo nelle Group Specific Query e Group And Source Specific Query e rappresenta
* ''Resv'' è un insieme di bit riservato ad uso futuro;
* Il flag ''S'' (Suppress Router-Side Processing) se settato indica ai router riceventi di sopprimere i normali aggiornamenti del timer;
* ''QRV (
* ''QQIC (
* ''Number Of Sources (N)'' indica il numero di sorgenti in una Group And Source Specific Query;
* ''Source Address [1], ..... , Source Address [N]'' specificano ognuno
=== Messaggi scambiati: Report ===
I report IGMP sono messaggi inviati dagli host al DR
* Report inviati in risposta ad una General Query;
* ''Unsolicited Report'', inviati quando si verifica un cambio di stato in un'interfaccia. Sono unsolicited perché
Un report IGMP ha i seguenti campi:
Riga 87:
* ''Reserved'': riservato ad uso futuro;
* ''Checksum'' è usato per ricoverare eventuali errori avvenuti durante la trasmissione;
* ''Number of Group Records (M)'': numero di gruppi per cui
* ''Group Record [1], ….. , Group Record [M]'': ognuno di questi campi è a sua volta un messaggio che dettaglia lo stato di ricezione per quel gruppo.
Mentre la risposta ad una General Query contiene un Group Record per ogni gruppo da cui
Ogni Group Record comprende i seguenti campi:
* ''Record Type'' dice che tipo di informazione contiene il record;
* ''Aux Data Len'' indica la lunghezza delle informazioni ausiliarie presenti nel messaggio;
* ''Number of Sources (N)'' indica il numero di sorgenti per il gruppo specificato;
* ''Multicast Address'' specifica
* ''Source Address [1], ...., Source Address [N]'' specificano ognuno
* ''Auxiliary Data'' contiene informazioni ausiliarie relative al gruppo se avanza spazio, tuttavia queste informazioni non dovrebbero mai essere presenti.
Il campo Record Type è diverso a seconda del tipo di report. Se esso è una risposta ad una General Query è di tipo ''Current_state'' ed è uno dei due ''Mode_Is_Include'' o ''Mode_Is_Exclude''. Altrimenti il report notifica un cambio di stato di
* ''Filter_Mode_Change'': uno tra ''Change_To_Include_Mode'' o ''Change_To_Exclude_Mode'';
* ''Source_List_Change'': uno tra ''Allow_New_Sources'' o ''Block_Old_Sources''.
Tutti i messaggi IGMP devono stare in un pacchetto IP. Se il numero di sorgenti (che determina la lunghezza del messaggio) eccede la dimensione del pacchetto è necessario frammentare i report. In questo caso il comportamento è diverso a seconda del contenuto del campo Record_Type. Se è uno tra Mode_Is_Include, Change_To_Include_Mode oppure Source_List_Change allora è possibile frammentare su più pacchetti IP successivi, altrimenti (causa non additività del filtro exclude)
=== Cambio di stato dell'interfaccia ===
A seguito di direttive IPMulticastListen provenienti dai livelli superiori lo stato di ricezione per un particolare gruppo su una data interfaccia può cambiare. Come conseguenza,
È previsto che questi report vengano inviati per robustezza un certo numero di volte, in numero definito dal campo QRV presente nelle query inviate dal DR, ad intervalli random tra 0 e ''Unsolicited Report Interval'' (
La tabella seguente riporta i cambi di stato che possono occorrere su
{| class="wikitable"
Riga 126:
=== Procedura di risposta ad una Query ===
Quando un host riceve una query dal DR esegue una routine per schedulare una risposta che tiene conto di eventuali query pendenti (ricevute precedentemente e in attesa di risposta).
<
delay ← random [0, Max Response Time];
if (General Query AND pending_response R t.c. start_time_R < current_time + delay)
Riga 144:
end if
</syntaxhighlight>
== Protocollo lato Router ==
Riga 154:
dove:
* multicast_address è
* group_timer è un timer associato
* {source_record} è un insieme di coppie di valori < source_address, source_timer >, dove source_timer è rinfrescato ogni volta che la sorgente compare in un report.
Il group_timer è stato pensato per permettere al DR del protocollo di routing di tagliare traffico non più desiderato da alcun host quando il filtro corrente è exclude e il timer scade. Infatti exclude fa passare tutto il traffico tranne quello proveniente dalle sorgenti specificate nella lista: se il timer scade significa che nessun host in stato exclude ha provveduto a rinfrescare il proprio stato di ricezione (altrimenti almeno uno avrebbe inviato un report) e quindi con molta probabilità gli host non sono più interessati a ricevere dal gruppo. Allora il DR converte il filtro in include con le sole sorgenti che hanno associato un timer > 0, restringendo la quantità di traffico che viene inoltrata sulla LAN. Se ora anche per le sorgenti rimaste il DR vede scadere il timer, allora può dedurre con certezza che nessuno è più interessato a ricevere dal gruppo e può cancellare il record associato.
=== Struttura filtri Include ed Exclude ===
Il filtro Include ha associato una sola lista di sorgenti con timer > 0. Se per una sorgente il timer scade, essa può essere cancellata dal filtro. Se anche
Il filtro exclude ha invece associato due liste: una che corrisponde alle sorgenti con timer > 0 e una a quelle con timer = 0; la sua forma generale è quindi Exclude (X,Y). La prima lista è quella delle sorgenti ''tentative'', per le quali il router a seguito di un aggiornamento del record per il gruppo (che deriva dalla ricezione di un unsolicited report) invia una Group Specific o Group And Source Specific Query al gruppo per verificare se
{| class="wikitable"
Riga 179:
| Exclude || == 0 || Non inoltrare
|-
| Exclude || Nessuna sorgente || Inoltrare: Join
|}
=== Aggiornamento informazioni di stato ===
Ogni volta che il DR riceve un report da un host provvede ad aggiornare il proprio stato per ogni gruppo che compare nel report con
{| class="wikitable"
Riga 226:
|}
== Elezione Designated Router IGMP ==
Ogni LAN elegge un solo router che ha il compito di inviare periodicamente messaggi di Query agli host e di tracciare il loro stato di membership. Questo router è detto Designated Router o più propriamente ''Querier''. Il meccanismo di elezione è molto semplice: ogni router mantiene un ''Other_Querier_Present'' timer che è
== Collegamenti esterni ==
* (EN) [https://tools.ietf.org/html/rfc3376 RFC 3376 - Internet Group Management Protocol, Version 3]
{{IPstack}}
|