giovedì 28 aprile 2016

Socket: processi server su uno stesso nodo

Si considerino 4 nodi diversi NSA, NSB, NX, NY.

Il processo server SA in esecuzione su NSA esegue il codice seguente:
int t; t=socket(…); bind(t,25,…); listen(t,…); ... interazione con processi client...

Il processo server SB in esecuzione su NSB esegue il codice seguente:
int t; t=socket(…); bind(t,110,…); listen(t,…); ... interazione con processi client...
Su NX sono in esecuzione processi client X1,X2,X3 e su NY sono in esecuzione processi client Y1,Y2,Y3.

All’istante t0 SA ha due connessioni aperte, una con X1 ed una con X2; SB ne ha aperte quattro: con X3, Y1, Y2, Y3.
1.       ....
2.       Si assuma adesso che SA ed SB siano in esecuzione sullo stesso nodo NSA invece che su due nodi diversi. Se lo scenario descritto è ancora possibile, allora elencare i numeri di porta delle due estremità di ogni connessione. Altrimenti spiegare perché lo scenario descritto non è realizzabile.

  • "Non realizzabile perché da come è scritto il codice i due processi server dovrebbero condividere lo stesso welcoming socket t su porte diverse, il che non è possibile". Questo non ha il minimo senso. "t" è il nome di una variabile. Non è il nome di un socket (nozione che peraltro non abbiamo mai definito: quando mai abbiamo parlato di nome di un socket?). Come certamente dovete sapere dai corsi precedenti, processi nello stesso nodo possono usare variabili con lo stesso nome, poiché le variabili di un processo sono visibili solo a quel processo (a meno di casi particolari che non avete visto in nessun corso). Staremmo freschi se quando si lancia un programma P dovessimo sempre incrociare le dita sperando che P non sia stato scritto usando nomi di variabile usati anche in altri programmi che in quel momento sono già in esecuzione.
  • "Non realizzabile perché due server non possono essere in esecuzione sullo stesso nodo". Per quale motivo? Chi l'ha mai detto? Non ha il minimo senso.
  • Non è uno scenario possibile in quanto ci può essere una o più richieste tra un dato client e un dato server". Testuale. A parte la sintassi traballante, qual'è la logica in questa affermazione?
  • "Lo scenario descritto non è più possibile: non ci possono essere due processi server con numeri di porta diversi su un unico nodo". E perché?
  • "Non realizzabile perché avrei due processi server su uno stesso nodo e i processi client possono invece connettersi con un unico server istante per istante" Qual'è la logica? In entrambi gli scenari ogni processo client è collegato con un solo processo server. Se avesse confuso "processo" con "nodo", allora il secondo scenario sarebbe stato con un solo (nodo) server invece che con due (nodi) server, per cui in base a quella spiegazione sarebbe stato realizzabile solo il secondo. A parte la logica che mi sfugge, il ragionamento è comunque sbagliato. Quando mai abbiamo detto che un client si può collegare con un unico server istante per istante? Abbiamo detto, nelle primissime slide del corso per fare una introduzione, che quello è il caso comune. Comune non significa l'unico che può esistere. Inoltre, quando un browser visualizza una pagina si collega a solo un server per volta? Abbiamo anche detto infinite volte che un browser esegue tante azioni parallele. E un browser può avere tanti tab aperti, per cui può avere tante connessioni aperte.
  • "Non realizzabile perché su un nodo tutti gli N+1 socket del server devono essere associati allo stesso numero di porta" Tralasciamo cosa sia N. Risposte di questo genere mi sorprendono completamente. Posso capire che uno non abbia capito un concetto, anche se si tratta di un concetto base. Ma faccio fatica a capire l'apparente assenza di logica (il che mi pare molto più grave). Se invece di un nodo si hanno più nodi allora gli N+1 socket del server non devono essere associati allo stesso numero di porta?
  •  "SA avrà impegnate due porte diverse tra di loro con port number maggior di 1024". Il testo dice che SA è un processo server. Quella affermazione, quindi, non ha il minimo senso. "mentre X1 e X2 avranno la connessione su un PN maggiore di 1024 ma non necessariamente diverso". Diverso rispetto a chi? X1 diverso da X2? o cosa? "Discorso simile per SB, avrà la connessione su 4 porte diverse tra loro (con PN>1024) mentre X3,Y1,Y2,Y3, avranno una connessione su una PN >1024". Evidentemente su questa parte di programma c'è il buio completo.
  • "Non è possibile in quanto su un nodo devo avere in esecuzione un (sottolineato un) processo server". Quando mai abbiamo fatto questa affermazione? Non è una domanda polemica, davvero non capisco da dove possa sorgere questo dubbio. Anche se fosse così, comunque, la frase sarebbe imprecisa: "devo" andrebbe sostituito da "posso" o qualcosa del genere. C'è poi un'apparente assenza di logica che non riesco a comprendere e che mi preoccupa (vedi anche il punto 24); la frase infatti termina con "è infatti il processo server a determinare il numero di porta del server". Come fa una delle due affermazioni a motivare l'altra?