Tại sao Base64 lại cần thiết (còn gọi là tại sao tôi không thể gửi email tệp nhị phân)?


30

Tôi đã đọc mã hóa Base64 và tìm thấy cái này trên Wikipedia:

Các lược đồ mã hóa Base64 thường được sử dụng khi có nhu cầu mã hóa dữ liệu nhị phân cần lưu trữ và chuyển qua phương tiện được thiết kế để xử lý dữ liệu văn bản.

... và ví dụ đưa ra là gửi tệp nhị phân qua email.

Tôi đang cố gắng để hiểu tại sao Base64 là cần thiết. Vì dữ liệu nhị phân là một bó byte, nên nó có thể được dịch trực tiếp sang ASCII, đó là dữ liệu văn bản không? Tại sao Base64 lại cần thiết? Hay email có vấn đề với các ký tự điều khiển trong ASCII?


Bạn có ý nghĩa gì bởi "trực tiếp dịch"? Theo nghĩa nào thì base64 không "trực tiếp"?
David Schwartz

Tại sao bạn nghĩ rằng nó trực tiếp?
Cookie Monster

4
Không phải tôi nghĩ nó trực tiếp, mà tôi nghĩ "dịch trực tiếp" là một oxymoron. Nếu "trực tiếp" có thể bao gồm một quy trình dịch thuật, vậy thì điều gì làm cho base64 không trực tiếp? Đó chỉ là một quá trình dịch thuật.
David Schwartz

Câu trả lời:


37

Có một bài viết Wikipedia tốt về điều này.


Các lần lặp đầu tiên của NCP được ARPAnet sử dụng giống như các luồng bit hơn là các luồng byte hoặc cố gắng đàm phán kích thước byte thuận tiện; byte 8 bit chỉ được chuẩn hóa vào nhiều sau này. Cũng có một số nỗ lực trong việc tạo các giao thức truyền tệp sẽ hoạt động trong các máy khác nhau (thư ban đầu là một chức năng của giao thức FTP, chủ yếu là các lệnh MAILMLFL , sau đó được phân tách thành MTP , sau này là SMTP .). Những máy đó thường có mã hóa ký tự khác nhau - ASCII so với EBCDIC - hoặc thậm chí kích thước byte khác nhau, byte 8 bit so với 6 bit so với ...

Do đó, chức năng chuyển thư ban đầu được xác định để chuyển thư tương đối ngắn trong văn bản thuần túy; cụ thể là "NVT-ASCII". Ví dụ: RFC 772 nói:

ĐẠI DIỆN VÀ BẢO QUẢN

Thư được chuyển từ thiết bị lưu trữ trong máy chủ gửi đến thiết bị lưu trữ trong máy chủ nhận. Có thể cần phải thực hiện các chuyển đổi nhất định trên thư vì các biểu diễn lưu trữ dữ liệu trong hai hệ thống là khác nhau. Ví dụ, NVT-ASCII có các biểu diễn lưu trữ dữ liệu khác nhau trong các hệ thống khác nhau. PDP-10 thường lưu trữ NVT-ASCII dưới dạng năm ký tự ASCII 7 bit, được căn trái trong một từ 36 bit. 360 lưu trữ NVT-ASCII dưới dạng bốn mã EBCDIC 8 bit trong một từ 32 bit. Multics lưu trữ NVT-ASCII dưới dạng bốn ký tự 9 bit trong một từ 36 bit.

Để đơn giản, tất cả dữ liệu phải được trình bày trong MTP dưới dạng NVT-ASCII. Điều này có nghĩa là các ký tự phải được chuyển đổi thành biểu diễn NVT-ASCII tiêu chuẩn khi truyền văn bản, bất kể máy chủ gửi và nhận có giống nhau hay không. Người gửi chuyển đổi dữ liệu từ biểu diễn ký tự bên trong của nó sang biểu diễn NVT-ASCII 8 bit tiêu chuẩn (xem thông số kỹ thuật của TELNET). Người nhận chuyển đổi dữ liệu từ dạng chuẩn sang dạng bên trong của chính nó. Theo tiêu chuẩn này, trình tự nên được sử dụng để biểu thị sự kết thúc của một dòng văn bản.

Mặc dù tám bit được truyền qua dây, bit thứ 8 thường sẽ bị loại bỏ hoặc xáo trộn, vì không có yêu cầu bảo quản nó; trong thực tế, một số giao thức yêu cầu bit thứ 8 được đặt thành 0, chẳng hạn như RFC SMTP ban đầu như được trích dẫn dưới đây. Nói cách khác, phần mềm không sạch 8 bit .

Truyền dữ liệu

Kết nối TCP hỗ trợ truyền các byte 8 bit. Dữ liệu SMTP là các ký tự ASCII 7 bit. Mỗi ký tự được truyền dưới dạng một byte 8 bit với bit thứ tự cao bị xóa thành 0.

Điều này tồn tại trong một thời gian dài ngay cả sau khi mã hóa ký tự ISO-8859- # 8 bit trở nên phổ biến. Mặc dù một số máy chủ đã sạch 8 bit, nhưng nhiều máy khác thì không, và việc gửi dữ liệu 8 bit một cách mù quáng sẽ dẫn đến tin nhắn bị sai lệch.

Sau đó, "Extended Extended" đã được xuất bản, cho phép các máy chủ mail khai báo các phần mở rộng SMTP mà họ hỗ trợ; một trong số đó là 8BITMIME, chỉ ra rằng máy chủ nhận có thể chấp nhận dữ liệu 8 bit một cách an toàn. Các phần thông báo MIME có thể có " Mã hóa chuyển nội dung : 8 bit", cho biết rằng chúng không được mã hóa theo bất kỳ cách nào.

Tuy nhiên, giao thức SMTP vẫn dựa trên dòng và có giới hạn dòng octet 998, cũng như sử dụng một .dòng (0D 0A 2E 0D 0A) làm chỉ báo "kết thúc tin nhắn". Điều này có nghĩa là mặc dù hầu hết các tệp nhị phân có thể được gửi không bị thay đổi, nhưng vẫn có khả năng các tệp chứa chuỗi octet này sẽ được hiểu là phần cuối của tin nhắn được chuyển và phần còn lại của tệp là lệnh SMTP, có thể gây ra thiệt hại. Tương tự, một "dòng" dài hơn 998 octet có thể bị cắt bởi máy chủ nhận.

Năm 2000, tiện ích mở rộng ESMTP "BINaryMIME" đã được xuất bản với tên RFC 3030 , cho phép chuyển dữ liệu nhị phân thô qua SMTP. Thông báo hiện được chuyển theo từng đoạn có độ dài được chỉ định trước, với một đoạn có độ dài bằng không được sử dụng làm dấu kết thúc, và mã hóa Base64 & tương tự không còn cần thiết nữa. Thật không may, rất ít máy chủ SMTP hỗ trợ phần mở rộng này; ví dụ, cả Postfix và Exim4 đều không quảng cáo CHUNKINGkhi trả lời EHLO. Để tận dụng lợi thế của BINARYMIME, nó sẽ phải được hỗ trợ bởi tất cả các máy chủ trong đường dẫn tin nhắn, có thể nhiều hơn chỉ một hoặc hai.

Xem thêm:


1
Trao đổi máy chủ trong một tổ chức gửi email dưới dạng nhị phân bằng lệnh BDAT, nhưng họ không làm điều này cho các máy chủ SMTP bên ngoài tổ chức.
james.garriss

7

Một số hệ thống và phần mềm e-mail cũ không sạch 8 bit, bit thứ 8 được sử dụng làm ký tự điều khiển. Điều này là đủ để làm hỏng các tệp nhị phân, do đó Base64 (hoặc các sơ đồ mã hóa khác) là cần thiết.


Vì vậy, chúng ta đang lãng phí 2 bit cho mỗi byte chỉ vì một số hệ thống email kế thừa của thập niên 90 có thể không thể hiểu chính xác thư. Các hệ thống cũ này trong kỷ nguyên của gmail có thể ít hơn 1%. Tôi đang nghĩ tại sao chúng ta lãng phí quá nhiều băng thông cho một số ít người? và Base64 chỉ giới hạn trong thư?
vaibhav.g
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.