Logo

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.