Capitolo 2 Percorso di caricamento: suddivisione, concorrenza e ripristino (chiave)
Dal lato del caricamento, l’obiettivo è avvicinarsi il più possibile alla “saturazione della larghezza di banda” in reti fluttuanti, limitando al minimo il costo dei guasti (ritrasmettere solo i blocchi falliti). Insieme, questi due obiettivi spiegano in gran parte perché i caricamenti sembrano più veloci.
2.1 Spezzatura
- Il client DEVE dividere il file in più parti; un pezzo è l'unità minima per il caricamento/riprova.
- I blocchi DOVREBBERO utilizzare una dimensione fissa (o una politica di dimensione per file) per semplificare la pianificazione della concorrenza e la rappresentazione dello stato.
- Vantaggio immediato: qualsiasi errore riguarda solo un blocco, non l'intero file.
2.2 Caricamento parallelo
Lo scopo della concorrenza non è “più thread”, ma evitare tre limitazioni pratiche di una singola connessione nelle reti reali:
- Avvio lento e crescita della finestra: una singola connessione aumenta lentamente, soprattutto con un RTT tra regioni elevato.
- Tremolio del collegamento: il jitter su una connessione può ridurre la velocità complessiva; la concorrenza attenua l'effetto.
- Modellazione per flusso: alcune reti limitano un singolo flusso; più flussi possono avvicinarsi al limite della larghezza di banda (entro i vincoli di conformità).
- Il client DOVREBBE utilizzare una concorrenza limitata (ad esempio, 4–12) e abbassarla sui dispositivi più deboli per evitare picchi di memoria.
- Il client PUÒ adattare la concorrenza: aumentare quando aumenta il throughput; diminuire quando il tasso di errore aumenta.
2.3 Idempotenza e riprova
- I caricamenti ripetuti dello stesso pezzo DEVONO essere idempotenti: gli invii duplicati non devono corrompere uno stato già completato.
- Il server DOVREBBE imporre l'unicità con (transferId, fileId, ChunkIndex) o un vincolo equivalente.
- Il client DEVE implementare tentativi di backoff esponenziale; i fallimenti DOVREBBERO riprovare solo i blocchi falliti.
2.4 Caricamento ripristinabile
- Il server DEVE essere in grado di rispondere “quali blocchi sono già caricati”, in modo che il client possa saltare quelli completati.
- Il set caricato DOVREBBE essere rappresentato come bitmap/set di intervalli per evitare che la dimensione dello stato cresca linearmente con il conteggio dei blocchi.
- Vantaggio in termini di velocità: dopo interruzioni di rete, arresti anomali del browser o cambi di rete, la ripresa non si riavvia dallo 0%.
2.5 “Condividi durante il caricamento” (facoltativo)
- Il sistema PUÒ generare un identificatore di trasferimento utilizzabile e un collegamento di condivisione mentre il caricamento è ancora in corso per accelerare i flussi di lavoro di consegna.
- Se la condivisione è consentita prima del completamento del caricamento, DEVE essere esplicito ciò che vedono i destinatari: il contenuto incompleto non è ancora scaricabile o viene mostrato solo lo stato di avanzamento.