Рис. 5.58. Распространение объявлений о BGP-маршруте
Хранение полного пути для маршрута упрощает обнаружение и устранение циклов. Правило выглядит так: каждый маршрутизатор, отправляющий маршрут за пределы своей АС, добавляет в начало маршрута номер своей АС. (Именно поэтому список имеет обратный порядок.) Когда маршрутизатор получает маршрут, он проверяет, есть ли в пути АС номер его собственной АС. Положительный ответ означает, что в маршруте есть цикл; в таком случае объявление отвергается. Но несмотря на такие меры предосторожности, в конце 1990-х было обнаружено, что BGP все же сталкивается с одним из вариантов проблемы счета до бесконечности (Labovitz и др., 2001). Хотя от долговременных циклов удается избавиться, из-за медленной конвергенции маршрутизаторов могут возникать временные циклы.
Задавать путь списком АС — довольно-таки грубый вариант. АС может быть как небольшой компанией, так и международной магистральной сетью. По маршруту этого узнать невозможно. А BGP даже не пытается этого сделать, так как в разных АС могут использоваться разные внутридоменые протоколы, вследствие чего стоимость передачи трафика невозможно сравнить. Но если бы их можно было сравнить, с большой вероятностью возникла бы другая проблема: часто АС скрывают данные о своих внутренних параметрах. Это одно из основных отличий междоменной маршрутизации от внутридоменной.
До сих пор мы говорили о том, как объявление маршрута передается по каналу между двумя интернет-провайдерами. Но нужно также уметь отправлять BGP-маршруты в другие части сети провайдера, чтобы оттуда они могли быть переданы другим провайдерам. Эту задачу должен решать внутридоменный протокол. Но поскольку BGP очень хорошо работает в крупных сетях, для этого часто используется его вариант. Он называется внутренним BGP (iBGP — internal BGP), в противоположность обычному, или внешнему BGP (eBGP — external BGP).
Правило распространения маршрутов внутри сети провайдера выглядит так: маршрутизатор, расположенный на границе сети, узнает обо всех маршрутах, о которых знают другие пограничные маршрутизаторы (в целях согласованности их действий). Если какому-то пограничному маршрутизатору становится известен префикс к IP 128.208.0.0/16, все другие маршрутизаторы тоже о нем узнают. Тогда до этого префикса можно будет добраться из любой точки сети провайдера, причем не важно, как пакет попал в эту сеть.
Во избежание беспорядка этот процесс не показан на рис. 5.58. Но в качестве примера можно привести такой вариант: маршрутизатор R2b узнает, что он может добраться до C либо через R2c (вверху), либо через R2d (внизу). Данные о следующем маршрутизаторе будут обновляться, пока маршрут будет перемещаться по сети провайдера. Благодаря этому маршрутизаторы на разных концах сети будут знать, через какой маршрутизатор можно выйти за пределы сети на другом ее конце. Если посмотреть на самые левые маршруты, то можно увидеть, что для них следующий маршрутизатор находится в той же сети, а не в соседней.
Теперь мы можем перейти к обсуждению важного вопроса: как BGP-маршрутизаторы выбирают маршрут до данного адреса? Каждый BGP-маршрутизатор узнает маршрут до данного адреса от соединенного с ним маршрутизатора в соседней сети провайдера, а также от других пограничных маршрутизаторов (которые узнают другие возможные маршруты от своего соседнего маршрутизатора). Далее каждый маршрутизатор решает, какой из этих маршрутов лучше всего использовать. В конечном итоге получается, что политику выбора маршрута определяет интернет-провайдер. Однако такое объяснение является слишком общим и не вполне удовлетворительным, так что давайте поговорим о нескольких возможных стратегиях.
Первая стратегия заключается в том, что маршруты через сети, соединенные напрямую, обладают большим приоритетом, чем транзитные маршруты. Первые являются бесплатными, вторые — нет. Существует еще один похожий вариант: наибольший приоритет присваивается маршрутам клиента. При этом трафик передается напрямую тому, кто за него платит.
Другая стратегия по умолчанию использует такое правило: чем короче путь АС, тем он лучше. Преимущества этой стратегии являются спорными, так как путь через три маленьких АС может оказаться короче, чем путь через одну большую АС. Однако в среднем выбор кратчайших путей дает неплохие результаты, так что решение остается за вами.
Наконец, существует стратегия, согласно которой предпочтение отдается маршруту с наименьшей стоимостью в пределах сети провайдера. Пример ее реализации показан на рис. 5.58. Пакеты из A в C покидают AS1 через верхний маршрутизатор R1a. Пакет из B выходит через нижний маршрутизатор R1b. Так происходит потому, что A и B выбирают наименее затратный способ выхода из AS1. А поскольку они расположены в разных частях сети провайдера, наилучшие пути для них различаются. То же самое происходит, когда пакеты проходят через AS2. На последнем участке AS3 должна переправить пакет из B по своей сети.
Эта стратегия называется ранним выходом или методом «горячей картошки» (hot-potato routing). Интересно, что при такой маршрутизации пути обычно бывают несимметричными. Рассмотрим маршрут пакета, переданного из C в B. Пакет сразу же выйдет из AS3 через верхний маршрутизатор. При переходе из AS2 в AS1 он останется наверху, а уже потом будет долго путешествовать внутри AS1. Это зеркальное отражение пути от B к C.
Из всего этого следует, что каждый BGP-маршрутизатор выбирает свой наилучший путь из нескольких возможных. Но вопреки первоначальным ожиданиям, нельзя сказать, что BGP отвечает за маршруты между разными АС, а OSPF — за маршруты внутри одной АС. BGP и протокол внутреннего шлюза связаны более сложным образом. В частности, это значит, что BGP может найти наилучшую точку выхода за пределы сети провайдера и выбор точки будет различаться для разных уголков сети, как в случае стратегии «горячей картошки». Также это значит, что BGP-маршрутизаторы из разных частей одной АС могут использовать разные пути АС до одного и того же места назначения. При этом провайдер должен позаботиться о том, чтобы при такой свободе выбора маршруты были совместимы, но это уже относится к практике.
Как это ни удивительно, мы лишь слегка коснулись вопроса использования BGP. Для более подробной информации см. спецификацию BGP версии 4 в RFC 4271 и другие RFC. Но помните, что большинство трудностей касаются политики маршрутизации, о которой не говорится в спецификации протокола BGP.
5.6.8. Многоадресная рассылка в Интернете
Обычно IP-связь устанавливается между одним отправителем и одним получателем. Однако для некоторых приложений возможность послать сообщение одновременно большому количеству получателей является полезной. Такими приложениями могут быть, например, обновление реплицируемой распределенной базы данных, передача биржевых сводок брокерам и цифровые телеконференции (с участием нескольких собеседников).
Протокол IP поддерживает многоадресную рассылку при использовании адресов класса D. Каждый адрес класса D соответствует группе хостов. Для обозначения номера группы может быть использовано 28 бит, что делает возможным одновременное существование 250 млн групп. Когда процесс посылает пакет по адресу класса D, протокол прилагает максимальные усилия по его доставке всем членам группы, однако не дает гарантий доставки. Некоторые члены группы могут не получить пакета.
Диапазон IP-адресов 224.0.0.0/24 зарезервирован для многоадресной рассылки в локальной сети. В таком случае протокол маршрутизации не требуется. Пакеты передаются всей ЛВС с помощью широковещания с указанием группового адреса. Все хосты в этой сети получают пакет, но обрабатывают его только члены группы. За пределы ЛВС пакет не передается. Вот некоторые примеры групповых адресов:
♦ 224.0.0.1 — все системы локальной сети;
♦ 224.0.0.2 — все маршрутизаторы локальной сети;