Portál AbcLinuxu, 1. května 2025 03:28
Jenom připomínka: nevyužiji. Vypadá to dost blbě...Cože?
odporucam pozriet si zdrojaky wgetu a pripadnu "zamenu dat" opravit
to, za aria2 robi checksumy, to je u bittorent klienta nutne . pre ftp/http ti to nepomoze.
Garantovat nijak. Ale checksum v hlavičce TCP paketu nebu úplně omylem… A aby se změnila data paketu i 16bitový checksum tak, aby seděl, to by byla docela náhoda, ne?
Na to vám typicky stačí v paketu invertovat dva bity na stejné pozici modulo 16 bitů. Než začnete pronášet podobně radikální soudy, račte si zjistit, jak se ten kontrolní součet počítá. Pak si uvědomte, kolik paketů je potřeba na přenesení 10 GB dat, a zkuste aplikovat základní poučky teorie pravděpodobnosti…
Ani jednou jsem se s něčím takovým nesetkal u souboru staženého najednou.
Já ano, dvakrát. V obou případech se jednalo o image CD, tj. soubory o velikosti 600-700 MB. Samozřejmě je pravděpodobné, že něco podobného se stane i u krátkých souborů - jenže když se vám na webové stránce změní jedno písmenko, pravděpodobně si toho vůbec nevšimnete. A pokud ano, nenapadne vás podezírat kontrolní součty TCP.
/usr/portage/distfiles
má 1 až 2 GB, krát čtyři počítače, všechno stahováno wgetem, kontrolní součty souborů se tam kontrolují a v těch několika případech, kdy kontrolní součet neseděl, nikdy nebylo chybně pár bitů.
Takže asi mám obrovské štěstí, že jsem se ještě nesetkal s chybou, kterou by některá z vrstev síťových protokolů neodchytila. Nebo kombinace různých kontrolních součtů na různých úrovních protokolů a kvality ppřenosových cest je natolik robustní, že se pro běžné použití nevyplatí nějakou chybu očekávat.
I ty vaše dva vadné obrazy CD bych spíš přisoudil nějakému nedorozumění mezi serverem a klientem, než pokaženému TCP streamu. Samozřejmě nevylučuju, že jste HTTP provoz při stahování sledoval, víte, že to stahování nebylo přerušeno a následně jste si ověřil, že v obraze jsou chybné jeden nebo dva bity. Pak bych připustil, že máte hroznou smůlu, když se vám to podařilo už dvakrát Samozřejmě nevylučuju, že jste HTTP provoz při stahování sledoval, víte, že to stahování nebylo přerušeno
Poznat to na výstupu wgetu není zase tak těžké…
a následně jste si ověřil, že v obraze jsou chybné jeden nebo dva bity
Samozřejmě jsem se snažil zjistit, jak ta chyba vypadá. Chybné bity byly lokalizovány natolik blízko sobě, že mohly být v jednom paketu, a zároveň tak, že by je kontrolní součet TCP pravděpodobně neodhalil.
Priklad: kod vie opravit 1 chybny bit a detekovat 2 chybne bity z 16bitovej spravy.
ak sa pokazi bitov viac, moze sa stat aj situacia, ze "opravi" spravny bit na nespravny
x
nedošlo k žádné chybě. Ono x
si lze libovolně zvolit a v praxi bude nejspíš voleno dostatečně malé x
(ne x=0,01
jako u aktuálního startu raketoplánu). Tipnul bych si, že vyhrát ve sportce bude daleko pravděpodobnější, než vyhrát vadný bit v TCP Tipnul bych si, že vyhrát ve sportce bude daleko pravděpodobnější, než vyhrát vadný bit v TCP
Už jste se místo tipování podíval, jak se ten checksum v TCP hlavičce počítá? Podle toho, co píšete, asi ne. Nezapomínejte také, že ten algoritmus byl zvolen před nejméně pětadvaceti lety (RFC 793 je datováno září 1981), kdy bylo množství přenášených dat o několik řádů nižší než dnes. Koneckonců, pokud si dobře vzpomínám, ještě v první polovině devadesátých let veškerou zahraniční konektivitu Československa obstarávala jedna 64 Kb/s linka. Je tak těžké si představit, že tvůrci TCP podcenili rozvoj Internetu stejnou měrou, jakou to udělali, když zvolili 32-bitovou adresu (a ještě s třídními delegacemi)?
Množství přenesených dat nemá na pravděpodobnost chyby v jednom bitu vliv.
To jistě ne. Ale že pravděpodobnost výskytu chyby při přenosu 650 MB dat je poněkud vyšší než pravděpodobnost výskytu chyby při přenosu 60 KB dat, to mi, doufám, vymlouvat nechcete.
rsync operuje nad sadou souborů, nedělá binární diffy (takže by ten soubor přenesl celej)Není pravda.
The recipient splits its copy of the file into fixed-size non-overlapping chunks, say of size S, and computes two checksums for each chunk: the MD4 hash, and a weaker 'rolling checksum'. It sends these checksums to the sender. The sender computes the rolling checksum for every chunk of size S in its own version of the file, even overlapping chunks. … The sender then compares its rolling checksums with the set sent by the recipient to determine if any matches exist. If they do, it verifies the match by computing the MD4 checksum for the matching block and by comparing it with the MD4 checksum sent by the recipient. The sender then sends the recipient those parts of its file that didn't match any of the recipient's blocks, along with assembly instructions on how to merge these blocks into the recipient's version to create a file identical to the sender's copy. If the sender's and recipient's versions of the file have many sections in common, the utility needs to transfer relatively little data to synchronise the files.rsync features
rsync remote:/cesta/k/souboru /cestaúk/souborursync si zjistí, že cílový soubor už existuje a tedy jen porovná změny oproti verzi na vzdáleném počítači.
wget
, protože kontrolní mechanismy TCP protokolu jsou dostatečně neprůstřelné, aby si, až se jim opět stáhne soubor s chybou, zkusili dodatečně porovnat onu chybnou verzi se správnou. Asi budete dost překvapeni…
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.