Eu estava lendo a codificação Base64 e encontrei isso na Wikipedia:
Os esquemas de codificação Base64 são comumente usados quando há necessidade de codificar dados binários que precisam ser armazenados e transferidos por mídia projetada para lidar com dados de texto.
... e o exemplo dado é o envio de arquivos binários por email.
Estou tentando entender por que base64 é necessário. Como os dados binários são um monte de bytes, não seriam diretamente traduzíveis para ASCII, que são dados textuais? Por que o base64 é necessário? Ou o email tem algum problema com os caracteres de controle em ASCII?
Respostas:
Há um bom artigo da Wikipedia sobre isso.
As primeiras iterações do NCP, usadas pelo ARPAnet, eram mais como fluxos de bits do que fluxos de bytes ou tentativas de negociar um tamanho conveniente de bytes; o byte de 8 bits foi padronizado apenas muito mais tarde. Também houve várias tentativas de criar protocolos de transferência de arquivos que funcionariam em máquinas diferentes (o correio era inicialmente uma função do protocolo FTP, principalmente como os comandos
MAIL
eMLFL
, depois dividido em MTP , depois em SMTP ). Essas máquinas geralmente tinham codificações de caracteres diferentes - ASCII vs EBCDIC - ou mesmo tamanhos de bytes diferentes, bytes de 8 bits e 6 bits ...Portanto, as funções de transferência de email foram definidas inicialmente para transferir mensagens relativamente curtas em texto sem formatação; especificamente, "NVT-ASCII". Por exemplo, o RFC 772 diz:
Embora oito bits estivessem sendo transmitidos pelo cabo, o oitavo bit costumava ser descartado ou confundido, pois não havia necessidade de preservá-lo; de fato, alguns protocolos exigiam que o 8º bit fosse definido como zero, como o RFC SMTP inicial, conforme citado abaixo. Em outras palavras, o software não estava limpo em 8 bits .
Isso persistiu por um longo tempo, mesmo depois que as codificações de caracteres ISO-8859- # de 8 bits se espalharam. Embora alguns servidores já estivessem limpos em 8 bits, muitos outros não estavam, e o envio cego de dados em 8 bits resultaria em mensagens confusas.
Posteriormente, foi publicado o "SMTP estendido" , permitindo que os servidores de correio declarassem extensões SMTP suportadas; uma delas era
8BITMIME
, indicando que o servidor de recebimento podia aceitar com segurança dados de 8 bits. As partes da mensagem MIME podem ter " Content-Transfer-Encoding : 8bit", indicando que não são codificadas de forma alguma.No entanto, o protocolo SMTP permaneceu baseado em linha e possui o limite de 998 octetos, além de usar uma
.
linha (0D 0A 2E 0D 0A) como o indicador "fim da mensagem". Isso significa que, embora a maioria dos arquivos binários possa ser enviada inalterada, ainda é possível que os arquivos que contenham essa sequência de octetos sejam interpretados como o final da mensagem transferida e o restante do arquivo como um comando SMTP, possivelmente causando danos. Da mesma forma, uma "linha" com mais de 998 octetos pode ser cortada pelo servidor de recebimento.Em 2000, a extensão ESMTP "BINARYMIME" foi publicada como RFC 3030 , permitindo transferências de dados binários brutos por SMTP. A mensagem agora é transferida em pedaços de comprimento pré-indicado, com um pedaço de comprimento zero usado como terminador, e Base64 e codificações similares não são mais necessárias. Infelizmente, poucos servidores SMTP suportam essa extensão; por exemplo, nem o Postfix nem o Exim4 anunciam
CHUNKING
em resposta ao EHLO. Para tirar proveito do BINARYMIME, ele teria que ser suportado por todos os servidores no caminho da mensagem, que pode ser mais do que apenas um ou dois.Veja também:
fonte
Alguns sistemas e softwares de email mais antigos não estavam limpos em 8 bits , o 8º bit foi usado como um caractere de controle. Isso foi o suficiente para ocultar arquivos binários, portanto, o Base64 (ou outros esquemas de codificação) era necessário.
fonte