Илл. 5.68. Политика маршрутизации между четырьмя АС
На илл. 5.68 все остальные АС покупают транзитные услуги у AS1. Благодаря этому они могут связаться с любым интернет-хостом. Но за эту возможность им приходится платить. Пусть AS2 и AS3 обмениваются большим объемом трафика. Если эти сети соединены, они могут выбрать другую политику — передавать трафик напрямую и бесплатно. Это уменьшит количество трафика, пересылаемого AS1 от их имени, и сократит их расходы. Такая политика называется пирингом без взаиморасчетов (settlement-free peering) или подключением без взаиморасчетов (settlement-free interconnection).
Для реализации пиринга без взаиморасчетов две АС передают друг другу объявления о маршрутах для своих адресов. Это позволяет AS2 отправлять пакеты AS3 из A в B и наоборот. Но следует заметить, что пиринг без взаиморасчетов не транзитивен. На илл. 5.68 сети AS3 и AS4 тоже используют политику пиринга, поэтому трафик от C к B может передаваться напрямую в AS4. Но что, если пакет нужно отправить от C к A? AS3 объявляет AS4 маршрут до B, но не объявляет маршрута до A. Поэтому трафик не сможет пройти из AS4 в AS3, а затем в AS2, хотя физический путь существует. Но именно это и выгодно AS3. Она хочет обмениваться трафиком с AS4, но не хочет, чтобы AS4 передавала через нее трафик для остального интернета. Вместо этого AS4 придется пользоваться транзитными услугами AS1, которая, кстати, и передаст пакет от C к A.
Теперь, разобравшись с транзитными услугами и пирингом без взаиморасчетов, мы видим, что у хостов A, B и C есть транзитные соглашения. К примеру, клиент A должен покупать интернет-доступ у AS2. A может быть представлен одним компьютером или сетью организации с многочисленными LAN. Но в любом случае клиент A не нуждается в BGP, так как он является тупиковой сетью (stub network), соединенной с остальным интернетом одной линией. Отправлять пакеты за пределы сети можно только по этой единственной линии к AS2. Такой маршрут можно задать в качестве пути по умолчанию. Именно поэтому клиенты A, B и C на рисунке не представлены в качестве АС, участвующих в междоменной маршрутизации.
Коммерческие договоренности о транзите и пиринге без взаиморасчетов реализуются за счет объединения двух принципов маршрутизации — приоритизации путей к получателю и фильтрации способов их объявления в соседних сетях. Приоритизация состоит в следующем: в первую очередь обрабатываются маршруты для платных пользователей, затем — для узлов пиринговой сети без взаиморасчетов и, наконец, — для сетей провайдеров. За этим стоит простая логика: АС предпочитает передавать трафик по тем маршрутам, где за него платят, а не по тем, где за него приходится платить. По тем же причинам АС объявляет клиентам все свои маршруты, но не должна при этом повторно объявлять маршруты, полученные от узла пиринговой сети без взаиморасчетов или от транзитного провайдера, остальным узлам пиринговой сети или провайдерам. АС также реализуют и несколько других коммерческих договоренностей, включая платный пиринг (paid peering), при котором одна АС платит другой за доступ к маршрутам, полученным от ее клиентов. Это похоже на пиринг без взаиморасчетов, но с денежными выплатами. Также возможны договоренности о частичном транзите (partial transit), при котором одна АС платит другой за маршруты к некоторому подмножеству получателей в интернете.
Иногда сети компаний подключены сразу к нескольким интернет-провайдерам. Это делается с целью повышения надежности, так как при отказе одного провайдера трафик может быть передан через другого. Этот метод называется многолинейным подключением (multihoming). В таком случае компания, скорее всего, будет использовать протокол междоменной маршрутизации (например, BGP), чтобы АС знали, через какого провайдера следует передавать трафик.
Существует множество вариантов политики маршрутизации, и это хорошая иллюстрация того, как деловые отношения и контроль над объявлениями маршрутов рождают новые принципы. Далее мы обсудим, как BGP-маршрутизаторы обмениваются объявлениями о маршрутах и выбирают пути для передачи пакетов.
BGP, по сути, является вариантом протокола маршрутизации по вектору расстояний, однако он значительно отличается от других подобных протоколов, например протокола RIP. Как мы убедились, при выборе маршрута вместо минимального расстояния учитывается политика. Другое отличие состоит в следующем. Вместо того чтобы периодически сообщать всем соседям свои расчеты стоимости передачи до каждого возможного адресата, BGP-маршрутизатор передает им точную информацию о тех маршрутах, которые он использует. Этот подход называется протоколом векторов маршрутов (Path Vector Protocol). Путь включает следующий маршрутизатор (он не должен быть смежным и может находиться в другой части сети провайдера) и последовательность автономных систем, или путь АС (AS path), через которые проходит маршрут (АС даются в обратном порядке). Пары BGP-маршрутизаторов взаимодействуют друг с другом, устанавливая TCP-соединения. Так обеспечивается надежная связь и скрываются детали устройства сети, по которой проходит трафик.
На илл. 5.69 показано, как маршрутизаторы обмениваются объявлениями о BGP-путях. Мы видим три АС; средняя предоставляет транзитные услуги провайдерам слева и справа. Объявление о маршруте к префиксу C начинается на AS3. Когда оно доходит до R2c (вверху), то состоит из AS3 и следующего маршрутизатора R3a. Внизу этот маршрут имеет тот же путь АС, но другой следующий маршрутизатор, так как он пришел по другому каналу. Это объявление распространяется дальше и пересекает границу AS1. На маршрутизаторе R1a (вверху) путь АС состоит из AS2 и AS3, а следующий маршрутизатор при этом — R2a.
Указание полного пути при прохождении маршрута упрощает обнаружение и устранение маршрутных петель. Главный принцип состоит в том, что каждый маршрутизатор, передающий маршрут за пределы своей АС, добавляет в его начало номер АС. (Именно поэтому список имеет обратный порядок.) Когда маршрутизатор получает маршрут, он проверяет путь АС на наличие номера его собственной АС. Положительный ответ означает, что в маршруте есть петля; в таком случае объявление отвергается. Однако несмотря на такие меры предосторожности, в конце 1990-х было обнаружено, что BGP все же сталкивается с вариантом проблемы счета до бесконечности (Лейбовиц и др.; Labovitz et al., 2001). Из-за медленной конвергенции маршрутов могут возникать временные петли, пусть и ненадолго.
Задавать путь с помощью списка АС — довольно грубый способ. АС может быть как небольшой компанией, так и международной магистральной сетью. Это нельзя определить по маршруту. BGP даже не пытается этого сделать, так как в различных АС могут использоваться разные внутридоменные протоколы, из-за чего стоимость передачи невозможно сравнить. Но если бы это было возможно, с большой вероятностью возникла бы другая проблема: АС зачастую скрывают данные о своих внутренних параметрах. Это одно из основных отличий междоменной маршрутизации от внутридоменной.
Илл. 5.69. Распространение объявлений о BGP-маршруте
Итак, мы обсудили, как объявление маршрута передается по каналу между двумя интернет-провайдерами. Но кроме этого, нужно уметь отправлять BGP-маршруты в другие части сети провайдера, чтобы оттуда они могли быть переданы другим провайдерам. С такой задачей может справиться внутридоменный протокол. Но поскольку BGP отлично масштабируется для крупных сетей, в этих случаях часто используется его вариант. Он называется внутренним BGP (internal BGP, iBGP), в противоположность обычному, или внешнему BGP (external BGP, eBGP).
Правило распространения маршрутов внутри сети провайдера звучит так: маршрутизатор, расположенный на границе сети, узнает обо всех маршрутах, о которых знают другие пограничные маршрутизаторы (в целях согласованности их действий). Если какому-то пограничному маршрутизатору становится известен префикс к IP 128.208.0.0/16, все другие маршрутизаторы тоже о нем узнают. Тогда до этого префикса можно будет добраться из любой точки сети, при этом не важно, как пакет попал в эту сеть.
Во избежание перегруженности этот процесс не показан на илл. 5.69. Но можно привести такой пример: маршрутизатор R2b узнает, что он может достичь C либо через R2c (вверху), либо через R2d (внизу). Данные о следующем маршрутизаторе будут обновляться, пока маршрут будет перемещаться по сети провайдера. Благодаря этому маршрутизаторы на разных концах сети будут знать, через какой маршрутизатор можно выйти за пределы сети с другой стороны. Если посмотреть на крайние левые маршруты, то можно увидеть, что для них следующий маршрутизатор находится в той же сети, а не в соседней.
Теперь можно перейти к обсуждению важного вопроса: как BGP-маршрутизаторы выбирают маршрут до адресата? Каждый BGP-маршрутизатор узнает этот маршрут от соединенного с ним маршрутизатора в соседней сети провайдера, а также от других пограничных маршрутизаторов (которые узнают другие возможные пути от своего соседнего маршрутизатора). Далее каждый маршрутизатор выбирает наилучший маршрут. В конечном итоге получается, что политику выбора маршрута определяет провайдер. Однако это слишком общее и не вполне удовлетворительное объяснение, так что мы опишем несколько возможных стратегий.
Первая стратегия заключается в том, что маршруты через одноранговые сети обладают большим приоритетом, чем транзитные маршруты. Первые бесплатны, вторые — нет. Существует еще один похожий вариант: наибольший приоритет присваивается маршрутам клиента. При этом трафик передается напрямую тому, кто за него платит.
Другая стратегия по умолчанию использует следующее правило: чем короче путь АС, тем он лучше. Это спорное утверждение, так как путь через три маленькие АС может быть короче, чем путь через одну большую. Но в среднем выбор кратчайших путей дает неплохие результаты, так что решение за вами.
Наконец, существует стратегия, согласно которой выбирается самый дешевый маршрут в сети провайдера. Пример ее реализации показан на илл. 5.69. Пакеты из A в C покидают AS1 через верхний маршрутизатор R1a. Пакет из B выходит через нижний маршрутизатор R1b. Это происходит, поскольку A и B выбирают наименее затратный способ выхода из AS1. А поскольку они расположены в разных частях сети провайдера, наилучшие пути для них различаются. То же самое происходит, когда пакеты проходят через AS2. На последнем