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
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
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_addrFatto 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:
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 .
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.