Base64 neden gerekli? (Neden sadece ikili bir dosyaya e-posta gönderemiyorum)?


30

Base64 kodlamasını okuyordum ve Wikipedia'da buldum:

Base64 kodlama şemaları genellikle, metinsel verilerle uğraşmak üzere tasarlanan medya üzerinde depolanması ve aktarılması gereken ikili verileri kodlamaya ihtiyaç duyulduğunda kullanılır.

... ve verilen örnek, e-posta yoluyla ikili dosyalar göndermektir.

Base64'ün neden gerekli olduğunu anlamaya çalışıyorum. İkili veri bir bayt olduğundan, doğrudan metinsel veri olan ASCII'ye çevrilemez mi? Base64 neden gerekli? Veya e-postanın ASCII’deki kontrol karakterleriyle bir sorunu mu var?


"Doğrudan çevrilebilir" ile ne demek istiyorsunuz? Base64 hangi anlamda "doğrudan" değildir?
David Schwartz

Neden direkt olduğunu düşünüyorsun?
Kurabiye Canavarı

4
Doğrudan olduğunu sandığımdan değil, "doğrudan çevrilebilir" in bir oksimoron olduğunu düşünüyorum. Eğer "direct" bir çeviri işlemi içeriyorsa, base64'ü doğrudan değil yapan nedir? Bu sadece bir çeviri süreci.
David Schwartz

Yanıtlar:


37

Bu konuda iyi bir Wikipedia makalesi var.


ARPAnet tarafından kullanılan en eski NCP yinelemeleri, bayt akışlarından çok bit akışları veya uygun bir bayt boyutu pazarlığı girişimleri gibiydi; 8 bitlik bayt ancak daha sonra standartlaştırıldı. Farklı makinelerde çalışacak dosya aktarım protokolleri oluşturmak birkaç girişimleri de vardı (posta öncelikle olarak, başlangıçta FTP protokolü bir fonksiyonu olduğunu MAILveMLFL komutlar, daha sonra ayrılmıştır OVP , daha sonra SMTP .). Bu makinelerde genellikle farklı karakter kodlamaları vardı - ASCII vs EBCDIC - veya hatta farklı byte boyutları , 8-bit byte vs 6-bit vs ...

Bu nedenle, posta aktarma işlevleri başlangıçta nispeten kısa mesajların düz metin olarak aktarılması için tanımlanmıştır; özellikle, "NVT-ASCII". Örneğin, RFC 772 diyor ki:

POSTA TEMSİLİ VE DEPOLAMA

Posta, gönderen ana bilgisayardaki bir depolama aygıtından alıcı ana bilgisayardaki bir depolama aygıtına aktarılır. İki sistemdeki veri depolama gösterimleri farklı olduğundan, posta üzerinde belirli dönüşümleri gerçekleştirmek gerekebilir. Örneğin, NVT-ASCII farklı sistemlerde farklı veri depolama gösterimlerine sahiptir. PDP-10'lar genellikle NVT-ASCII'yi, 36 bitlik bir kelimeyle sola dayalı, beş adet 7 bitlik ASCII karakter olarak saklar. 360's NVT-ASCII'yi 32 bitlik bir kelimeyle dört adet 8 bitlik EBCDIC kodu olarak saklar. Multics, NVT-ASCII'yi 36 bitlik bir kelimeyle dört 9 bitlik karakter olarak saklar.

Basit olması adına, tüm verilerin MTP'de NVT-ASCII olarak gösterilmesi gerekir. Bu, metinleri iletirken, gönderme ve alma ana bilgisayarlarının birbirine benzememesine bakılmaksızın karakterlerin standart NVT-ASCII temsiline dönüştürülmesi gerektiği anlamına gelir. Gönderen, verileri dahili karakter temsilinden standart 8 bit NVT-ASCII temsiline dönüştürür (bkz. TELNET teknik özellikleri). Alıcı, verileri standart formdan kendi iç formuna dönüştürür. Bu standarda uygun olarak, dizinin bir metin satırının sonunu belirtmek için kullanılması gerekir.

Kablo üzerinden sekiz bit iletilse de, 8. bit genellikle korunma zorunluluğu olmadığı için atılır veya karıştırılır; Aslında bazı protokoller gerekli örneğin ilk olarak, sıfıra ayarlanmış olması 8. biti SMTP RFC aşağıda aktardığı. Başka bir deyişle, yazılım 8-bit temiz değildi .

Veri aktarımı

TCP bağlantısı, 8 bit bayt iletimini destekler. SMTP verileri 7 bitlik ASCII karakterlerdir. Her karakter 8-bit bayt olarak iletilir ve yüksek dereceli bit sıfıra çıkarılır.

Bu, 8 bitlik ISO-8859- # karakter kodlamalarının yaygınlaştırılmasından sonra bile uzun bir süre devam etti. Bazı sunucular zaten 8 bitlik temiz olmasına rağmen, diğerlerinin çoğu değildi ve 8 bitlik verileri kör bir şekilde göndermek karışık mesajlarla sonuçlanacaktı.

Daha sonra, posta sunucularının destekledikleri SMTP uzantılarını bildirmelerini sağlayan "Genişletilmiş SMTP" yayınlandı; bunlardan biri 8BITMIME, alıcı sunucunun 8 bitlik verileri güvenle kabul edebileceğini gösterir. MIME mesajı bölümlerinde, herhangi bir şekilde kodlanmadıklarını belirten " Content-Transfer-Encoding : 8bit" olabilir.

Bununla birlikte, SMTP protokolü hat bazında kalmıştır ve 998 oktet hat sınırına sahiptir ve .aynı zamanda "mesajın sonu" göstergesi olarak bir hat (0D 0A 2E 0D 0A) kullanır. Bu, çoğu ikili dosya değiştirilmeden gönderilebilse de, bu oktet dizisini içeren dosyaların aktarılan mesajın sonu ve dosyanın geri kalanının bir SMTP komutu olarak yorumlanması, muhtemelen zarar görmesi anlamına gelir. Benzer şekilde, 998 oktetten daha uzun bir "çizgi" alıcı sunucu tarafından kesilebilir.

2000 yılında "BINARYMIME" ESMTP uzantısı , RFC 3030 olarak yayınlandı ve ham ikili verilerin SMTP üzerinden aktarılmasına izin verdi. Mesaj şimdi, terminatör olarak kullanılan sıfır uzunluklu bir yığın ile önceden belirtilen uzunlukta parçalar halinde aktarılır ve Base64 ve benzer kodlamalara artık gerek yoktur. Ne yazık ki, birkaç SMTP sunucusu bu uzantıyı desteklemektedir; örneğin, ne Postfix ne de Exim4 EHLO'ya CHUNKINGcevap olarak reklam vermez . BINARYMIME'den yararlanmak için , mesaj yolundaki tüm sunucular tarafından desteklenmesi gerekir , ki bu sadece bir veya ikiden fazla olabilir.

Ayrıca bakınız:


1
Bir kuruluştaki Exchange sunucuları, BDAT komutunu kullanarak ikili olarak e-posta gönderir, ancak bunu kuruluş dışındaki SMTP sunucuları için yapmazlar.
james.garriss

7

Bazı eski e-posta sistemleri ve yazılımlar 8 bit temiz değildi , 8 bit ise kontrol karakteri olarak kullanılıyordu. Bu ikili dosyaları toplamak için yeterliydi, bu yüzden Base64'e (ya da diğer kodlama şemalarına) ihtiyaç vardı.


Öyleyse her bayt için 2 bit boşa mı harcıyoruz, çünkü 90'ların eski e-posta sistemleri mesajı doğru bir şekilde anlayamayabilir. Gmail çağındaki bu eski sistem% 1'den az olabilir. Bir avuç insan için neden bu kadar fazla bant genişliği harcıyoruz diye düşünüyorum. ve Base64 yalnızca postalarla sınırlıdır?
vaibhav.g
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.