Як зробити так, щоб протокол не знав хоста?


10

Це канонічне запитання про усвідомлення імені хоста та його пропуск.

Я знаю, що деякі протоколи відомі хостами; тобто, коли я підключаюся до сервера HTTP на www.example.comньому, я знаю, що я хочу www.example.comHTTP-сервіс, а не той www.example.net, хоча вони знаходяться на одній IP-адресі. Як я можу це зробити для протоколу foo ?

(Тимчасова примітка: це питання з'являється відповідно до цієї мета-дискусії .)

Відповіді:


14

Щоб зрозуміти, що відбувається, потрібно трохи знати про DNS.

Коли клієнт хоче підключитися до послуги на даному хості, він шукає ім'я хоста через локальну інфраструктуру DNS і отримує у відповідь IP-адресу. Потім він з'єднується з цією IP-адресою та запитує послугу в порядку, визначеному прокотолом, який він створений для реалізації.

У деяких випадках частина цього протоколу передбачає повторне надсилання спочатку знайденого імені хоста, яке в цьому випадку надсилається на сервер, а не в інфраструктуру DNS. У випадку з HTTP це додано як частина HTTP / 1.1, в RFC 2616 ; у випадку HTTPS це було реалізовано як індикація імені сервера (SNI) в RFC 4366 ; у випадку FTP це додано HOSTкомандою в RFC 7151 (але див. пізніше застереження). Якщо такого повторного надсилання не відбувається, сервер не має можливості дізнатися, яке ім'я хоста клієнт подає на свій локальний DNS, щоб отримати IP-адресу сервера.

Зауважте, що у всіх випадках для цього другого надсилання потрібна зміна протоколу і, таким чином, усвідомлення імені хоста-взаємодії клієнт-сервер. Після зміни протоколу для його реалізації довелося оновити код сервера. І нарешті, клієнтів довелося оновити, щоб поговорити про новий протокол із серверами. Цей останній крок може бути особливо повільним; що стосується SNI, Internet Explorer на Windows XP ніколи його не реалізовував, тому протокол не можна було покластися на нього, поки все ще існувала значна кількість користувачів IE-на-XP, і на це достатньо десяти років, щоб їх достатньо відмирають та / або отримують оновлення, які SNI надійно розгортаються.

Отже, це потрібно, щоб зробити протокол, не відомий імені хоста, протокол відомий. Це не проста установка прапора або зміна конфігурації. У нас є деякі відповіді, що стосуються протоколу, які стосуються стану справ та можливих заходів щодо пом'якшення, зокрема для цього протоколу: для SSH (а отже, і SFTP) та для FTP (що вказує, що HOSTпідтримка FTP наразі є виправленою -фаза підтримки, і тому ще не можна покластися на неї).

Коротка відповідь полягає в тому, що якщо ваш протокол зараз не реалізує усвідомлення імені хоста, при хорошій підтримці як клієнтів, так і серверів, забудьте це: це не те, що ви можете зробити.


6
Я думаю, я хотів би відвернути цю відповідь тим фактом, що деякі протоколи призначені для абсолютно нових продуктів або є достатньо локальними, що одна компанія контролюватиме всі екземпляри серверів та клієнтів. У таких випадках просто додавання команд або пакетів імені хоста дуже просто і дуже просто реалізувати. Ви описуєте труднощі в додаванні будь-якої нової функції до існуючого протоколу, який вже широко використовується багатьма постачальниками.
JPhi1618

4
@ JPhi1618 Я вас чую, але на мою думку, будь-який "протокол", створений та реалізований однією компанією та не вбудований в RFC, зовсім не є протоколом; це просто внутрішнє технічне рішення, і я не маю інтересу до таких фірмових продуктів. Як ви вказуєте, постачальник може миттєво змінити речі, щоб реалізувати усвідомлення імені хоста, якщо він цього захоче; але так як жоден інший , ніж постачальник не може зробити це, я не бачу , як це представляє великий інтерес до ОП.
MadHatter

Я думаю, що відповідне питання полягає в тому, чи розробляєте ви новий протокол, чи питаєте, як змінити існуючий протокол.
Вармар

Власний протокол все ще є протоколом.
Вармар

@Barmar, це, мабуть, не дуже добре, щоб потрапити сюди. Це питання стосується зміни існуючих протоколів, і, як я вже зазначав, якщо власне інженерне рішення / протокол bazможе бути змінено лише його власником і єдиним виконавцем, то єдиний спосіб зробити так, щоб він знав хост - це звернення до власника. Це не дає цікавої відповіді SF, і більше того, на мій погляд, не є темою. " Як я спроектував протокол, відомий хосту " - це ще одне питання, яке я не хочу задавати.
MadHatter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.