next up previous contents
Next: Misure di performance Up: Comunicazione Ethernet Raw Previous: Comunicazione Ethernet Raw   Indice

Implementazione

I pacchetti MPI utilizzati comunicano con il layer TCP dello stack di comunicazione perché il TCP ci permette trasferire in modo sicuro dei dati verso un altro host. Una comunicazione sicura, in cui non vi sono perdite di pacchetti, crea un overhead di dati che puó alterare le reali performances che l'hardware utilizzato puó raggingere. Per poter scoprire le reali performances dell'hardware dei nodi ci siamo dotati di strumenti di comunicazione ad un layer inferiore rispetto al TCP; infatti sono stati creati dei programmi con il linguaggio C che permettono di comunicare a livello Ethernet con la tecnica client-server. Per capire la differenza tra i due livelli si puó fare riferimento allo schema di figura [*]

Figura: Layers in una comunicazione di rete.
\includegraphics[width=3cm]{Images/layernet.eps}

Il trasferimento dei dati in Raw Ethernet é implementata usando delle routines di basso livello del linguaggio C. La comunicazione é creata tramite un socket dichiarato nel seguente modo:

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
Il parametro SOCK_RAW esplicita appunto il tipo raw. Una volta dichiarato il socket bisogna impostare delle opzioni in una struttura chiamata struct sockaddr_ll. La struttura é la seguente:
struct sockaddr_ll socket_address; <- 1

socket_address.sll_family   =  PF_PACKET;     
socket_address.sll_protocol =  htons(ETH_P_IP);  <- 2
socket_address.sll_ifindex  =  ifindex(s);       <- 3
socket_address.sll_hatype   =  ARPHRD_ETHER;     <- 4
socket_address.sll_pkttype  =  PACKET_OTHERHOST; <- 5
socket_address.sll_halen    =  ETH_ALEN;         <- 6
  1. Dichiarazione della struttura
  2. Tipo di protocollo di rete utilizzato
  3. Interfaccia di rete utilizzata per la comunicazione
  4. Traffico di rete da ascoltare:
  5. Dichiarazione della lunghezza dell'indirizzo del layter fisico.

Oltre a questi parametri bisogna impostare, all'interno alla struttura, anche l'indirizzo fisico del host con cui si andrá a comunicare, per fare questo bisogna usare il parametro:

socket_address.sll_addr
Fatto questo si utilizza la funzione recvfrom() per riceve i pacchetti dalla scheda di rete. La recvfrom() é utilizzata nel seguente modo:
recvfrom(s, buffer, size, 0, NULL, NULL);
Vediamo nel dettaglio i parametri passati a questa funzione: Per poter spedire dei dati usando l'Ethernet Raw il procedimento é analogo. La funzione per spedire i dati é la seguente:
sendto( s, 
        buffer,
        size, 
        0, 
        (struct sockaddr*) &socket_address, 
        sizeof(socket_address);

Il buffer di dati da spedire deve avere una struttura interna definita come in figura [*].

Figura: Struttura di un pacchetto per la comunicazione Ethernet Raw.
\includegraphics[width=12cm]{Images/pack.eps}

La struttura di un procotollo di comunicazione di cosí di basso livello puó essere implementata nell'ambito della rete locale. Questo perché le interfacce di rete, non risentendo del traffico di sistema possono essere adibite solo alle comunicazioni tra i vari processi lanciati sul cluster. In altre parole, essendo l'unico protocollo da gestire dall'interfaccia locale, non occorre implementare protocolli di piú alto livello indispensabili al sistema operativo.


next up previous contents
Next: Misure di performance Up: Comunicazione Ethernet Raw Previous: Comunicazione Ethernet Raw   Indice
Mario Cavicchi 2004-07-22