Passa al contenuto principale

IV. L'NCP

Consideriamo l'NCP composto da cinque programmi componenti, tre tabelle associative, alcune code e buffer e una tabella di assegnazione dei link. Ogni sito, naturalmente, adatterà questo progetto alle proprie esigenze, per cui il nostro progetto è soltanto illustrativo.

I programmi componenti​

1. Il gestore dell'input​

Si tratta di una routine di input guidata dalle interruzioni. Avvia la trasmissione Imp-Host verso un buffer residente e risveglia l'interprete dell'input quando la trasmissione è completata.

2. Il gestore dell'output​

Si tratta di una routine di output guidata dalle interruzioni. Avvia la trasmissione Host-Imp da un buffer residente e risveglia lo scheduler dell'output quando la trasmissione è completata.

3. L'interprete dell'input​

Questo programma stabilisce se l'input è un messaggio regolare destinato a un utente, un messaggio di controllo, un messaggio Imp-Host oppure un errore. Per ciascuna classe di messaggio, questo programma intraprende l'azione appropriata.

4. Lo scheduler dell'output​

All'Imp vengono inviate tre classi di messaggi

  1. Messaggi Host-Imp

  2. Messaggi di controllo

  3. Messaggi regolari

Riteniamo che tra queste classi debba essere imposta una priorità. La priorità che suggeriamo è l'ordine indicato sopra. Lo scheduler dell'output seleziona il messaggio con la priorità più alta e lo passa al gestore dell'output.

5. L'interprete delle chiamate di sistema​

Questo programma interpreta le richieste provenienti dall'utente.

I due componenti interessanti sono l'interprete dell'input e l'interprete delle chiamate di sistema. Sono simili in quanto l'interprete dell'input serve le richieste remote e l'interprete delle chiamate di sistema serve le richieste locali.

Tabelle associative​

Immaginiamo che la maggior parte della base di dati dell'NCP risieda in tre tabelle associative. Per "associativa" intendiamo che esiste una routine di ricerca alla quale viene presentata una chiave e che restituisce con successo un puntatore alla voce corrispondente, oppure fallisce se nessuna voce corrisponde alla chiave.

1. La tabella di rendezvous​

Le "richieste di connessione" e gli altri attributi di una connessione sono conservati in questa tabella. L'accesso a questa tabella avviene tramite il socket locale, ma altre tabelle contengono puntatori alle voci esistenti.

I componenti di una voce sono:

  1. socket locale (chiave)

  2. socket remoto

  3. link

  4. coda dei chiamanti

  5. coda del testo

  6. stato della connessione

  7. stato del flusso

  8. puntatore alla porta collegata

Una voce viene creata quando un utente esegue una chiamata di sistema Init o Listen oppure quando viene ricevuto un <RFC>. Alcuni campi restano inutilizzati finché la connessione non è stabilita; ad esempio, se l'utente ha eseguito una Listen, il socket remoto non è noto finché non arriva un <RFC>.

L'interprete dell'input usa l'host remoto e il link come chiave per ottenere un puntatore alla voce della tabella di rendezvous relativa alla connessione che usa il link in ingresso.

Per interpretare gli RFNM, l'interprete dell'input ha bisogno di una tabella della stessa forma della tabella dei link in ingresso, ma che usi i link in uscita.

Si tratta di una struttura molto semplice che tiene traccia di quali link sono in uso per ciascun host. Probabilmente basta una parola per host.

Il diagramma seguente rappresenta la nostra concezione del programma di controllo della rete. I riquadri rappresentano tabelle e buffer, i riquadri con gli angoli smussati e il fondo doppio rappresentano code, i riquadri frastagliati rappresentano programmi componenti e le frecce rappresentano percorsi dei dati.

I nomi abbreviati hanno i seguenti significati.

  1. ILT: Tabella dei link in ingresso

  2. OLT: Tabella dei link in uscita

  3. LAT: Tabella di assegnazione dei link

  4. RT: Tabella di rendezvous

  5. HIQ: Coda Host-Imp

  6. OCCQ: Coda dei comandi di controllo in uscita

  7. ORMQ: Coda dei messaggi regolari in uscita

  8. IHBuf: Buffer riempito dal gestore dell'input con i dati provenienti dall'IMP e svuotato dall'interprete dell'input

  9. OHBuf: Buffer dei messaggi in uscita, riempito dalle code a opera dello scheduler dell'output e svuotato dal gestore dell'output.

                              +---------+
                              |  I M P  |
                              +---------+
                                v     ^
                                |     |
    +---------------------------|-----|------------------------------+
    |                           |     |                              |
    |   /\/\/\/\/\/\/\          |     |     /\/\/\/\/\/\/\           |
    |   \            / <--------+     +---< \            /           |
    |   /  Input     \                      /  Output    \           |
    |   \   Handler  /                      \   Handler  / <----+    |
    |   /            \ >------+             /            \      |    |
    |   \/\/\/\/\/\/\/        |             \/\/\/\/\/\/\/      ^    |
    |                         v                              +-----+ |
    |                      +-----+                           | OH  | |
    |                      | IM  |                           | Buf | |
    |                      | Buf |                           +-----+ |
    |                      +-----+          /\/\/\/\/\/\/\/\    ^    |
    | /\/\/\/\/\/\/\/\        v      +----> \              /    |    |
    | \              /        |      |      /  Output      \ >--+    |
    | /              \ <------+      ^      \              /         |
    | \  Input       /           /-----\    /   Scheduler  \         |
    | /              \ >-------->| HIQ |    \              /         |
    | \  Interpreter /           |_____|    /              \         |
    | /              \ >----+    \_____/    \/\/\/\/\/\/\/\/         |
    | \/\/\/\/\/\/\/\/      |                ^     v    ^            |
    |   ^   ^    ^   \      |    /-----\     |     |    |    /-----\ |
    |   |    \    \   \     |    |  O  |     |     |    |    |  O  | |
    |   |     \    \   \    +--->|  C  |>----+     |    +---<|  R  | |
    |   v     v     v   \        |  C  |           |         |  M  | |
    | +---+ +---+ +---+  \       |  Q  |           v         |  Q  | |
    | |   | |   | |   |   \      |_____|      +---------+    |_____| |
    | |ILT| |LAT| |OLT|    \     \_____/      |         |    \_____/ |
    | |   | |   | |   |     \       ^         |   R T   |       ^    |
    | +---+ +---+ +---+      +------|-------->|         |       |    |
    |         v                     |         +---------+       |    |
    |         |                     ^              ^            |    |
    |         |            /\/\/\/\/\/\/\/\        |            |    |
    |         |            \              /        |            |    |
    |         +----------->/    System    \<-------+            |    |
    |                      \     Call     /                     |    |
    |                      /  Interpreter \>--------------------+    |
    |                      \              /                          |
    |                  +-->/              \>--+                      |
    |                  |   \/\/\/\/\/\/\/\/   |                      |
    +------------------|----------------------|----------------------+
                       |                      |
                       +---< system calls <---+

Nota: Questo RFC è stato convertito in formato leggibile dalla macchina per l'inserimento negli archivi RFC online da Donald e Jill Eastlake nel 1999.

[Nota del curatore: il diagramma originale disegnato a mano rappresentava le code con dei cilindri e i programmi componenti con "cose molli simili ad amebe".]