Passa al contenuto principale

III. Ambiente

Supponiamo che l'host tipico disponga di un sistema operativo a condivisione di tempo in cui la cpu è condivisa dai processi.

Processi​

Immaginiamo che ogni processo sia contrassegnato da un numero_utente. Può esistere più di un processo con lo stesso numero utente e, in tal caso, tutti dovrebbero cooperare riguardo all'uso della rete.

Immaginiamo che ogni processo contenga un insieme di porte che sono proprie del processo. Queste porte sono usate per l'input verso il processo o l'output dal processo, da o verso file, dispositivi o altri processi.

Immaginiamo inoltre che ogni processo abbia un canale di eventi sul quale può ricevere messaggi molto brevi (pochi bit). Useremo questo meccanismo per notificare a un processo che si è verificata un'azione esterna al processo.

Per partecipare all'attività di rete, un processo collega un socket_locale a una delle sue porte. I socket sono identificati da numero utente, host e AEN, e un socket è locale rispetto a un processo se i loro numeri utente coincidono e si trovano sullo stesso host. Un processo deve specificare soltanto un AEN quando fa riferimento a un socket locale.

Ogni porta ha uno stato che viene modificato dalle chiamate di sistema e da eventi concorrenti esterni al processo. Ogni volta che lo stato di una porta cambia, al processo viene inviato, sul suo canale di eventi, un evento che specifica quale porta ha cambiato stato. Il processo può quindi esaminare lo stato di una porta.

Queste ipotesi sono utilizzate nel materiale descrittivo che segue. Tuttavia, esse non sono imposte dal protocollo di rete e l'implementazione suggerita nella sezione IV non è in alcun modo vincolante.

Desideriamo chiarire bene che questo materiale è offerto soltanto per fornire indicazioni su quali potrebbero essere le difficoltà di implementazione e non per imporre una particolare disciplina.

Ad esempio, trattiamo come validi gli <RFC> che arrivano per socket locali non collegati e li accodiamo. Se lo si desidera, un NCP può rifiutarli, come suggerisce Meyer, oppure può trattenerli per un po' e rifiutarli se non vengono soddisfatti a breve. Il protocollo proposto supporta tutte queste opzioni.

Un'altra opzione locale è quella, già menzionata, di collegare più porte a un socket. Abbiamo mostrato una corrispondenza biunivoca, ma questa può essere ignorata. Analogamente, le chiamate di sistema sono puramente indicative.

Chiamate di sistema​

Queste sono chiamate di sistema tipiche che un processo utente potrebbe eseguire. Le mostriamo soltanto per completezza; ogni sito implementerà senza dubbio l'insieme equivalente che gli risulta più comodo.

Usiamo la notazione

        Syscall ( arg , arg ...; val ... )
1 2 1

dove

  1. Syscall è la chiamata di sistema

  2. arg₁ ecc. sono i parametri forniti con la chiamata, e

  3. val₁ ecc. sono gli eventuali valori restituiti dalla chiamata di sistema.

Init (P,AEN,FS,Bsiz;C)​

  1. P: Specifica una porta del processo.

  2. AEN: Specifica un socket locale. Il numero utente di questo processo e il numero di host di questo host sono impliciti.

  3. FS: Specifica un socket con qualsiasi numero utente, su qualsiasi host, con qualsiasi AEN.

  4. Bsiz: Specifica la quantità di memoria, in bit, che l'utente intende dedicare alla bufferizzazione dei messaggi.

  5. C: Il codice di condizione restituito.

Init tenta di collegare il socket locale specificato da AEN alla porta P e di avviare una connessione con il socket FS. I possibili valori restituiti di C sono

  1. C = ok: L'Init era lecita e il socket FS viene contattato. Quando la connessione sarà stabilita o quando FS rifiuterà, il processo riceverà un evento.

  2. C = busy: Il socket locale era in uso da parte di una porta di questo o di un altro processo con lo stesso numero utente. Non è stata intrapresa alcuna azione.

  3. C = homosex: AEN e FS erano entrambi socket di invio o entrambi socket di ricezione.

  4. C = nohost: L'host designato in FS non è noto.

  5. C = bufbig: Bsiz è troppo grande.

Listen (P,AEN,Bsize;C)​

  1. P: Specifica una porta del processo.

  2. AEN: Specifica un socket locale.

  3. Bsiz: Specifica una dimensione del buffer.

  4. C: Il codice di liceità restituito.

I codici per C sono

C = ok

C = busy

C = bufbig

Il socket locale specificato da AEN viene collegato a P. Se c'è una chiamata in attesa, viene elaborata; altrimenti non viene intrapresa alcuna azione. Quando arriva una chiamata, viene stabilita una connessione e il processo viene notificato tramite un evento.

Close (P)​

P specifica una porta del processo.

Qualsiasi attività viene interrotta e la porta diventa libera per altri usi.

Transmit (P,M,L1;L2,C)​

  1. P: Specifica una porta con una connessione aperta.

  2. M: Il testo da trasmettere.

  3. L1: Specifica la lunghezza del testo.

  4. L2: La lunghezza effettivamente trasmessa.

  5. C: Il codice di errore.

Avviene la trasmissione tra i processi ai due lati della porta.

I codici per C sono

C = ok

oppure

  1. C = not open: se nessuna connessione è attualmente aperta e non altrimenti inibita

Status (P;C)​

Lo stato della porta P viene restituito in C.