Основы Интернета
Есть такая интересная книга – «High Performance Browser Networking» Ильи Григорика, в которой описаны основы работы сетей и способы оптимизации передачи данных. В этой книге автор пишет про CDN следующее:
Сервисы по доставке контента (CDN) приносят много пользы, но основаны они на простом наблюдении, что, распределив контент по всему земному шару и доставляя его к пользователю из точки, которая как можно ближе к нему, можно значительно уменьшить время загрузки.
Мы не можем заставить пакеты перемещаться по проводам быстрее, но, грамотно расположив наши сервера поближе к пользователям, мы можем сократить расстояния, которые этим пакетам нужно пройти. Таким образом, использование CDN для раздачи контента может значительно увеличить скорость загрузки вашего сервиса.
Если подумать, то наверное можно согласиться с тем фактом, что CDN улучшают UX, потому что ускоряют загрузку сайта. Но. минуточку. А как именно CDN это делает?
Вы можете сказать: «Ну, когда пользователь запрашивает файлы с CDN, они загружаются с ближайшего к пользователю сервера. Легко и просто». Да, но ведь эти данные загружаются всегда с одного домена. Как тогда запрос может приходить на разные сервера?
В этой небольшой серии статей мы попробуем разобраться в этом вопросе и понять, что за магия лежит в основе работы CDN. Для этого нам нужно будет разобраться с тем, как устроен Интернет, какие протоколы лежат в его основе, и как мы вообще пришли к тому, что имеем.
Провода
Начнём с самых основ. Допустим, у нас есть два компьютера, которые хотят «общаться» друг с другом:
Ну, нет проблем. Просто соединяем их проводом и готово:
Когда один компьютер отправляет сообщение другому компьютеру, он передаёт данные через порт, к которому подключён их общий кабель. А поскольку пользователей всего два, то легко определить, когда канал коммуникации занят. Опять же, нет проблем с адресацией и всем таким.
Однако, подобное решение довольно-таки сложно масштабировать. Как поступить, если компьютеров больше? Скажем, пять, а не два. Да, конечно, мы можем так же соединить каждый с каждым, но.
Как видно, подобный подход быстро становится проблемой. Нам не только нужно куда больше кабеля, так ещё и у каждого компьютера должно быть по четыре порта. Более того, если мы захотим добавить ещё один компьютер в сеть, нам нужно будет каким-то образом добавить по порту каждому из уже существующих компьютеров. Топология этой сети слишком сложная.
В телекоммуникационных сетях топология – это то, как взаимосвязаны между собой элементы этих сетей. Сетевая топология может быть физической или логической (на самом деле не только, но нам это тут не важно). Физическая топология описывает реальное расположение и связи между компьютерами, а логическая – то, как сигнал проходит по всем этим связям.
В нашем случае каждое устройство соединено с каждым, а потому мы имеем дело с полносвязной топологией. Как физически, так и логически.
Чтобы использовать поменьше кабеля, мы могли бы выбрать другую топологию. Скажем, каждый компьютер мог бы быть соединён только с двумя своими соседями:
Такая топология называется кольцо. Как видно, в этом случае нам не нужно много кабеля, да и каждому компьютеру достаточно иметь лишь два порта. Однако, взамен мы получаем более сложную систему обработки сигнала. Теперь при передаче данных этот самый сигнал не обязательно сразу попадает к получателю, а может проходить через промежуточные компьютеры.
Несмотря на то, что наличие промежуточных компьютеров не плохо само по себе, в такой топологии есть куда большая проблема. Работоспособность этой сети зависит от доступности всех её элементов. Если вдруг один или несколько компьютеров выйдут из строя, передача данных может и не состояться.
Разные топологии решают разные проблемы. Так, вместо использования кольцевой сети, мы могли бы связать все компьютеры с помощью одного кабеля, получив тем самым топологию шина:
Теперь работоспособность нашей сети не зависит от работы компьютеров. Но если вдруг сломается центральный кабель (который обычно и называется шиной или магистралью), то ничего работать не будет. Такую сеть сложнее обслуживать, ведь в случае проблем нужно иметь доступ к каждому сантиметру центрального кабеля.
Чтобы решить проблему с обслуживанием, можно использовать «вспомогательное устройство», которое будет принимать данные от компьютеров и распределять их по сети. Таким устройством может быть концентратор (хаб) или коммутатор (свитч). А топология такой сети – звезда:
Даже если вдруг такая сеть перестанет работать из-за поломки свитча, починить её будет куда проще. Вместо того, чтобы «прозванивать» длинный кабель, нам нужно будет починить или заменить лишь одно устройство. Плюс, к такой системе куда проще добавлять новые элементы – подключаешь новый компьютер к свитчу и всё работает.
В жизни мы используем сети с топологией «звезда» дома. Все устройства обычно подключены к одному роутеру, который получает сообщения и передаёт их туда, куда необходимо. Интернет же – это объединение сетей с разной топологией.
Интернет и его иерархия
Окей, допустим, что наша домашняя сеть выглядит так:
Но что происходит дальше? Каким образом ваш запрос попадает в Гугл?
Первым делом посмотрим на конечную точку, которая и будет обрабатывать ваш запрос – сервер Гугла:
Однако, запрос не пойдёт напрямую к этому серверу. Ваш роутер соединён с другой сетью – сетью вашего провайдера. Та же история и с сервером Гугла, у него тоже есть своя родительская сеть:
Каждый из этих провайдеров обслуживает свою сеть, которая состоит из множества более мелких подсетей, таких как ваша.
Конечно, если вы вдруг подключены к тому же провайдеру, что и сервер Гугла – вам несказанно повезло. В таком случае вы можете передавать данные внутри сети этого провайдера, что довольно-таки быстро:
Увы, на практике невозможно подключить всех к одному провайдеру. А потому в мире сотни и тысячи оных. Каждый провайдер обменивается данными с другими, тем самым «позволяя Интернету работать».
Так что, ближайший к реальному пример может выглядеть как-то так:
Возможно, вы уже заметили, к какой проблеме мы подходим. Если все провайдеры должны как-то соединяться друг с другом напрямую, чтобы обмениваться трафиком, то возникает та же проблема, что мы обсуждали в предыдущем разделе – куча проводов! А потому провайдеры между собой обычно объединяются через специальные хабы – точки обмена трафиком:
Получившаяся сеть и так сложна, но есть ещё одна проблема – география.
Что делать, если вы живёте в Испании, а сервер Гугла «живёт» в США? Ну, должна же как-то Испания быть соединена со Штатами, да?
Выход есть. Подводный кабель!
Скорее всего, вы об этом и так знаете, но всё же. Континенты соединены между собой подводными кабелями. Может показаться, что это не очень надёжно, и, справедливости ради, иногда с ними случается всякое. Но тем не менее, это всё ещё лучший способ соединения сетей:
Кажется, что теперь мы примерно представляем, как могут быть соединены два компьютера, подключённые к Интернету, да? Однако, в реальности всё чуточку сложнее.
Во-первых, провайдеров очень много.
Во-вторых, точек обмена трафиком тоже много.
В-третьих, вы не поверите, подводных кабелей тоже немалое количество! Взгляните на карту:
Плюс, не каждый интернет-провайдер подключается напрямую к точке обмена трафиком. Некоторые из них не такие богатые, и подключаются лишь к родительским провайдерам.
Но даже это ещё не конец, ведь кабели бывают разные. Одни быстрее передают сигнал, другие медленнее. А что ещё важнее – цена за передачу данных по ним тоже разная. Вы ж не подумали, что обмен трафиком между провайдерами бесплатный? Нет. Они платят друг другу и точкам обмена трафиком за использование сетей. Каким-то приходится платить больше, каким-то меньше.
А потому, можно сказать, что сигнал от вашего компьютера обычно идёт к получателю не по самому короткому пути, а по самому дешёвому.
Среда передачи данных
Это физическая субстанция, по которой происходит передача сигнала. Скажем, когда устройства соединены с помощью Wi-Fi, среда – воздух. А когда ваш ПК подключается к роутеру, то зачастую сигнал идёт по медному кабелю. В подводных же кабелях сигнал проходит по оптоволокну.
Среда определяет условия, в которых происходит общение между компьютерами.
Скажем, на медные провода может повлиять «шум» от других электрических устройств. А потому витая пара обычно, ну, «витая». Чтобы уменьшить влияние электромагнитных помех. Такие кабели ещё обычно экранируются с помощью специальных материалов, которые защищают передаваемый сигнал от помех.
В то же время, оптоволокну плевать на электромагнитные помехи, потому что оптоволокно – это просто «световая трубка». В том числе и из-за этого скорость передачи данных через оптоволокно на порядки выше, чем через витую пару.
А как же спутники?
Тут вы могли бы сказать: «Интернет, основанный на подводных кабелях, – это что-то с чем-то. Почему бы просто не использовать спутники и не передавать сигнал по воздуху?».
Да, конечно, это возможно. Скажем, GPS работает за счёт спутников. Но, во-первых, куда дешевле просто соединить компьютеры проводами. Во-вторых, сеть, находящуюся на земле (или даже под водой), куда проще и дешевле чинить.
Плюс, давайте-ка по-быстрому прикинем. Возьмём тот пример, что был до этого. Пусть синяя точка – это город Нэшвилл в США, а чёрная – Сарагоса, Испания:
Расстояние между этими городами – 7200 км. Если мы соединим их проводом напрямую, то сигнал от одного компьютера до другого дойдёт за 36 мс, т. к. скорость света в оптоволокне где-то 200 000 км/с (в полтора раза меньше, чем в вакууме).
В то же время в небе где-то между этими городами может висеть спутник. Исторически так сложилось, что телекоммуникационные спутники запускали на геостационарную орбиту, высота которой – 35 786 км. А наш сигнал сперва должен дойти из Сарагосы до спутника, а потом от него – до компьютера в Нэшвилле.
Опуская тригонометрию и тот факт, что в реальности эти две точки вряд ли смогли бы подключиться к одному спутнику, скажем, что итоговое расстояние – 2 × 35 786 км, или 71 572 км.
Учитывая то, что скорость сигнала до спутника составляет где-то 300 000 км/с (опять же, считаем, что у нас волны в вакууме), то итоговое время передачи – 238 мс.
Таким образом, сигнал по прямому кабелю прошёл бы за 36 мс, а через спутник – за 238 мс.
Да, мы ничего не сказали про то, что между городами у нас много промежуточных точек – провайдеры, точки обмена данными и прочее. Все они замедляют передачу, уводя реальное время передачи далеко за 36 мс. Но в то же время мы ничего и не сказали про качество сигнала, которое мы имели бы, передавая данные по воздуху. А оно оставляло бы желать лучшего из-за разного рода помех.
Теперь должно быть понятно, почему мир всё ещё использует кабели. Да, в будущем всё может поменяться. Уже сейчас большое количество спутников запускается на низкую околоземную орбиту (привет, Илон!). А потому и показатели скорости там впечатляющие.
Однако, маловероятно, что текущая «проводная» инфраструктура вдруг возьмёт и исчезнет. А значит, нам всё ещё придётся пользоваться такими сервисами, как CDN, для ускорения загрузки наших проектов на компьютерах пользователей.
В следующей статье серии заглянем внутрь сообщений, которыми обмениваются компьютеры, и посмотрим, как сигнал в проводах кодируется во время передачи.