Когда я перехватываю пакеты с помощью анализатора пакетов при посещении http://en.wikipedia.org/wiki/Hydrogen, я вижу пакеты, которые используют протокол HTTP (например, запрос GET). Мой запрос Get использует 4 протокола: Ethernet II, IPv4, TCP и HTTP. Для IPv4 я могу видеть свой собственный локальный IPv4-адрес моего компьютера в качестве источника, а для пункта назначения я вижу IPv4-адрес 91.198.174.225. Когда я захожу по этому адресу в своем браузере, я попадаю на какой-то сайт, связанный с Википедией, который говорит: «Вики не существует». Почему я не вижу статью о водороде, когда я иду по этому IP-адресу?
3 ответа
Скорее всего, потому что в Википедии работают виртуальные хосты; сервер 91.198.174.225 имеет несколько имен хостов.
Например, fr.wikipedia.org имеет тот же IP-адрес. Большая машина может иметь сотни виртуальных хостов, ограниченных процессором, памятью и пропускной способностью для этой машины
Веб-браузеры добавляют заголовок Host:
к запросу, который является именем хоста с URL, который вы вводите. Веб-сервер будет обслуживать другой «виртуальный сервер», включая разные страницы, в зависимости от заголовка Host:
запроса. Когда вы заходите на сервер, используя IP-адрес, вы отправляете IP-адрес как Host:. Веб-сервер имеет базовую конфигурацию для этого запроса, но, вероятно, не ту, которую вы ожидаете.
Обычно несколько веб-сайтов обслуживаются с одного и того же IP-адреса. Использование IP-адреса в URL недостаточно для этих сайтов. Вы должны предоставить правильное доменное имя, которое ваш браузер поместит в заголовок HTTP Host, который сообщает серверу, какой веб-сайт вы хотите.
Хотя ваши запросы идентичны на уровне TCP и ниже, они отличаются на уровне HTTP. Вы заметите, что в вашем первом запросе поле Host в заголовке содержит имя хоста, которое было найдено в вашем исходном URI, в то время как запрос с IP-адресом вместо имени хоста имеет поле Header, которое является пустым или содержит только IP-адрес. См. RFC 2616 для технических деталей.
Без поля Host у сервера не будет возможности узнать, на какой хост был направлен запрос. Это не позволит использовать несколько имен хостов (с разными сайтами) на одном IP-адресе. Массовый веб-хостинг будет неэффективным, поскольку для него потребуется выделенный IP-адрес для каждого имени хоста. Концепция виртуальных хостов решает эту проблему, используя поле заголовка хоста, чтобы различать запросы к различным именам хостов, и позволяет неограниченное количество имен хостов на одном IP-адресе и обслуживать различный контент на каждом из них. Википедия, вероятно, использует это для обслуживания разных языковых версий с одного сервера, который вы просили. Без имени хоста вашему запросу не хватает информации, на каком языке запрашивается.