La vicenda nella quale la pidocchiaggine di bit ha avuto effetti particolarmente
noti tra il grande pubblico e' sicuramente quella della versione 4 del protocollo IP,
IPv4 per gli amici.
Come probabilmente sapete gia' ogni computer su internet ha un indirizzo, chiamato
indirizzo IP, cosi' come le vostre case hanno un indirizzo. I pacchetti vengono spediti da un mittente e recapitati ad un destinatario tramite questo indirizzo IP, proprio come le lettere nelle vostre cassette dalla posta.
Quando e' stato progettato il protocollo IP, sono stati assegnati soli 32 bit al campo indirizzo: i computer allora non erano veloci come oggi, e 32 bit equivalgono a 2 elevato a 32 indirizzi diversi, che sono
poco piu' quattro miliardi. I progettisti di allora pensarono che erano piu' che sufficienti. Quando ci saranno mai quattro miliardi di computer connessi ad internet al mondo?
Era il 1981 ed era difficile pensare che internet sarebbe diventata cio' che e' oggi: ci sono miliardi di computer al mondo, molti sotto le mentite spoglie di telecamere, console di video game e chi piu' ne ha piu' ne implementi, cosi' a distanza di un paio di decadi quattro miliardi di indirizzi IP sono diventati pochi, e cio' ha portato ad una serie di conseguenze spiacevoli.
Economizzare gli IP
Un modo per economizzare sugli indirizzi IP consiste nell'utilizzare indirizzi dinamici: ad esempio ogni volta che vi connettete ad internet con la vostra ADSL ve ne viene assegnato uno diverso. In questo modo se il vostro provider ha 50 utenti, ma al massimo solo 10 sono connessi simultaneamente, e' possibile usare solo 10 indirizzi IP. Questo significa che:
- Non potete far girare un server sulla vostra connessione ADSL se non prendente opportuni provvedimenti, l'indirizzo cambia sempre (vi serve un servizio di DNS dinamico come dyndns).
- Il NATting: avete solo un indirizzo IP per ogni linea ADSL, se volete far navigare piu' computer usate una tecnica chiamata Network Address Translation, senza scendere nei tecnicismi il risultato e' che ad esempio quando vi connettete ad una rete peer 2 peer come eDonkey se non cambiate una serie di settaggi nel vostro router/gateway/modem di norma non riuscite ad avere un Id alto, e condividete i file piu' lentamente di altri. Allo stesso modo quando usate Skype o altri programmi che necessitano una connessione diretta con un computer diverso a volte siete costretti a passare per un ripetitore, un terzo computer che via aiuta facendo da intermediario.
In breve a causa del fatto che IPv4 ha indirizzi di soli 32 bit si e' dovuto economizzare sugli indirizzi IP, con la conseguenza di dover adottare tecniche quali gli indirizzi dinamici e il NAT, che sono nemiche della funzionalita'.
Eppure in qualche modo siamo tutti disposti a tollerare l'errore. Era il 1981 e dopo tutto i progettisti di IP ci hanno regalato davvero tanto, e a quei tempi
l'onere introdotto dall' utilizzo di indirizzi piu' grandi poteva essere considerevole.
Con IPv6, il successore di IPv4, il problema e' risolto, ma come molti di voi sapranno IPv6 sta facendo davvero fatica ad imporsi sul mercato. Ma non e' solo di IP che voglio parlare...
USB
Si puo' facilmente identificare uno studente di storia alle prime armi dal fatto che vi dira' qualcosa come "
e' importante studiare la storia per evitare di rifare gli errori del passato in futuro". Chiedetelo a qualunque storico smaliziato o ad uno statista...
A quanto pare funziona cosi' anche con la tecnologia, infatti puntuale come un orologio svizzero a distanza di un ventennio circa USB sbaglia nuovamente, e pecca di poca lungimiranza ancora una volta ma
in un contesto che rende questo errore difficilmente perdonabile.
Anche i device USB infatti hanno degli identificativi. Qualunque oggetto USB esistente ha assegnati due numeri a 16 bit:
- Il vendor ID, che rappresenta l'identificativo del venditore, ad esempio Sony, Philips, Logitech, e cosi' via.
- Il product ID, che rappresenta uno specifico prodotto di quel venditore.
Il mio mouse ha come identificativo
05fe:0005 (numeri espressi in forma esadecimale, ovvero in base sedici):
- Vendor id 05fe corrisponde a Chic Technology Corp.
- Product id 0005 e' invece relativo al prodotto Viewmaster 4D Browser Mouse
Ma a cosa servono? Quando un device e' connesso ad un computer una delle sue prime preoccupazioni e' identificarsi, in questo modo il computer sa di cosa si tratta, e puo' passare il controllo al giusto driver. A sua volta il driver ha precedentemente informato il computer che e' in grado di gestire una serie di device, con relativi codici.
Se il codice del device che abbiamo connesso al PC non corrisponde a nessuno dei codici che i driver in memoria hanno dichiarato di saper gestire, significa che non c'e' proprio un driver in grado di gestire tale device, e il computer notifichera' questa condizione all'utente (su Linux vedrete delle righe nei log di sistema, su Windows invece ci sara' un avviso di nuovo hardware e un invito a installare il driver corrispondente).
Questo sistema e' ottimo, simile a quello utilizzato dal bus PCI in precedenza. Questa caratteristica aggiunta alla semplicita di USB che permette di avere device a bassissimi costi, al supporto nativo per l'hot plugging, alla varieta' di device supportabili, alla capacita' del bus di alimentare direttamente device a bassa potenza fanno di USB, a mio avviso, il miglior bus che i PC abbiano mai conosciuto.
Un disegno cosi' sonoro ha preso pero' una bella svista definendo il product ID e il device ID come numeri di 16 bit, ovvero capaci di rappresentare, ognuno, 65536 diversi codici. Una azienda normale, non troppo grande, avra' a disposizione un solo Vendor ID (le piu' grosse possono averne di piu'). Con un solo Vendor ID, e un Product ID compreso tra 0 e 65535 puo' identificare in maniera univoca 65535 device, molti direte voi, ma se una azienda produce molti device ha comunque una certa riluttanza nel consumare device ID. Se li usa senza pensarci troppo magari rimane senza...
Se 65 mila prodotti vi sembrano tanti pensate in quest'ottica: ogni volta che un prodotto viene aggiornato, anche di poco, per sistemare un baco o perche' ha cambiato chipset,
se la modifica cambia il modo in cui il PC vede il device, che quindi non puo' piu' essere gestito dallo stesso driver, e' necessario cambiare Product ID! altrimenti un driver puo' tentare di accedere al device come se fosse fatto in un certo modo per scoprire che qualcosa non funziona, con risultante frustrazione dell'utente.
Se una azienda ha molti prodotti e fa molte revisioni di questi prodotti in alcuni anni puo' finire per terminare gli ID.
Di conseguenza i produttori cosa fanno? risparmiano gli ID pure loro, come accade per gli indirizzi IP. Il risparmio consiste nella
criminale pratica di tenere lo stesso product ID anche quando il device viene modificato e non funziona piu' col vecchio driver.
Tanto, pensano loro sbagliando, alleghiamo un nuovo driver nella confezione, e l'utente che ha acquistato tale device installera' il driver da noi fornito e tutto funzionera' perfettamente. In realta' questa situazione crea una confuzione pazzesca. Se perdete il CD di installazione dovete andare a vedere da qualche parte quale revisione dell'hardware c'e' dentro il vostro device leggendo qualche minuscola sigla stampata da qualche parte (quando c'e'!). In base al numero di revisione dell'hardware dovete andare a scaricare il giusto driver:
molto scomodo, frustrante, e totalmente contrario all'idea di "lo collego e funziona".
Come se non bastasse coi sistemi operativi free, come Linux, dove i driver li scrive raramente la casa madre, non e' possibile fare un auto-detect dignitoso. Un utente che possiede un device USB che ha un dato identificativo di produttore e di prodotto
potrebbe non essere in grado di sapere che driver usare o se il suo device e' supportato senza guardare altri codice di revisione dell'hardware o senza fare un sacco di prove empiriche.
La cosa che infastidisce di questa situazione e' che dal punto di vista di USB avere 32 bit per ogni ID sarebbe stato esattamente identico ad averne 16, mica i device USB spediscono i loro ID via internet, non c'e' alcuno spreco nell'avere degli ID piu' grandi. Sembra idiozia pura, o una volonta' di speculazione... pochi ID magari permettono di far pagare in maniera salata uno spazio tra i Vendor ID.
Non so... sarebbe carino sentire il parere di qualcuno informato sulla questione economica legata all'ottenere un Vendor ID.
Un po' di bit in piu' fanno un sacco di differenza
La riluttanza ad utilizzare abbastanza bit risulta ancora piu' difficile da capire se si pensa che all'aumentare dei bit lo spazio che si ha a disposizione per rappresentare delle entita' non aumenta linearmente ma
aumenta esponenzialmente!
- Con 8 bit si possono rappresentare 256 entita'
- con 16 bit se ne possono rappresentare 65536
- con 32 bit piu' di 4 miliardi
- con 64 bit 18446744073 miliardi
- con N bit due elevato ad N
E cosi' via. Sarebbe bello poter scalare cosi' con altre cose :)
Morale della favola: i bit costano poco, se progettate qualcosa in cui una crescita massiccia non puo' essere esclusa tenetevi larghi ;)