In informatica e telecomunicazioni Diameter è un protocollo AAA (Authentication, Authorization and Accounting) successivo a RADIUS, anche se non è direttamente retrocompatibile. RADIUS è un protocollo AAA client-server tra un NAS (Network Access Server) e un server RADIUS centralizzato, basato sul protocollo di livello di trasporto TCP; Diameter è un protocollo AAA peer-to-peer e consiste di un protocollo di base (specificato nell'RFC 3588) e di un set di estensioni chiamate applicazioni Diameter. Il protocollo base non può essere utilizzato da solo, ma sempre associato a qualche applicazione Diameter specifica del servizio da fornire (Mobile IP, NASREQ, Strong Security, ecc.). È basato sui protocolli di trasporto TCP o SCTP, e richiede l'utilizzo obbligatorio di IPsec.
I principali motivi che hanno spinto a definire un nuovo protocollo sono stati i problemi di RADIUS elencati di seguito.
Diameter è definito in termini di un protocollo base e di un set di applicazioni. Questa progettazione consente al protocollo di essere esteso a nuove tecnologie d'accesso. Il protocollo base fornisce meccanismi di base per un trasporto affidabile, delivery dei messaggi e gestione degli errori, e deve essere utilizzato in concomitanza con un'applicazione Diameter. Ogni applicazione si affida ai servizi del protocollo base per supportare uno specifico tipo di accesso alla rete. Le due principali applicazioni sono Mobile IPv4 e NASREQ (Network Access Server Requirements). L'applicazione NASREQ supporta PPP/IP dial-in ed è inteso come sostituto di RADIUS.
Il protocollo base definisce il formato di un messaggio Diameter di base. I dati sono trasportati nel messaggio Diameter come collezione di AVP (Attribute Value Pair); un AVP è l'equivalente di un attributo RADIUS e consiste di campi multipli: AVP Code, Length, Flags e Data. Alcuni AVP sono utilizzati dal protocollo base di Diameter; altri AVP servono alle applicazioni Diameter; altri ancora possono essere usati dall'applicazione di alto livello dell'end system che impiega Diameter.
Diameter, a differenza di RADIUS, opera su un layer di trasporto affidabile (TCP o SCTP) che fornisce controllo di flusso, conferme a livello trasporto e ritrasmissioni. Mentre TCP è universalmente noto, Stream Control Transmission Protocol (SCTP) è qualcosa di simile ad un nuovo protocollo di trasporto IP, esistente allo stesso livello di UDP o TCP. Nel 2000 SCTP è stato proposto come standard ed è specificato nella RFC 2960.
Oltre a client e server, il protocollo Diameter definisce altri tipi di nodi:
Un messaggio Diameter consiste di un header di lunghezza fissa di 20 byte, seguito da un numero variabile di AVP. Il formato dell'header è il seguente:
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version | | |0 0 0 0 0 0 0 1| Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flags | | |R P E T x x x x| Command-Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Application-ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Hop-by-hop Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | End-to-End Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | AVPs ... +-+-+-+-+-+-+-+-+-+-+-+-+-
L'header del messaggio Diameter contiene due identificatori da 32 bit. L'Hop-by-hop Identifier aiuta nella corrispondenza tra richieste e risposte. Nelle richieste, questo identificatore è sostituito ad ogni hop fin quando il messaggio non viene inoltrato alla sua destinazione finale. Il mittente del messaggio di risposta restituisce lo stesso valore che ha trovato nella corrispondente richiesta. L'End-to-end Identifier, assieme all'identità dell'host di origine, è utilizzato per riconoscere messaggi di richiesta duplicati, e non viene mai modificato fino all'arrivo a destinazione della richiesta. Il mittente della risposta restituisce lo stesso valore che ha trovato nella richiesta corrispondente.
Diameter ammette tipi di dati come Integer32, Unsigned32, Integer64, Unsigned64, Float32, Float64, Float128, OctetString e Grouped; un AVP Grouped è un AVP i cui dati sono una sequenza di AVP.
Sono definiti anche tipi di dati derivati: enumerativi (derivati da integer32), DiameterIdentity (derivati da octetstring), temporali (derivati da unsigned32), UTF8String (derivati da octetstring), IPFilterRule (derivati da octetstring), e QoSFilterRule (derivati da octetstring).
Ogni processo Diameter che gira su un host genera una Diameter Identity, che è una stringa con la sintassi di un Uniform Resource Identifier (URI) che rappresenta il FQDN (Fully Qualified Domain Name) dell'host, una delle porte in ascolto per connessioni in entrata, il protocollo di trasporto (TCP o SCTP), il protocollo AAA (Diameter), e il security transport (nessuno o TLS).
Poiché l'identità trasporta il FQDN dell'host, e poiché più processi Diameter su un singolo host non possono stare in ascolto sulla stessa porta di un dato protocollo, il DiameterIdentity di ogni processo ha la garanzia di essere unico.
Per quanto riguarda i messaggi, ce ne sono di due tipi: Richiesta e Risposta. Ogni messaggio di risposta include un Result-Code AVP, il cui valore è un intero che indica se una particolare richiesta è stata completata con successo oppure se si è verificato un errore. Ciascun messaggio Diameter contiene la Diameter Identity del processo mittente nell'host di origine, ed anche il dominio di tale processo. I messaggi di richiesta possono essere “proxiable” o “non-proxiable”, a seconda di uno dei flag nell'header. Le richieste non-proxiable sono intese strettamente per il next-hop peer, e non vengono mai inoltrate oltre. Le richieste proxiable sono instradabili, e instradate a seconda del dominio. Ogni richiesta proxiable contiene il dominio target nel Destination-Realm AVP.
Un messaggio Diameter pertinente a una specifica sessione utente include un Session-Id AVP, un valore costante per tutta la vita della sessione. Questo valore è una stringa di testo globalmente ed eternamente unica, atta a identificare univocamente una sessione utente senza far riferimento a nessun'altra informazione. Il client Diameter che avvia la sessione crea il Session-Id, il quale inizia con la stringa Diameter Identity del mittente e continua con una sequenza che garantisce unicità sia topologica sia temporale.
Ogni comando è contraddistinto da un codice, utilizzato sia per le richieste che per le risposte:
Comando | Abbr. | Codice |
---|---|---|
Abort-Session-Request | ASR | 274 |
Abort-Session-Answer | ASA | 274 |
Accounting-Request | ACR | 271 |
Accounting-Answer | ACA | 271 |
Capabilities-Exchange-Request | CER | 257 |
Capabilities-Exchange-Answer | CEA | 257 |
Device-Watchdog-Request | DWR | 280 |
Device-Watchdog-Answer | DWA | 280 |
Disconnect-Peer-Request | DPR | 282 |
Disconnect-Peer-Answer | DPA | 282 |
Re-Auth-Request | RAR | 258 |
Re-Auth-Answer | RAA | 258 |
Session-Termination-Request | STR | 275 |
Session-Termination-Answer | STA | 275 |
Credit-Control-Request | CCR | 272 |
Credit-Control-Answer | CCA | 272 |
Il formato dell'header di un AVP Diameter è il seguente:
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | AVP Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Flags | | |V M P x x x x x| AVP Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Vendor-ID (if vendor-specific AVP) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | AVP Data ... (variable length) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
L'AVP Code, assieme al campo Vendor-ID, identificano univocamente l'attributo. I primi 256 numeri, assieme al Vendor-ID settato a zero, sono riservati per compatibilità all'indietro con RADIUS. Il campo AVP Data è formato da zero o più ottetti e contiene informazioni specifiche dell'Attributo. I campi AVP Code e AVP Length determinano il formato e la lunghezza del campo Data.
Attribute-Name | Code | Data Type |
---|---|---|
Acct-Interim-Interval | 85 | Unsigned32 |
Accounting-Realtime-Required | 483 | Enumerated |
Acct-Multi-Session-Id | 50 | UTF8String |
Accounting-Record-Number | 485 | Unsigned32 |
Accounting-Record-Type | 480 | Enumerated |
Accounting-Session-Id | 44 | OctetString |
Accounting-Sub-Session-Id | 287 | Unsigned64 |
Acct-Application-Id | 259 | Unsigned32 |
Auth-Application-Id | 258 | Unsigned32 |
Auth-Request-Type | 274 | Enumerated |
Authorization-Lifetime | 291 | Unsigned32 |
Auth-Grace-Period | 276 | Unsigned32 |
Auth-Session-State | 277 | Enumerated |
Re-Auth-Request-Type | 285 | Enumerated |
CC-Request-Type | 416 | Unsigned32 |
CC-Request-Number | 415 | Unsigned32 |
Class | 25 | OctetString |
Destination-Host | 293 | DiamIdent |
Destination-Realm | 283 | DiamIdent |
Disconnect-Cause | 273 | Enumerated |
E2E-Sequence | 300 | Grouped |
Error-Message | 281 | UTF8String |
Error-Reporting-Host | 294 | DiamIdent |
Event-Timestamp | 55 | Time |
Experimental-Result | 297 | Grouped |
Experimental-Result-Code | 298 | Unsigned32 |
Failed-AVP | 279 | Grouped |
Firmware-Revision | 267 | Unsigned32 |
Host-IP-Address | 257 | Address |
Inband-Security-Id | 299 | Unsigned32 |
Multi-Round-Time-Out | 272 | Unsigned32 |
Origin-Host | 264 | DiamIdent |
Origin-Realm | 296 | DiamIdent |
Origin-State-Id | 278 | Unsigned32 |
Product-Name | 269 | UTF8String |
Proxy-Host | 280 | DiamIdent |
Proxy-Info | 284 | Grouped |
Proxy-State | 33 | OctetString |
Redirect-Host | 292 | DiamURI |
Redirect-Host-Usage | 261 | Enumerated |
Redirect-Max-Cache-Time | 262 | Unsigned32 |
Result-Code | 268 | Unsigned32 |
Route-Record | 282 | DiamIdent |
Session-Id | 263 | UTF8String |
Session-Timeout | 27 | Unsigned32 |
Session-Binding | 270 | Unsigned32 |
Session-Server-Failover | 271 | Enumerated |
Supported-Vendor-Id | 265 | Unsigned32 |
Termination-Cause | 295 | Enumerated |
User-Name | 1 | UTF8String |
Vendor-Id | 266 | Unsigned32 |
Vendor-Specific-Application-Id | 260 | Grouped |
Controllo di autorità | GND (DE) 7625755-1 |
---|