Resumo
- Com
STRU ReMODE S, o FTP usava um byte de todos uns como escape: seguido de 1 era EOR, de 2 era EOF e de 3 encerrava registro e arquivo juntos. - Quando o byte reservado pertencia aos dados, ele era repetido. A recepção precisava manter contexto negociado e estado entre leituras para desfazer a citação corretamente.
- BLOCK e COMPRESSED codificavam as mesmas fronteiras em descritores. Registro, linha, segmento TCP e chamada de leitura eram camadas distintas.
A resposta estava no byte seguinte
Dois bytes consecutivos de todos uns não eram duas ordens. Depois da decodificação, restava um único byte literal. RFC 765 e RFC 959 reservaram a primeira ocorrência como escape e usaram a repetição para devolver o mesmo valor aos dados.
Se a segunda posição tivesse valor 1, a dupla marcava fim de registro; valor 2, fim de arquivo; valor 3, os dois finais no mesmo ponto. A sentinela isolada não resolvia nada. Seu sentido dependia da continuação e do STRU R escolhido antes.
Esse detalhe torna visível uma diferença que hashes simples escondem. O fluxo transferido pode ter mais bytes que o arquivo reconstruído sem compressão ou erro. Cada sentinela literal ocupa duas posições na conexão e uma no resultado.
A ordem do fluxo não fornecia a divisão do arquivo
O FTP separava estrutura e modo. STRU F descrevia um arquivo contínuo; STRU R, uma sequência de registros. MODE S dizia como a representação passaria pela conexão de dados.
Uma entrega confiável e ordenada não informa onde termina um registro da origem. Por isso todos os EOR eram explícitos, inclusive o último. O remetente convertia seu marcador local para a convenção FTP; o destinatário convertia a convenção comum para uma forma que seu sistema pudesse armazenar.
Um contador interno de um host orientado a registros não era portátil. O protocolo compartilhava a posição da fronteira, sem exigir que sistemas diferentes copiassem o mesmo arranjo de disco.
Quatro continuações, quatro resultados
O analisador entregava bytes comuns diretamente. Ao encontrar a sentinela, entrava num estado pendente. A continuação fazia uma entre quatro coisas: emitia um dado literal, gerava EOR, gerava EOF ou gerava os dois.
O controle combinado evitava inventar um registro vazio depois do último. A duplicação garantia que nenhum valor possível fosse banido do arquivo. Controle inserido e dados continuavam separáveis e reversíveis.
Ver a sentinela e cortar o registro imediatamente corrompe o literal. Guardar as duas cópias como dados também corrompe. É preciso registrar separadamente bytes brutos, bytes reconstruídos e eventos de estrutura.
O par podia atravessar duas leituras
RFC 9293 define TCP como serviço de fluxo de bytes confiável e ordenado. Ele não entrega registros FTP e não promete que uma chamada de recepção coincide com uma unidade da aplicação.
Assim, uma leitura pode terminar na sentinela e a seguinte trazer o discriminador. A dupla também pode chegar junta. Os dois casos têm o mesmo sentido. Usar bordas de pacote, segmento ou buffer como EOR fabrica uma estrutura dependente do receptor.
Uma conexão fechada com escape pendente contém uma representação incompleta, ainda que tudo o que veio antes tenha chegado sem perda. A máquina de estados faz parte da integridade.
Em STRU F, todos os bytes voltavam a ser dados
Sob STRU F + MODE S, o encerramento da conexão de dados indicava EOF e todos os bytes eram dados. O valor de todos uns não abria código algum.
Logo, os octetos capturados não bastam. Sem a linha do tempo de STRU e MODE, não se sabe se duas sentinelas viram um dado, permanecem dois dados, ou se outra dupla cria uma fronteira.
O próprio fechamento tem evidência diferente. Para estrutura de arquivo ele fornece EOF. Para estrutura de registros, o EOR final precisa aparecer explicitamente. “Conexão concluída” não prova sozinho que o mapa de registros terminou bem.
Outros modos guardaram a fronteira em descritores
No BLOCK, cada bloco era precedido por contagem e bits de descrição. Um bit indicava EOR, outro EOF, e ambos podiam coexistir. Outros bits tratavam dado suspeito e marcador de reinício.
O COMPRESSED também usava descritores para EOR/EOF, além de formas para dados replicados e preenchimento. O sentido da fronteira permanecia, mas sua representação dependia de MODE.
Duas codificações brutas diferentes podem reconstruir o mesmo mapa. Os mesmos bytes podem significar outra coisa quando os parâmetros mudam. Evidência sólida une negociação, fluxo original e estrutura decodificada.
Quebra de linha e fim de registro não eram sinônimos
Sem estrutura de registros, textos ASCII podiam usar CRLF para linha e EBCDIC, NL. Com STRU R, o EOR era um marcador próprio.
Em arquivos de uma linha por registro, os dois parecem equivalentes. Mas um registro pode conter várias linhas, e um fim de linha pode ser apenas apresentação. Converter EOR automaticamente em newline produz algo legível e ainda assim altera a origem.
RFC 959 exigia aceitação de registros para texto ASCII/EBCDIC e buscava transformações úteis e reversíveis entre hosts orientados a arquivo e a registro. A prova era a capacidade de recuperar a divisão original, não a aparência do texto.
O requisito posterior ficou mais realista
RFC 1123 tornou a estrutura de registros obrigatória apenas nos hosts cujo sistema de arquivos a suportasse. Outros ainda podiam aceitar STRU R e registrar literalmente o fluxo.
Preservar a codificação pode permitir recuperação futura, mas não demonstra que aplicações locais receberam registros nativos. Reconstruir, arquivar, achatar e recusar são resultados diferentes e precisam de nomes diferentes.
RFC 5797 e o registro IANA de comandos FTP mantêm STRU e MODE no vocabulário base. O registro não testa o argumento R, o estado entre leituras ou a volta após armazenamento.
A prova inclui a interpretação
Um registro defensável guarda TYPE, STRU, MODE, hashes do fluxo e dos dados, comprimentos, posições EOR/EOF, fechamento, estado final do parser e resultado da reconstrução.
Canários devem dividir o par entre leituras, cercar cada controle com sentinelas literais duplicadas e comparar STREAM e BLOCK para o mesmo mapa. Escape pendente, discriminador impossível, EOR final ausente ou estado mantido após mudar MODE são falhas semânticas.
O byte apareceu duas vezes para que o protocolo pudesse reservar controle sem expulsar um dado legítimo. A reversibilidade dependia de conservar o contexto inteiro.
Fontes
Briefing para membros
Contexto aprofundado do perfil
Faça login com o nível de assinatura correto para desbloquear o briefing completo e as notas das fontes.
Apenas para Strategic Circle
Strategic Circle
Aberto a todos os leitores. Desbloqueie Briefings de perfil após se inscrever e fazer login.
Junte-se ao Strategic CircleSomente para Leadership Alliance
Leadership Alliance
Para proprietários e gestores qualificados de ativos de PI; faça login para desbloquear os briefings da Leadership Alliance.
Junte-se ao Leadership Alliance
