O arquivo copiado pela rede difere do original

0

Tendo movido uma grande quantidade de dados (~ 1TB) pela rede de um armazenamento para outro, notei que o arquivo no sistema de destino é diferente do original.

Configuração: PC (Windows 7 64) com o Compartilhamento do Windows - & gt; Rede 1000BaseT 2x 1G switch - & gt; PC (Windows XP) como cliente do Windows Sharing ou NAS com Windows Sharing (provavelmente Samba?) - & gt; Rede 1000BaseT 1x 1G switch - & gt; PC (Windows 7 64) como cliente do Windows Sharing

Procedimento: Copiar de compartilhamento com o Total Commander - nenhum erro relatado - & gt; Sincronizar dirs em Total Commanded (comparar por conteúdo) - alguns arquivos são diferentes - & gt; Total Diff do Comandante (clique duas vezes na saída Sincronizar dirs) - alguns arquivos marcados como diferentes mostram a diferença, e alguns deles são reportados como sendo os mesmos desta vez. Eu tentei PC-PC e PC-NAS e ambos são os mesmos.

Eu examinei um dos arquivos (~ 60GB um) e parece que as diferenças são sempre único byte com valor 0 no original e 128 no alvo. Eles estão espalhados aleatoriamente por todo o arquivo, cerca de 10 deles. Repetindo o diff mostra alguns deles persistirem e alguns deles são alterados, mas há aproximadamente a mesma quantidade deles.

EDIT: Para responder a suspeita de syneticon-dj sobre TC, eu tenho que observar que eu escrevi um aplicativo C # simples que lê dois arquivos usando o .NET API e compara-os byte por byte. Foi assim que obtive a informação do diff no parágrafo anterior.

Parece que a transferência de rede falha um bit em cada 6 gigabytes ou mais. Como isso é possível? Isso é comportamento normal? Como é que passa as somas de verificação ao nível do TCP? Como posso saber o que está errado e o que deve ser substituído?

EDIT: Se a transferência de rede é diferente de ser a causa de erros, qual poderia ser a causa real?

Jan Svab
fonte
Parece que isso está sendo migrado para a SU. Mas eu posso responder isso, não é normal perder um único bit de dados e muito menos bytes inteiros.
Chris S
Eu consideraria isso suficientemente relacionado à rede para ficar aqui. Eu não esperaria que o pessoal da SU tivesse muito conhecimento dos detalhes do protocolo ou dos algoritmos de soma de verificação.
Na verdade, não acho que o funcionamento interno dos protocolos de rede seja meu interesse principal, estou mais interessado em resolver o problema e conseguir copiar dados sem perder. Então talvez seja realmente uma pergunta do usuário e eu realmente postei no fórum errado. Eu sou capaz de movê-lo, ou tem algum administrador para fazer isso?

Respostas:

3

Eu preferiria suspeitar de um bug no recurso "comparar por conteúdo" dos TCs e verificar novamente usando a geração de soma de verificação local para os arquivos em ambos os lados usando algo como Hashes MD5 ou SHA-1 e comparando as somas de verificação visualmente.

Algum raciocínio

Um quadro Ethernet possui uma soma de verificação CRC de 32 bits por quadro. TCP adiciona uma soma de verificação CRC de 16 bits. Um pacote defeituoso com um erro de bit único passando em ambas as somas de verificação seria menos provável do que para uma única verificação CRC de 32 bits (2 ^ -32), mas mais provável do que o produto de ambas as probabilidades (2 ^ -16 * 2 ^ - 32 = 2 ^ -48). Onde exatamente, depende das características dos algoritmos.

Supondo um tamanho de carga útil de 1.400 Bytes (ou seja, se você não estiver usando Jumbo Frames) e arredondando-o para 2048 bytes para cálculos mais fáceis, significaria um erro a cada 2 ^ 42 a 2 ^ 58 Bytes (5,4 Terabytes a 250 Petabytes) se cada quadro transmitido tiver um erro de byte único .

Isso, no entanto, certamente seria notado de outra forma - uma taxa de falhas de checksum de CRC tão altas virtualmente apagaria suas transmissões de Ethernet - você obteria taxas de transferência extremamente baixas para sua cópia de arquivo. E você poderá ver muitas falhas de verificação de CRC nos contadores de portas RMON dos switches gerenciados.

Assim, dada a natureza do seu erro, parece bastante improvável que seja um erro de transmissão - estes também pareceriam consideravelmente mais aleatórios.

syneticon-dj
fonte
Obrigado pela explicação, parece estar correto. No entanto, isso explica porque NÃO é causado por checksums errados, mas não explica quaisquer outras causas possíveis ou como lidar com a situação.
Eu sinto que é altamente improvável que seja um bug no TC, corrupção de dados durante a cópia seria um bug que é difícil de codificar :)
Balázs Pozsár
Voltei a este problema depois de um tempo e tenho que confirmar que foi realmente um erro na comparação do TC por conteúdo no meu caso. Ele falha em arquivos grandes. Eu não tenho certeza porque, mas eu acho que é algo que não é para ser usado, talvez algum limite de memória ou algo assim. Se você usar a comparação de arquivos do TC em dois arquivos de texto com linhas muito longas, isso marcará todas as linhas longas como diferentes (mesmo as correspondentes), provavelmente pelo mesmo motivo.
Jan Svab
2

Eu suspeitaria de má memória em qualquer uma das máquinas. Por favor corra memtest86 em ambos.

Balázs Pozsár
fonte
Eu não acho que seja uma razão possível. Eu posso ver o mesmo problema em pelo menos quatro máquinas (dois desktops, laptop e um NAS) na mesma rede. Nenhum deles mostra nenhum outro sinal de falha no chip de memória. No entanto, vou tentar o memtest, mas não espero que mostre nada.
Jan Svab
Por favor, faça isso, estou realmente interessado nos resultados, porque não consigo imaginar que seja um problema de rede
Balázs Pozsár
0

O checksum IP é um CRC de 16 bits. Você pode esperar que aproximadamente 1 em 65k pacotes corrompidos passem. Se você está fazendo grandes transferências de arquivos, provavelmente é melhor usar uma copiadora de arquivos dedicada, usando somas de verificação criptográficas em blocos menores. Como, digamos, executar MD5 e SHA1 com mais de 1 MB, retransmitindo um pedaço se um ou ambos os checksums forem diferentes.

O tamanho do bloco sugerido (1 MB) é mais significativo do que determinado pela engenharia sólida, se você estiver vendo um erro aproximadamente a cada 6 GB, isso levaria a um aumento total no tráfego de aproximadamente 0,1%.


fonte
"copiadora usando checksums criptográficos" - como, por exemplo, um dos muitas aplicações baseadas em rsync .
David Cary
Então o ponto é: "é um comportamento normal e pode ser esperado". Mas como você determinou o número 1 de 65k pacotes corrompidos?
CRC de 16 bits deve capturar todos Erros de bit único por pacote, não apenas todos, mas 1 de 2 ^ 16.
David Cary