— Привет, Амиго!

— Привет, Билаабо!

Что нового расскажешь сегодня?

— Много всего. Но начать думаю с работы с сетью и интернетом. Интересно?

— Ага. Галактический Интернет – это крутая вещь.

— Вот, но начнем с истории. В начале 21 века дела обстояли таким образом…

У каждого компьютера, подключенного к интернету, есть его уникальный номер. В качестве номера используется обычное четырехбайтовое число. Такой номер принято называть IP-адресом.

Но, т.к. память у людей плохая и им сложно запомнить что-то типа 2108458776, они частенько записывают его байты отдельно.

Если разбить четырехбайтовое число 2108458776 на отдельные байты, то получится такое число «125.172.135.24». Каждый байт, как ты помнишь, состоит из 8-и битов и может содержать числа от 0 до 255.

— Т.е. это одна и та же запись числа?

— Да. Просто более легкая для запоминания (у людей) форма записи четырёхбайтового числа.

Кстати, идея выбрать всего 4 байта вскоре сыграла с ними злую шутку. Количество устройств, подключенных к интернету, выросло так быстро, что скоро свободные номера закончились.

— И как они вышли из этой ситуации?

— По-людски. Хе-хе.

Они придумали новый стандарт IP-адреса, гордо названный IP v6 – IP-address version 6.

В нем, в отличие от обычного IP-адреса (который называют IP v4), для уникального номера используются на 4 байта, а 16.

Ты только подумай, люди не могли запомнить 10 цифр в обычном номере (как 2108458776), для чего им пришлось разбить на 4 части, а тут придумали номера, состоящие из 16 байт.

— Да, иногда люди такие странные.

— Ага. Люди они и есть люди.

Хотя они выкрутились и из этой ситуации.

Им надоело запоминать цифры, и они решили заменить их словами.

— Это как это? А можно пример?

Конечно: web.mail.comgoogle.com.uanew.books.amazon.com, …

Такое имя называется доменом.

Для того чтобы такой интернет работал правильно, была придумана специальная таблица – DNS (Domain Name System), в которой для каждого доменного имени хранился его IP-адрес.

Вот как это работает.

1) Пользователь вводит в браузере адрес, например, web.mail.com.

2) Браузер обращается к DNS и по доменному имени получает IP-адрес.

3) По этому IP-адресу отправляется запрос, содержащий нужную ссылку (URL).

— Выглядит не очень просто.

— Но у такого подхода есть и несколько преимуществ:

1) Люди легко запоминают словесные имена.

2) Доменные имена можно строить в виде дерева, добавляя в начале имени поддомены. Точь-в-точь, как package в Java.

3) Если надо сменить IP-адрес веб-сервера, то достаточно поменять запись в DNS, и все будет работать как раньше, а пользователям не придется учить новый адрес.

Выглядит эта DNS примерно так:

Domain Name IP-Address
mail.com 128.35.36.189
web.mail.com 145.12.17.13
new.mail.com 192.155.15.3
google.com 92.117.151.100
google.com.ua 193.168.0.1
docs.google.com 217.12.222.1

— Понятненько.

— Ну, домен – это имя компьютера, но нам ведь нужен не компьютер, а то, что в нем лежит. Для этого используют ссылки (URL)

Вначале URL фактически представлял собой ссылку на файл на чужом компьютере. Пример:

Пример
http://info.javarush.com/user/info/profile.html
Описание
http – это протокол – стандарт общения клиента и сервера
info.javarush.com – доменное имя компьютера.
user/info/profile.html – это путь к файлу на компьютере

В самом начале развития сети web-сервер умел только отдавать файлы по урлу (ссылке), которые у него где-то хранились. URL фактически был глобальным путем к файлу (имя компьютера + путь).

Затем, когда веб-сервера начали сами генерировать отдаваемые файлы, смысл урла немного поменялся, и он стал запросом к web-серверу. В него так же добавились параметры запросы.

Сегодня уже редко увидишь расширение файла в конце url. Современные url – это просто некоторая уникальная ссылка с параметрами. Больше похоже на вызов метода, а не на глобальный адрес файла.

Современный классический Url выглядит так:

Разбор ссылки
http://javarush.com/alpha/api/contacts?userid=13&filter=none&page=3
Описание частей ссылки
javarush.com – это домен — уникальное имя (адрес) компьютера в интернете
http — это протокол (стандарт) взаимодействия клиента и сервера
alpha/api/contacts – запрос к веб-серверу / запрос веб-страницы на сервере
userid=13 & filter=none & page=3 – параметры запроса

— Ага, помню. Недавно ты мне уже рассказывал про ссылки.

И про порты тоже. На примере многоквартирного дома.

Лучше расскажи мне, что такое http. А то везде написано – протокол, а что это такое – не ясно.

— Ок. Сейчас расскажу.

IP-address, domain, URL - 1

HTTP – это HyperTextTransportProtocol – протокол для передачи гипертекста.

— А что такое гипертекст?

— Это HTML.

Протокол, это грубо говоря, стандарт взаимодействия. В нем описано, какие запросы можно посылать веб-серверу и в каком формате, и как этот веб-сервер должен отвечать.

Вкратце дело обстоит таким образом. Между клиентом и сервером пересылаются обычные текстовые файлы, ну, или если хочешь – большие куски текста.

К серверу приходит запрос (request), и на каждый запрос сервер отдает ответ (response).

Вот примеры таких запроса и ответа:

Запрос (Request)
GET alpha/api/contacts HTTP/1.1
Host: javarush.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
Описание
GET – подтип запроса
alpha/api/contacts – запрос к веб-серверу
HTTP/1.1 – версия протокола – HTTP/1.1
Host: javarush.com – доменное имя 
User-Agent: Mozilla/5… – уникальное имя браузера
Accept: text/html – тип запрашиваемого документа: HTML
Connection: close – закрыть соединение сервером, после обработки запроса.

Первая строка – это фактически запрос. Затем идут дополнительные параметры запроса, так называемые «заголовки запроса» (Headers).

А вот и пример ответа:

Ответ (Response)
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close
<html><body><a href="http://ample.com/about.html#contacts">Click here</a></body></html>
HTTP/1.1 200 OK - Ответ «200 ОК» - все хорошо.
Date: Wed, 11 Feb 2009 - Дата обработки запроса
Server: Apache - Имя веб-сервера
X-Powered-By: PHP - Сервер работает на языке PHP
Last-Modified: Wed, 11 Feb 2009 - Время последнего обновления запрашиваемого файла
Content-Language: ru - Язык файла
Content-Type: text/html; charset=utf-8 – Ответ – это HTML-файл в UTF-8 кодировке
Content-Length: 1234 - Длина ответа – 1234 байта
Connection: close - Соединение будет закрыто после обработки запроса
<html><body><a href="http://ample - Сам HTML-файл.

Хочу обратить твое внимание на две вещи:

Во-первых, что бы ты ни запрашивал, для сервера это выглядит как запрос файла. Неважно, есть такой файл на сервере или он его сам генерирует в ответ на запрос.

Во-вторых, сам файл-ответ передается как часть ответа HTTP протокола. Т.е. сначала в ответе сервера мы видим какие-то дополнительные данные, а потом просто пошло тело файла, который отдает сервер.

— Как интересно. Не уверен, что все понял. Потом перечитаю еще раз.

— Ну и еще хочу рассказать тебе про одну маленькую, но интересную вещь – Cookie.

— Что это еще такое?

В соответствии с протоколом HTTP, Cookie – это маленькие кусочки информации, которые сервер отправляет клиенту, чтобы тот хранил их у себя. И при следующих запросах передавал их обратно к серверу.

— Это еще зачем?

— Например, пользователь авторизовался на главной странице сайта, тогда сервер создает объект сессии на сервере для этого пользователя, а уникальный номер этой сессии передает клиенту в виде Cookie. При следующем запросе от клиента к серверу, этот номер сессии, вместе с другими Cookie, опять будет отправлен на сервер. Таким образом, сервер узнает пользователя, который отправил ему этот новый запрос.

— Как интересно.

— Ага. Когда ты будешь писать свои сервлеты, мы познакомимся с этой темой поближе, а сейчас давай сделаем перерыв.

— Как скажешь.