Gestione dei set di connessioni di rete (associazioni)
A partire da Windows 2000, il runtime RPC può mantenere più di una connessione tra il client e il server. In questo modo si facilita l'operazione sui trasporti che non supportano la modifica dell'identità client senza ripetere la connessione, i client multithreading e i client asincroni. Il set di connessioni tra un processo client e un endpoint server viene chiamato associazione nella terminologia RPC. La comprensione delle associazioni può migliorare l'implementazione di RPC.
In uno scenario di identità a thread singolo e a client singolo, RPC apre una connessione tra un processo client e un endpoint server per effettuare chiamate RPC. Quando viene effettuata una chiamata RPC sincrona, il client invia la richiesta al server in questa connessione e riceve anche la risposta. Quando il numero di thread che effettuano chiamate RPC nel processo client aumenta, l'identità di sicurezza del client può cambiare. Quando le chiamate asincrone/pipe vengono combinate con chiamate sincrone sul client, RPC potrebbe richiedere più di una connessione di rete. Tutte le connessioni nel set vengono inserite in un pool di connessioni denominato associazione.
Una chiamata di procedura remota sincrona usa esclusivamente una determinata connessione per conformarsi agli standard RPC. Una connessione usata da una chiamata RPC sincrona viene considerata occupata se è stata inviata una richiesta, ma non è stata ricevuta una risposta. Non è consentito alcun altro traffico su tale connessione finché non viene ricevuta la risposta. Il tempo di esecuzione RPC tenta di eseguire chiamate RPC asincrone multiplex e pipe sulla stessa connessione. Le chiamate sincrone e asincrone/pipe non possono essere combinate nella stessa connessione, il che significa che una determinata connessione può essere usata per le chiamate RPC sincrone o per le chiamate RPC asincrone/pipe.
RPC tenta in modo aggressivo di riutilizzare le connessioni dal pool. Quando viene eseguita una nuova chiamata RPC, RPC tenta di trovare una connessione appropriata dal pool e crea una nuova connessione solo se non è possibile trovare una connessione appropriata. Affinché una connessione sia considerata appropriata, deve:
- Essere del tipo appropriato (sincrono o asincrono/pipe).
- Siate liberi.
- Avere la stessa identità di sicurezza dell'handle di associazione in cui viene effettuata la chiamata. Se viene usato il rilevamento dinamico delle identità, l'identità dell'handle di associazione viene aggiornata dal token del thread all'inizio della chiamata. Se viene usato il rilevamento delle identità statiche, viene usata l'identità client contrassegnata nell'handle di associazione.
Al termine della chiamata, una volta ricevuta la risposta, la connessione viene contrassegnata come gratuita e può essere usata per altre chiamate RPC.
L'identità di sicurezza in una connessione non può cambiare. Ad esempio, se un numero elevato di chiamate allo stesso server viene eseguito con identità di sicurezza diverse, aumenta il numero di connessioni nel pool di thread. L'associazione stessa viene conteggiata come riferimento e, quando tutti i riferimenti non sono più presenti, si arresta e chiude tutte le connessioni. Ogni handle di associazione e ogni handle di contesto contengono un riferimento sull'associazione. Quando tutto viene chiuso, l'associazione scompare. In Windows XP le associazioni non scompaiono necessariamente immediatamente; possono rimanere per un breve periodo (il periodo di destinazione è di 20 secondi, ma il tempo di esecuzione RPC può scegliere di ritardare l'eliminazione dell'associazione se non sono disponibili thread per eseguire l'attività). Se non si desidera che l'associazione rimanga attiva dopo la chiusura dell'ultimo handle di contesto o dell'handle di associazione, usare l'opzione RPC_C_OPT_DONT_LINGER per forzare il runtime RPC a chiudere immediatamente la connessione.