ArNet: Difference between revisions

From ciapini
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
e' un protocollo che raggruppa i livelli datalink, rete e trasporto per lo scambio di piccoli blocchi di dati (da 16 a 1024 byte) tra piccoli gruppi di nodi (massimo 256), connessi da un mezzo fisico comune.
e' un protocollo che implementa i livelli datalink (ISO/OSI 2), rete (ISO/OSI 3) e trasporto (ISO/OSI 4) per lo scambio di piccoli blocchi di dati (da 16 a 1024 byte) tra piccoli gruppi di nodi (massimo 256), connessi da un mezzo fisico trasmissivo condiviso.


diversamente dai sistemi a layer, il trasporto dei dati in arNet viene caratterizzato da delle features liberamente combinabili.
diversamente dai sistemi a layer, il trasporto dei dati in arNet viene caratterizzato da delle features liberamente combinabili.
Line 21: Line 21:




=== Framing ===
== Framing ==


um messagio arNet e' composto da:
um messagio arNet e' composto da:
Line 28: Line 28:
* zero o piu [[#Blocco DATA|blocchi dati]] da 16 byte ognuno, con [[#FEC]], [[#Interleaver]] e (opzionalmente) [[#Cifratura]]
* zero o piu [[#Blocco DATA|blocchi dati]] da 16 byte ognuno, con [[#FEC]], [[#Interleaver]] e (opzionalmente) [[#Cifratura]]


=== Controllo di Errore ===
== Controllo di Errore ==


per resistere agli errori di trasmissione, gli header e i dati passano attraverso un [[#FEC]] ed un [[#Interleaver]].
per resistere agli errori di trasmissione, gli header e i dati passano attraverso un [[#FEC]] ed un [[#Interleaver]].


==== FEC ====
=== FEC ===


algoritmo di FEC: [[Hadamard code]]
algoritmo di FEC: [[Hadamard code]]
Line 65: Line 65:




==== Interleaver ====
=== Interleaver ===


i possibili problemi 'descrivibili' del path di trasmissione sono:
i possibili problemi 'descrivibili' del path di trasmissione sono:
Line 121: Line 121:




==== Soft-Decision ====
=== Soft-Decision ===


nella catena di demodulazione si possono ottenere diversi indici di affidabilita
nella catena di demodulazione si possono ottenere diversi indici di affidabilita
Line 129: Line 129:
una cosa MOLTO carina da fare (dato che siamo in uno dei pochi casi in cui le risorse di calcolo sono ben piu grandi della banda) e' avere una qualche strategia di soft-decision pilotata dai valori in uscita dalla fft, magari triggerata da differenze tra l'energia nei bin inferiori a una data soglia.
una cosa MOLTO carina da fare (dato che siamo in uno dei pochi casi in cui le risorse di calcolo sono ben piu grandi della banda) e' avere una qualche strategia di soft-decision pilotata dai valori in uscita dalla fft, magari triggerata da differenze tra l'energia nei bin inferiori a una data soglia.


=== Controllo di Flusso ===
== Controllo di Flusso ==


vedi [[#Global Routed Transport Header]]
vedi [[#Global Routed Transport Header]]


==== Blocco start ====
=== Blocco start ===


indica l'inizio di una trasmissione. precede sempre un blocco HEADER.
indica l'inizio di una trasmissione. precede sempre un blocco HEADER.
Line 146: Line 146:
* https://en.wikipedia.org/wiki/Gold_code
* https://en.wikipedia.org/wiki/Gold_code


=== Blocchi header ===
== Blocchi header ==


sono una serie di almeno 1 blocchi con dimensione sempre 4 bytes che precedono sempre una serie di zero o piu blocchi dati.
sono una serie di almeno 1 blocchi con dimensione sempre 4 bytes che precedono sempre una serie di zero o piu blocchi dati.
Line 160: Line 160:




==== Default header ====
=== Default header ===


E' l'header di base, sta all'inizio di ogni messaggio e si occupa dell'instradamento locale e dell'ordinamento dei pacchetti. Dev'essere implementato su ogni nodo.
E' l'header di base, sta all'inizio di ogni messaggio e si occupa dell'instradamento locale e dell'ordinamento dei pacchetti. Dev'essere implementato su ogni nodo.
Line 185: Line 185:
l'indirizzo 0 e' broadcast.
l'indirizzo 0 e' broadcast.


==== Segment Access Advertisement Header ====
=== Segment Access Advertisement Header ===


il pacchetto viene mandato esclusivamente dai router per istruire i nodi che sono nel segmento di rete sul proprio indirizzo globale e sulle regole di accesso al canale
il pacchetto viene mandato esclusivamente dai router per istruire i nodi che sono nel segmento di rete sul proprio indirizzo globale e sulle regole di accesso al canale
Line 222: Line 222:
* https://en.wikipedia.org/wiki/Scheduling_algorithm
* https://en.wikipedia.org/wiki/Scheduling_algorithm


==== Global Routing Advertisement Header ====
=== Global Routing Advertisement Header ===


il pacchetto viene mandato esclusivamente dai router ad altri router per descrivere la topologia della rete
il pacchetto viene mandato esclusivamente dai router ad altri router per descrivere la topologia della rete


==== Global Routed Transport Header ====
=== Global Routed Transport Header ===


viene usato dai nodi per mandare dati in maniera routed (ossia tra nodi che stanno su un segmento (canale) potenzialmente diverso).  
viene usato dai nodi per mandare dati in maniera routed (ossia tra nodi che stanno su un segmento (canale) potenzialmente diverso).  
Line 255: Line 255:
* http://hondo.informatik.uni-freiburg.de/pubs/MANET-trade_offs.pdf
* http://hondo.informatik.uni-freiburg.de/pubs/MANET-trade_offs.pdf


==== CRC Header ====
=== CRC Header ===


per avere conferma che il messaggio e' stato trasportato senza essere danneggiato
per avere conferma che il messaggio e' stato trasportato senza essere danneggiato
Line 269: Line 269:
* '''crc''' valore crc di TUTTO il blocco dati
* '''crc''' valore crc di TUTTO il blocco dati


==== Transport Reliability header ====
=== Transport Reliability header ===


quando il FEC non basta...
quando il FEC non basta...
Line 288: Line 288:
http://www.isode.com/whitepapers/stanag-5066.html
http://www.isode.com/whitepapers/stanag-5066.html


==== Timing Header ====
=== Timing Header ===


{|style="color:green; background-color:#ffffdd;" cellpadding="10" cellspacing="0" border="1"
{|style="color:green; background-color:#ffffdd;" cellpadding="10" cellspacing="0" border="1"
Line 300: Line 300:
* '''time''' seconds of day
* '''time''' seconds of day


==== Media Access Control ====
=== Media Access Control ===


{|style="color:green; background-color:#ffffdd;" cellpadding="10" cellspacing="0" border="1"
{|style="color:green; background-color:#ffffdd;" cellpadding="10" cellspacing="0" border="1"
Line 308: Line 308:
* '''htype''' tipo header 0x6
* '''htype''' tipo header 0x6


==== Blocco DATA ====
=== Blocco DATA ===


sempre 16 bytes di dati netti
sempre 16 bytes di dati netti

Revision as of 14:41, 20 May 2013

e' un protocollo che implementa i livelli datalink (ISO/OSI 2), rete (ISO/OSI 3) e trasporto (ISO/OSI 4) per lo scambio di piccoli blocchi di dati (da 16 a 1024 byte) tra piccoli gruppi di nodi (massimo 256), connessi da un mezzo fisico trasmissivo condiviso.

diversamente dai sistemi a layer, il trasporto dei dati in arNet viene caratterizzato da delle features liberamente combinabili.

arNet si preoccupa SOLO (e non sempre) di:

altre features vanno implementate altrove: datagram/virtual circuit transport, crittografia...

i nodi possono essere terminali o router

il MAC - routing si basa su due livelli di indirizzo:

  • un indirizzo del terminale, valido tra i terminali che condividono il canale fisico
  • un indirizzo del segmento, che identifica il canale fisico


Framing

um messagio arNet e' composto da:

Controllo di Errore

per resistere agli errori di trasmissione, gli header e i dati passano attraverso un #FEC ed un #Interleaver.

FEC

algoritmo di FEC: Hadamard code

la latenza minima al netto del FEC e' data dal blocco di crittazione (16bytes).

anche la granularita della protezione di errore FEC e' data dal blocco di crittazione (16bytes): e' inutile tentare di preservare l'integrita di blocchi di dati piu piccoli di 128bit, il danneggiamento anche di un solo bit si ripercuoterebbe sul contenuto di tutto il blocco di crittazione.

se si perde anche un solo bit del segnale al netto del FEC vanno persi 16 caratteri.

questo e' tendenzialmente male pensando all'uso con messaggi di testo, i linguaggi naturali hanno una loro ridondanza a livello di parola considerevole. per applicazioni non di testo questo vantaggio non esiste, anche se per messaggi molto piu piccoli di 16byte l'overhead dato dal padding e' comunque considerevole.

d'altra parte dimensioni di blocco crittografico piu piccole implicherebbero minore sicurezza (anche se in realta il tutto sarebbe proporzionale alla quantita di dati trasferiti con una determinata chiave). crittare il codice FEC (n = 128bit, se si usano input k di 8 bit) sembrerebbe allettante dato che si allineerebbe al blocco crittografico, ma:

  1. crittograficamente e' un inganno, dato che i codici fec trasmessi sono comunque sempre 256 dal punto di vista della ripetitivita sarebbe equivalente ad usare una cifratura con dimensione blocco di 1byte. troppo poco.
  2. dal punto di vista del FEC e' un inganno, decrittando un blocco danneggiato si avrebbe un codice fec danneggiato in maniera complessa, perdendo il vantaggio della ortogonalita del codice di hadamard.

alla luce di questo forse ha senso considerare dei block codes diversi da quello di Hadamrd, che e' non-ottimale per k maggiore di 7 [1].

la dimensione del blocco FEC * numero di caratteri del blocco AES sarebbe quindi:

  1. 2^(8-1) * 16 = 2048 bit nel caso di FEC con input a 8 bit.
  2. (2 * 2^(4-1)) * 16 = 256 bit nel caso di FEC con input a 4 bit (ogni carattere 2 input).

prendendo il secondo caso, con un alfabeto di 16 toni per simbolo, quindi 4 bit, la latenza sarebbe di 64 simboli, che a 32 simboli per secondo farebbe 2 secondi per 16 caratteri.

la cosa migliore da fare e' rassegnarsi a questa latenza di blocco e cercare di fare uno spreading piu efficiente possibile, vedi interleaving.

letture:


Interleaver

i possibili problemi 'descrivibili' del path di trasmissione sono:

problemi di spettro:

  • interferenze coerenti (toni sovrapposti a uno dei nostri bin)
  • errori della risposta in frequenza (equalizzazione..)

entrambi comportano il danneggamiento sistematico di una o piu determinate lettere dell'alfabeto in ogni simbolo

problemi nella sequenza di simboli:

  • disturbo impulsivo prolungato su tutto lo spettro
  • disturbo impulsivo ciclico su tutto lo spettro

che comportano la perdita di piu simboli contigui o la perdita sistematica di un determinato simbolo.

per mitigare questi problemi puo essere conveniente una qualche forma di interleaving sia in tempo che in frequenza/fase.

prendiamo il caso di un blocco da 256 bit formato da 4 sottoblocchi quadrati da 64bit -> 16 simboli*16 toni contenenti ognuno 4 caratteri.

con un hadamard code, si possono correggere fino ad 1/4 dei bit del codice.

prendiamo come casi peggiori possibili

  • la perdita sistematica di 1 bit del simbolo
  • la perdita di un intero sottoblocco

questo significa che in ogni sottoblocco si possono danneggiare (non contemporaneamente) fino a:

  • 4 simboli
  • 4 toni ?

il sistema piu rudimentale e' l'interleaving elicoidale, ad esempio una rotazione nel senso della sequenza combinata con una rotazione nel senso del simbolo. l'incremento sarebbe di un bit/simbolo in senso verticale e di un sottoblocco + un simbolo in senso orizzontale

uint8_t InterleaveBlock(uint8_t *InData, int16_t *DataMatrix, uint8_t *ModulationSymbolsBuffer){
   uint8_t BitPos, SymbolOffset, BitOffset;
   for (uint8_t FECBlock = 0; FECBlock < HadamardCodesPerInterleaverBlock; FECBlock++){
 
      BlockEncodeChar(DataMatrix, InData[FECBlock]);
      for (uint8_t FECBit = 0; FECBit < HadamardCodeSize; FECBit++){
	 BitPos = (FECBlock * HadamardCodeSize) + FECBit;
	 BitOffset = BitPos % BitsPerModulationSymbol;
	 SymbolOffset = ((FECBit * HadamardCodeSize) + FECBlock) % SymbolsPerInterleaverBlock;
	 ModulationSymbolsBuffer[SymbolOffset] |= (DataMatrix[FECBit] & 0b1) << BitOffset;
	 // printf("%u,%u,%u\n", SymbolOffset, BitOffset, BitPos);
      }
//      printf("\n in FEC: ");
//      printbuf(DataMatrix, HadamardCodeSize, 8);
   }
}

che produce una disposizione [2], dove il colore e' l'ordine dei bit in ingresso (dal blu al rosso), la x e' il tempo e la y il simbolo in uscita


Soft-Decision

nella catena di demodulazione si possono ottenere diversi indici di affidabilita

  • rapporto tra il tono di picco e la media degli altri toni
  • valore del picco carattere nella trasformata di hadamard

una cosa MOLTO carina da fare (dato che siamo in uno dei pochi casi in cui le risorse di calcolo sono ben piu grandi della banda) e' avere una qualche strategia di soft-decision pilotata dai valori in uscita dalla fft, magari triggerata da differenze tra l'energia nei bin inferiori a una data soglia.

Controllo di Flusso

vedi #Global Routed Transport Header

Blocco start

indica l'inizio di una trasmissione. precede sempre un blocco HEADER.

questo riferimento deve avere autocorrelazione tendente a zero, essere abbastanza lungo (raro) da evitare false partenze, abbastanza corto da non creare overhead. viene usato per la sincronizzazione di simbolo e per l'equalizzazione.

lunghezza 8 simboli. 4 simboli alla frequenza/fase base e 4 all'estremo opposto della costellazione di simboli (frequenza massima/fase +180).

letture:

Blocchi header

sono una serie di almeno 1 blocchi con dimensione sempre 4 bytes che precedono sempre una serie di zero o piu blocchi dati.

il primo blocco e' chiamato default header ed e' sempre presente.

i blocchi header successivi sono indicati dall' header type

i blocchi header subiscono tutti block-coding -> #Interleaver

la lunghezza dell'intero messaggio sara sempre 4 + (hnum * 4) + (siz * 16) bytes


Default header

E' l'header di base, sta all'inizio di ogni messaggio e si occupa dell'instradamento locale e dell'ordinamento dei pacchetti. Dev'essere implementato su ogni nodo.

8b (src) 8b (dst) 3b (hnum) 5b (siz) 8b (cnt)

campi:

  • hnum numero di header da 4 byte che seguono il default header.
  • siz dimensione del blocco dati che segue in multipli di 16byte
  • src indirizzo del mittente
  • dst indirizzo del destinatario
  • cnt contatore incrementale dei pacchetti inviati dal nodo con tupla (src,dst). un salto nella numerazione implica perdita pacchetti.

il multicast e' semplicemente un indirizzo di ricezione secondario sui client

src e dst sono significativi solo sul canale fisico, e' normale che ci siano client omonimi su due canali diversi

l'indirizzo 0 e' broadcast.

Segment Access Advertisement Header

il pacchetto viene mandato esclusivamente dai router per istruire i nodi che sono nel segmento di rete sul proprio indirizzo globale e sulle regole di accesso al canale

il routing e' un instradamento tra segmenti diversi. ogni segmento ha un indirizzo.

un indirizzo globale e' composto dall' indirizzo del segmento concatenato coll' indirizzo del nodo (16bit)

tutti i nodi che ricevono il pacchetto e vogliono aderire al router devono memorizzare queste impostazioni.

i nodi fanno il possibile per non trasmettere durante la trasmissione del SAAH.

i router presenti sul segmento devono concordare sulle informazioni contenute in questo pacchetto e trasmetterlo a turno.

4b (htype) 8b (tframe) 8b (segaddr) 8b (chanload) 4b (congclient)
  • htype tipo header 0x1
  • tframe dimensione timeframe del segmento in multipli di 100msec. il prossimo SAAH verra spedito dopo questo periodo, non necessariamente dallo stesso router.
  • segaddr indirizzo del segmento di rete
  • chanload numero di client attivi sul canale rilevati dal router
  • congclient numero di client che hanno comunicato congestione in output. i client senza congestione in output attenderanno almeno tframe*(congclient/chanload) prima di inviare.

il tempo di riferimento del segmento viene resettato all'inizio dello start block di ogni SAAH inviato dal router

letture:

Global Routing Advertisement Header

il pacchetto viene mandato esclusivamente dai router ad altri router per descrivere la topologia della rete

Global Routed Transport Header

viene usato dai nodi per mandare dati in maniera routed (ossia tra nodi che stanno su un segmento (canale) potenzialmente diverso).

4b (htype) 4b (ttl) 1b (fecn) 1b (becn) 8b (segsrc) 8b (segdst)
  • htype tipo header 0x2
  • ttl numero di hop massimi di routing. viene decrementato ad ogni hop.
  • fecn forward congestion notification. il nodo ha la coda di output piena e ha bisogno di trasmettere prima possibile. 0 normale, 1 congestionato.
  • becn backward congestion notification. il nodo ha la coda di input piena e chiede che gli si mandino i dati piu tardi possibile. 0 normale, 1 congestionato.
  • segsrc id del segmento di rete del mittente.
  • segdst id del segmento di rete del destinatario.

se segsrc e segdst sono entrambi uguali al segaddr, allora il router funge da repeater

  • i client ignorano i messaggi con segaddr diverso dal proprio
  • i router invece li inoltrano

letture:

CRC Header

per avere conferma che il messaggio e' stato trasportato senza essere danneggiato

4b (htype) 4b (crctype) 24b (crc)
  • htype tipo header 0x3
  • crctype tipo crc (0x0000 = CRC-24 di OpenPGP)
  • crc valore crc di TUTTO il blocco dati

Transport Reliability header

quando il FEC non basta...

4b (htype) 4b (arqtype) 8b (cnt)
  • htype tipo header 0x4
  • arqtype schema arq: 0x0 = "Stop-and-wait ARQ", 0x1 = "Go-Back-N ARQ", 0x2 = "Selective Repeat ARQ"
  • arqaction arq action (ack, nack, retransmit)
  • arqvalue arq value (cnt, back)

letture:

http://www.isode.com/whitepapers/stanag-5066.html

Timing Header

4b (htype) 11b (date) 17b (time)
  • htype tipo header 0x5
  • date days from epoch
  • time seconds of day

Media Access Control

4b (htype)
  • htype tipo header 0x6

Blocco DATA

sempre 16 bytes di dati netti

subisce: cifratura -> block-coding -> interleaving

letture:

https://en.wikipedia.org/wiki/Communications_protocol

Cifratura

algoritmo di cifratura: AES-256 (blocco 128 bit, chiave 256 bit)

la chiave e' composta di 64 caratteri esadecimali

il blocco crittato e' sempre di 16byte


Letture