Чому так багато інтернет-протоколів на основі тексту?


47

Як я знайшов, дуже велика кількість протоколів, які подорожують по Інтернету, є "текстовими", а не двійковими. Протоколи, про які йдеться, включають HTTP, SMTP, FTP (я думаю, це все на основі тексту?), WHOIS, IRC.

Насправді, деякі з цих протоколів стрибають через обручі, коли вони хочуть передавати двійкові дані .

Чи є причина в цьому? Текстові протоколи, очевидно, мають дещо накладні витрати, оскільки їм потрібно надсилати більше даних для передачі однакового обсягу інформації (див. Приклад нижче). Які переваги переважують це?


Під текстом я маю на увазі, що більшість символів, що використовуються в протоколі, знаходяться між 0x20(пробіл) і 0x7E( ~), при цьому випадкові "спікальні символи" використовуються для особливих цілей , таких як нові рядки, null, ETX та EOT. Це протилежне передачі необроблених, двійкових даних через з'єднання.

Наприклад, передача цілого числа 123456як тексту передбачала б надсилання рядка 123456(представленого в шістнадцятковій формі 31 32 33 34 35 36), тоді як 32-бітове бінарне значення буде надіслано як (представлене в шістнадцятковій формі) 0x0001E240(і, як бачите, "містить" спеціальний нульовий символ .


3
З 5 згаданих протоколів HTTP, SMTP, WHOIS та IRC були в основному задумані для обміну текстовими даними.
el.pescado

4
Зауважте, що HTTP / 2 - це двійковий протокол.
isanae

4
Ви здебільшого маєте на увазі протоколи додатків та презентаційного рівня . Протоколи нижчого рівня (TCP, IP, Ethernet) майже завжди двійкові.
Нік Т

2
FTP має двійковий режим, який було досить важливо використовувати при передачі бінарних файлів, оскільки звичайний режим передачі у багатьох клієнтів переписував би закінчення рядків у відповідність до конвенції хосту, яка б пошкодила двійкові файли при передачі між хостами з різними закінченнями рядків. Цей двійковий режим був лише для передачі файлів і не впливав на командні речі.
Кейсі

2
FTP фактично використовує два мережеві з'єднання, одне текстове (командний канал) та одне бінарне (канал даних).
Псевдонім

Відповіді:


40

Коли світ був молодшим, а комп’ютери не були всім прославленими ПК, розміри слів варіювались (у DEC 2020 році у нас тут було 36 розрядних слів), формат бінарних даних був суперечливим питанням (великий ендіан проти маленького ендіана і навіть більш дивний порядки бітів були досить поширеними). Немало консенсусу щодо розміру / кодування символів (ASCII, EBCDIC були основними претендентами; наш DEC мав 5/6/7/8 кодувань / символів). ARPAnet (попередник Інтернету) був розроблений для підключення машин будь-якого опису. Загальним знаменником був (і досі є) текст. Ви можете бути впевнені, що 7-розрядний закодований текст не буде забруднений базовими засобами для передачі даних (ще зовсім недавно надсилання електронної пошти в якомусь 8-бітовому кодуванні несе гарантію, що одержувач отримає пошкоджені повідомлення,

Якщо ви копаєтесь, наприклад, в описах протоколу telnet або FTP (перші протоколи Інтернету, тоді мережева ідея полягала в віддаленому підключенні до "суперкомп'ютера" і перетасовування файлів сюди і назад), ви бачите, що з'єднання включає переговори безлічі деталей ми вважаємо рівномірним,

Так, бінарне було б (трохи) ефективнішим. Але машини та спогади (а також мережі) надзвичайно виросли, тож трохи криптовалюта років - це минуле (в основному). І ніхто з розумом не запропонує зірвати всі існуючі протоколи, щоб замінити їх бінарними. Крім того, текстові протоколи пропонують дуже корисну техніку налагодження. Сьогодні я ніколи не встановлюю сервер telnet (краще використовувати зашифрований протокол SSH для віддалених з'єднань), але доводиться клієнту telnet зручно "говорити" на якомусь помилковому сервері, щоб з'ясувати корчі. Сьогодні ви, мабуть, використовуєте netcat або ncat для обміну навколо ...


10
Також значно покращується простота усунення несправностей. Читати захоплення пакетів досить складно, це ще гірше, коли програми не надсилають повідомлення у форматі, прочитаному людиною.
Нанбан Джим

5
"І ніхто з розумом не запропонує вилучити всі існуючі протоколи, щоб замінити їх бінарними", - швидше, ви домовляєтеся про свій шлях від текстових протоколів до того, що, на вашу думку, краще, як від HTTP до того, що було Стиснення заголовка запиту SPDY і тепер є частиною HTTP / 2. Або, з цього приводу, від HTTP до бінарних типів вмісту або кодування передачі.
Стів Джессоп

4
Прості текстові протоколи також дозволяють безпечно досліджувати потенційно небезпечні або ненадійні дані. Наприклад, я використовую telnet, коли отримую певну спробу спаму / фішингу, який, я можу гарантувати, практично не зашкодить моїй системі. Наявність текстового доступу до системи є критично важливим. Вже сьогодні ви зауважите, що HTTP / 1.1 рідко є "простим текстом", оскільки заголовок Accept-Encoding дозволяє стиснути, що підтримує більшість користувачів браузерів та серверів, щоб швидше завантажувати сторінки.
фірфокс

На виставковій виставці комп'ютерів Середнього Заходу мені було цікаво, що таким машинам, як Altair 680, потрібно було отримати код у форматі запису Motorola S, який використовував 76 символів на кожні 32 байти даних (44 символи накладних витрат). Навіть якби ви обмежилися використанням набору 41 символів, таких як 0-9 AZ + - * / =, все одно слід зменшити його до чогось ближчого до 57 символів (25 символів накладних витрат), що зменшить час на ASR-33 для подачі 1К коду від 4 хвилин до трьох. Враховуючи повільну швидкість вводу / виводу, мені цікаво, чому подібні речі не здаються звичайними?
supercat

24

Однією з переваг, яку можна не помітити, є можливість експериментувати . Якщо ви засунете шматочки в трубку, вам потрібно буде написати якусь утиліту, що перекладається EHLOна 0x18подібне. Замість цього ви можете просто telnet на поштовий сервер, надсилати EHLOта бути у вашому шляху.

Ніщо не заважає вам в цей день і вік писати код в Асамблеї або Brainf * ck , і ви можете дуже добре зберегти деякі біти, зробивши це. Однак пояснити, що саме ви зробили з кимось іншим, щоб вони могли зрозуміти та взаємодіяти з вашим кодом, буде непросто, якщо ви це зробите.

За допомогою протоколів важливо, щоб користувачі могли легко навчитися ними користуватися, оскільки більшість людей у ​​той час, коли використовували ARPAnet або початок Інтернету, були людьми, які почували себе комфортно за терміналом.

Подібні аргументи, до речі, і сьогодні ведуться в компаніях. Чи повинні ми серіалізуватися до JSON або BSON (двійкове представлення JSON)? Якщо ви серіалізуєтесь на BSON, ви проганяєте частину накладних витрат, але зараз вам потрібен перекладач, щоб перетворити свій BSON в JSON і навпаки, оскільки людині доведеться читати ці дані в якийсь момент, коли щось неминуче піде не так.


Якщо протоколи в першу чергу були розроблені як двійкові, а не двійкові скорочення для текстового протоколу, може не існувати навіть загально узгодженого терміна, як EHLO. Кожний інтерфейс, призначений для використання у бінарному протоколі, міг би скласти власне ім'я, якби двійковий стандарт не назвав 0x18-in-this-position.
Пітер Кордес

10

Справа не в тому, що багато інтернет-протоколів є текстовими. Насправді, якби я здогадувався, я б сказав, що текстові протоколи є меншиною. Практично для кожного текстового протоколу, який ви бачите в Інтернеті, є щонайменше два двійкові протоколи, які люди винайшли для надсилання одних і тих же або подібних даних.

Але це правда, що більшість інтернет- трафіку використовують текстові протоколи. Цей факт цікавий, якщо припустити, що існує багато більше бінарних протоколів, ніж текстових, але набагато більше текстового трафіку, ніж двійкових. Це означає, що більшість успішних протоколів в Інтернеті є текстовими. За винятком невеликої кількості застосунків (один із прикладів - bittorrent) бінарні протоколи, як правило, гинуть.

У перші дні Інтернету корпорації прагнули розробляти та використовувати бінарний протокол (наприклад, MSN, а не веб-сайт MSN сьогодні, оригінальна власна мережа MicroSoft, яка повинна була замінити HTTP), тоді як військові, науково-дослідні інститути та вчені розробити та використовувати текстовий протокол. Частина причини полягала в тому, що складання та налагодження бінарних протоколів було важким, і корпорації можуть дозволити собі платити людям за це, тоді як військові, дослідники та науковці робили це у вільний час без оплати (більшість людей, які розвивали Інтернет, мали робочі місця, не пов'язані з розвитком Інтернету).

Коли ви пишете код у вихідні дні як хобі і не платите за те, що робите, ви схильні вибирати простіше рішення - текст. Тож текстові протоколи звикли більшість людей, ніж двійкові протоколи.

Але це ще не повна історія. Побудувати мережу важко. Дійсно важко. Сьогодні ми так звикли до Інтернету, що не до кінця усвідомлюємо, що це за диво інженерії. Майже кожен аспект Інтернету розвивався з виправлення помилок. Наприклад, ми використовуємо IP-адресу замість MAC-адреси, оскільки це дозволяє нам будувати маршрутизатори лише кілобайт (або в ці дні мегабайти) замість терабайтів оперативної пам’яті для таблиці маршрутизації. Чим більше і більше проблем ми намагалися вирішити, тим більше ми віддаємо перевагу текстовим протоколам для їх налагодження. Коли ми мали достатньо досвіду розробки мережевих протоколів низького рівня, коли прийшов час розробляти протоколи додатків, більшість досвідчених програмістів та інженерів, як правило, віддавали перевагу текстовим протоколам.

З особистого досвіду я працював у маршрутизаторі компанії, а також працював у телевізійному обладнанні обладнання, тому маю великий досвід роботи з бінарними протоколами, такими як TCP / IP, ARP, IEC60870-5- 101 та DNP3. Я також працював з текстовими протоколами, такими як HTTP, POP3 та NMEA. Я також працював з бінарними форматами даних, такими як ASN.1 та текстовими форматами даних, такими як JSON та XML. Якби я вибирав, я вибирав би текст майже кожного разу. Єдиний раз, коли я вибрав бинарний, - це якщо протокол насправді низького рівня (тоді я б реалізував достатньо, щоб я міг розкласти текстовий протокол зверху чи він) або дані, природно, бінарні (наприклад, аудіофайли) .


3

Структурований бінарний також має обмеження в його розширенні. За моїх днів роботи з FidoNet та побудови шлюзу між ним та UUCP / USNET заголовки повідомлень Fidonet були структурованим двійковим файлом. Розширити його, навіть просто намагаючись додати байт десь, означає зламати все там, що намагається з ним працювати. Наявність текстового заголовка чи протоколу означає, що ви можете розширити щось без розбиття речей.


Заняття уроку: Помістіть тег версії у двійкові дані.
Пітер - Відновіть Моніку

3

Ваше питання можна інтерпретувати трьома способами:

  1. Чому числові дані передаються в текстовому поданні, як якщо б вони були надруковані, наприклад printf(),?
  2. Чому класичні протоколи додаткового рівня - наприклад, канал управління ftp, smtp, http - традиційно всі використовують 7-бітний набір символів ASCII? (7-бітний ASCII можна вважати "текстовим", тому що більшість байтів відповідають друкованим гліфам або текстовим кодам управління, як новий рядок та канал).
  3. Чому краплі двійкових даних часто перетворюються на 7-бітні асії, коли вони надсилаються через Інтернет, наприклад, як вкладення пошти?

Відповідь на перший - сумісність. Цілі чи значення з плаваючою комою мають різні двійкові уявлення на різних машинах, навіть компіляторах, або навіть із просто різними параметрами компілятора. Ефективна передача їх за допомогою printf/scanfспрощує взаємодію. Зауважте, що цей вибір був зроблений лише для протоколів вищого рівня, про які згадується декілька; на мережевому рівні дані передаються двійково. Для цього TCP / IP визначає бінарне цілочисельне представлення, а бібліотеки, що реалізують TCP / IP, забезпечують перетворення між представленнями хостів і мереж з htonlдрузями та друзями.

Відповідь на друге питання, ймовірно, що RFC 206 (зверніть увагу на низьку кількість - 1971!) Описує протокол telnet, на якому базується багато протоколів рівня додатків, як пряму заміну телетайпу

функція якого полягає в тому, щоб термінал Інтернет-системи відображався в будь-якій сумісній з телетайпами системі обміну часом у Мережі так, ніби він був безпосередньо підключений до цієї системи .

(Наголос в оригінальному тексті.) Принаймні деякі телетипи і, зокрема, телетипні мережі, використовували 7-бітний ASCII як набір символів, який, мабуть, зробив це природним вибором.

Третя відповідь полягає в тому, що, оскільки протоколи рівня додатків засновані на telnet, а telnet - це 7-бітова ascii, багато програмного та апаратного забезпечення не були готові працювати з 8-бітовими даними . Надсилання бінарних вкладених файлів може вважатися неправильним використанням електронної пошти; звідси обручі. Сьогодні це, як правило, більше не відповідає дійсності, і протоколи постійно розширюються (або просто використовуються) для прямої обробки двійкових даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.