мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| glossary:net:protocols:bgp [2025/09/18 15:16] – создано radi0dev | glossary:net:protocols:bgp [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== BGP ====== | ====== BGP ====== | ||
| + | **BGP (Border Gateway Protocol)** — это основной протокол динамической маршрутизации, | ||
| + | |||
| + | Маршрутизаторы, | ||
| + | |||
| + | Один из основных атрибутов, | ||
| + | |||
| + | Маршрутизация осуществляется пошагово от одной автономной системы к другой. Все политики BGP настраиваются, | ||
| + | |||
| + | Так как BGP оперирует большими объемами данных (текущий размер таблицы для IPv4 более 450 тысяч маршрутов), | ||
| + | |||
| + | ===== Терминология протокола ===== | ||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | ===== Описание протокола ===== | ||
| + | |||
| + | |||
| + | BGP выбирает лучшие маршруты не на основании технических характеристик пути (пропускной способности, | ||
| + | |||
| + | В локальных сетях наибольшее значение имеет скорость сходимости сети, время реагирования на изменения. | ||
| + | |||
| + | И маршрутизаторы, | ||
| + | |||
| + | При выборе между каналами двух провайдеров, | ||
| + | |||
| + | Поэтому в BGP выбор лучшего маршрута осуществляется на основании политик, | ||
| + | |||
| + | < | ||
| + | Как и другие протоколы динамической маршрутизации, | ||
| + | |||
| + | Если принимать решение о том как должен маршрутизироваться пакет, необходимо по каким-то дополнительным критериям, | ||
| + | </ | ||
| + | |||
| + | ==== Основные характеристики протокола ==== | ||
| + | |||
| + | |||
| + | BGP это path-vector протокол с такими общими характеристиками: | ||
| + | |||
| + | * Использует TCP для передачи данных, | ||
| + | * Отправляет обновления только после изменений в сети (нет периодических обновлений) | ||
| + | * Периодически отправляет keepalive-сообщения для проверки TCP-соединения | ||
| + | * Метрика протокола называется path vector или атрибуты (attributes) | ||
| + | |||
| + | ==== Автономная система ==== | ||
| + | |||
| + | **Автономная система (autonomous system, AS)** — это система IP-сетей и маршрутизаторов, | ||
| + | |||
| + | Диапазоны номеров автономных систем (autonomous system number, ASN): | ||
| + | |||
| + | * 0-65535 (изначально определенный диапазон для ASN 16 бит) | ||
| + | * 65536-4294967295 (новый диапазон для ASN 32 бита (RFC 4893)) | ||
| + | |||
| + | Использование: | ||
| + | |||
| + | * 0 и 65535 (зарезервированы) | ||
| + | * 1-64495 (публичные номера) | ||
| + | * 65552-4294967295 (публичные номера) | ||
| + | * 64512-65534 (приватные номера) | ||
| + | * 23456 (представляет 32-битный диапазон на устройствах, | ||
| + | |||
| + | ===== Описание работы протокола ===== | ||
| + | |||
| + | |||
| + | * Таблица соседей (neighbor table) — список всех соседей BGP | ||
| + | * Таблица BGP (BGP table, forwarding database, topology database): | ||
| + | * Список сетей, полученных от каждого соседа | ||
| + | * Может содержать несколько путей к destination сетям | ||
| + | * Атрибуты BGP для каждого пути | ||
| + | * Таблица маршрутизации — список лучших путей к сетям | ||
| + | |||
| + | {{: | ||
| + | |||
| + | По умолчанию BGP отправляет keepalive-сообщения каждые 60 секунд. | ||
| + | |||
| + | Если существует несколько путей к получателю, | ||
| + | |||
| + | ==== Внутренний BGP (Internal BGP) и Внешний BGP (External BGP) ==== | ||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | Если iBGP-маршрутизаторы работают в нетранзитной AS, то соединение между ними должно быть full mesh. | ||
| + | |||
| + | Это следствие принципов работы протокола — если маршрутизатор, | ||
| + | |||
| + | ==== Таймеры протокола ==== | ||
| + | |||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | ==== Типы сообщений BGP ==== | ||
| + | |||
| + | У всех сообщений BGP такой формат заголовка: | ||
| + | |||
| + | < | ||
| + | |< | ||
| + | |||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | | | ||
| + | + + | ||
| + | | | | ||
| + | + + | ||
| + | | | ||
| + | + + | ||
| + | | | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | Length | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | </ | ||
| + | |||
| + | Поля заголовка BGP-сообщений: | ||
| + | |||
| + | * Marker — поле, которое включено в заголовок для совместимости. Размер поля — 16 байт, все байты должны быть 1. | ||
| + | * Length — длина всего сообщения в октетах, | ||
| + | * Type — тип передаваемого сообщения: | ||
| + | * 1 — OPEN | ||
| + | * 2 — UPDATE | ||
| + | * 3 — NOTIFICATION | ||
| + | * 4 — KEEPALIVE | ||
| + | |||
| + | === Open === | ||
| + | |||
| + | **Open** — используется для установки отношений соседства и обмена базовыми параметрами. Отправляется сразу после установки TCP-соединения. | ||
| + | |||
| + | Формат сообщения Open: | ||
| + | |||
| + | < | ||
| + | |< | ||
| + | |||
| + | +-+-+-+-+-+-+-+-+ | ||
| + | | Version | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | My Autonomous System | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | Hold Time | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | BGP Identifier | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | Opt Parm Len | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | | | ||
| + | | | ||
| + | | | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | </ | ||
| + | |||
| + | Кроме стандартного заголовка пакета BGP, в сообщении Open такие поля: | ||
| + | |||
| + | * Version — версия протокола BGP | ||
| + | * My Autonomous System — номер автономной системы отправителя | ||
| + | * Hold Time — максимальное время в секундах, | ||
| + | * BGP Identifier — играет роль в выборе пути пересылки BGP-сообщений при наличии более одного канала связи между BGP-соседями | ||
| + | * Optional Parameters Length — если равен 0, то в маркер записываются единицы, | ||
| + | * Optional Parameters — играет роль в формировании и последующем определении кода в поле маркер. | ||
| + | |||
| + | === Update === | ||
| + | |||
| + | **Update** — используется для обмена информацией маршрутизации. | ||
| + | |||
| + | Формат сообщения Update: | ||
| + | |||
| + | < | ||
| + | +-----------------------------------------------------+ | ||
| + | | | ||
| + | +-----------------------------------------------------+ | ||
| + | | Withdrawn Routes (variable) | ||
| + | +-----------------------------------------------------+ | ||
| + | | Total Path Attribute Length (2 octets) | ||
| + | +-----------------------------------------------------+ | ||
| + | | Path Attributes (variable) | ||
| + | +-----------------------------------------------------+ | ||
| + | | | ||
| + | +-----------------------------------------------------+ | ||
| + | </ | ||
| + | |||
| + | === Notification === | ||
| + | |||
| + | **Notification** — используется когда возникают ошибки BGP. После отправки сообщения сессия с соседом разрывается. | ||
| + | |||
| + | Формат сообщения Notification: | ||
| + | |||
| + | < | ||
| + | |< | ||
| + | |||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | Error code | Error subcode | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | | | | ||
| + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | </ | ||
| + | |||
| + | Кроме стандартного заголовка пакета BGP, в сообщении Notification такие поля: | ||
| + | |||
| + | * Error Code — тип оповещения: | ||
| + | * 1 — Message Header Error | ||
| + | * 2 — OPEN Message Error | ||
| + | * 3 — UPDATE Message Error | ||
| + | * 4 — Hold Timer Expired | ||
| + | * 5 — Finite State Machine Error | ||
| + | * 6 — Cease | ||
| + | |||
| + | === Keepalive === | ||
| + | |||
| + | **Keepalive** — используется для поддерживания отношений соседства, | ||
| + | |||
| + | Сообщения Keepalive состоят только из заголовка пакета (длина 19 октетов). | ||
| + | |||
| + | Если периодичность отправки keepalive-сообщений выставлена в 0, то сообщения не отправляются. | ||
| + | |||
| + | ==== Отношения соседства ==== | ||
| + | |||
| + | Для того чтобы установить отношения соседства, | ||
| + | |||
| + | Когда указывается сосед локального маршрутизатора, | ||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | Тип соседа мало влияет на установку отношений соседства. Более существенные отличия между различными типами соседей проявляются в процессе отправки обновлений BGP и добавлении маршрутов в таблицу маршрутизации. | ||
| + | |||
| + | BGP выполняет такие проверки, | ||
| + | |||
| + | - Маршрутизатор должен получить запрос на TCP-соединение с адресом отправителя, | ||
| + | - Номер автономной системы локального маршрутизатора должен совпадать с номером автономной системы, | ||
| + | - Идентификаторы маршрутизаторов (Router ID) не должны совпадать. | ||
| + | - Если настроена аутентификация, | ||
| + | |||
| + | < | ||
| + | У первого пункта проверки есть некоторая особенность: | ||
| + | </ | ||
| + | |||
| + | BGP выполняет проверку таймеров keepalive и hold, однако несовпадение этих параметров не влияет на установку отношений соседства. Если таймеры не совпадают, | ||
| + | |||
| + | === Состояния связи с соседями === | ||
| + | |||
| + | * Idle | ||
| + | * Connect | ||
| + | * Open sent | ||
| + | * Open confirm | ||
| + | * active | ||
| + | * Established | ||
| + | |||
| + | ^ Состояние ^ Ожидание TCP ^ Инициация TCP ^ Установлено TCP ^ Отправлено Open ^ Получено Open ^ Сосед Up ^ | ||
| + | | Idle | Нет | Нет | Нет | Нет | Нет | Нет | | ||
| + | | Connect | Да | Нет | Нет | Нет | Нет | Нет | | ||
| + | | Active | Да | Да | Нет | Нет | Нет | Нет | | ||
| + | | Open sent | Да | Да | Да | Да | Нет | Нет | | ||
| + | | Open confirm | Да | Да | Да | Да | Да | Нет | | ||
| + | | Established | Да | Да | Да | Да | Да | Да | | ||
| + | |||
| + | Если не совпали IP-адреса с соседом, | ||
| + | |||
| + | ===== Атрибуты пути (path attributes) ===== | ||
| + | |||
| + | Атрибуты пути разделены на 4 категории: | ||
| + | |||
| + | - ''' | ||
| + | - ''' | ||
| + | - ''' | ||
| + | - ''' | ||
| + | |||
| + | Примеры атрибутов BGP: | ||
| + | |||
| + | * Well-known mandatory: | ||
| + | * Autonomous system path | ||
| + | * Next-hop | ||
| + | * Origin | ||
| + | * Well-known discretionary: | ||
| + | * Local preference | ||
| + | * Atomic aggregate | ||
| + | * Optional transitive: | ||
| + | * Aggregator | ||
| + | * Communities | ||
| + | * Optional non-transitive: | ||
| + | * Multi-exit discriminator (MED) | ||
| + | * Originator ID | ||
| + | * Cluster list | ||
| + | |||
| + | ==== Autonomous system path ==== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Атрибут Autonomous system path (AS Path): | ||
| + | |||
| + | * Описывает через какие автономные системы надо пройти, | ||
| + | * Номер AS добавляется при передаче обновления из одной AS eBGP-соседу в другой AS. | ||
| + | |||
| + | Используется для: | ||
| + | |||
| + | * обнаружения петель | ||
| + | * применения политик | ||
| + | |||
| + | Каждый сегмент атрибута AS path представлен в виде поля TLV (path segment type, path segment length, path segment value): | ||
| + | |||
| + | * ''' | ||
| + | * 1 — AS_SET: неупорядоченное множество автономных систем, | ||
| + | * 2 — AS_SEQUENCE: | ||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | ==== Next-hop ==== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Атрибут **Next-hop** | ||
| + | |||
| + | * IP-адрес следующей AS для достижения сети назначения. | ||
| + | * Это IP-адрес eBGP-маршрутизатора, | ||
| + | * Атрибут меняется при передаче префикса в другую AS | ||
| + | |||
| + | Third party next hop: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== Origin ==== | ||
| + | |||
| + | Атрибут **Origin** — указывает на то, каким образом был получен маршрут в обновлении. | ||
| + | |||
| + | Возможные значения атрибута: | ||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | ==== Local preference ==== | ||
| + | |||
| + | Атрибут **Local preference**: | ||
| + | |||
| + | * Указывает маршрутизаторам внутри автономной системы как выйти за её пределы. | ||
| + | * Этот атрибут передается только в пределах одной автономной системы. | ||
| + | * На маршрутизаторах Cisco по умолчанию значение атрибута — 100. | ||
| + | * Выбирается та точка выхода у которой значение атрибута больше. | ||
| + | * Если eBGP-сосед получает обновление с выставленным значением local preference, он игнорирует этот атрибут. | ||
| + | |||
| + | ==== Atomic aggregate ==== | ||
| + | |||
| + | Метка, указывающая, | ||
| + | |||
| + | ==== Aggregator ==== | ||
| + | |||
| + | Список RID и ASN маршрутизаторов, | ||
| + | |||
| + | ==== Communities ==== | ||
| + | |||
| + | Атрибут community: | ||
| + | |||
| + | * Тегирование маршрутов | ||
| + | * Существуют предопределенные значения | ||
| + | * По умолчанию не пересылаются соседям | ||
| + | * Один из вариантов применения: | ||
| + | |||
| + | Значения от 0x00000000 до 0x0000FFFF и от 0xFFFF0000 до 0xFFFFFFFF зарезервированы. | ||
| + | |||
| + | Как правило community отображаются в формате ASN:VALUE. | ||
| + | |||
| + | В таком формате, | ||
| + | |||
| + | В первой части указывается номер автономной системы, | ||
| + | |||
| + | Некоторые значения communities предопределены. RFC1997 определяет три значения таких community. Эти значения должны одинаково распознаваться и обрабатываться всеми реализациями BGP, которые распознают атрибут community. | ||
| + | |||
| + | Если маршрутизатор получает маршрут в котором указано предопределенное значение communities, | ||
| + | |||
| + | Предопределенные значения communities (Well-known Communities): | ||
| + | |||
| + | * ''' | ||
| + | * ''' | ||
| + | * ''' | ||
| + | |||
| + | < | ||
| + | Маршрутизаторы которые не поддерживают атрибут community, будут передавать его далее, так как это transitive атрибут. | ||
| + | </ | ||
| + | |||
| + | ==== Multi exit discriminator (MED) ==== | ||
| + | |||
| + | Атрибут **MED**: | ||
| + | |||
| + | * Используется для информирования eBGP-соседей о том, какой путь в автономную систему более предпочтительный. | ||
| + | * Атрибут передается между автономными системами. | ||
| + | * Маршрутизаторы внутри соседней автономной системы используют этот атрибут, | ||
| + | * Чем меньше значение атрибута, | ||
| + | |||
| + | ==== Weight (проприетарный атрибут Cisco) ==== | ||
| + | |||
| + | Атрибут **Weight**: | ||
| + | |||
| + | * Позволяет назначить " | ||
| + | * Используется в тех случаях, | ||
| + | * Имеет значение только локально, | ||
| + | * Не передается в обновлениях. | ||
| + | * Чем больше значение атрибута, | ||
| + | |||
| + | ===== Выбор пути ===== | ||
| + | |||
| + | Характеристики процедуры выбора пути протоколом BGP: | ||
| + | |||
| + | * В таблице BGP хранятся все известные пути, а в таблице маршрутизации — лучшие. | ||
| + | * Пути выбираются на основании политик. | ||
| + | * Пути не выбираются на основании пропускной способности. | ||
| + | |||
| + | Сначала проверяется: | ||
| + | |||
| + | * Доступен ли next-hop ([http:// | ||
| + | * : Для того чтобы next-hop считался доступным (accessible), | ||
| + | |||
| + | ==== Cisco ==== | ||
| + | |||
| + | - Максимальное значение weight (локально для маршрутизатора). | ||
| + | - Максимальное значение local preference (для всей AS). | ||
| + | - Предпочесть локальный маршрут маршрутизатора (next hop = 0.0.0.0). | ||
| + | - Кратчайший путь через автономные системы. (самый короткий AS_PATH) | ||
| + | - Минимальное значение origin code (IGP < EGP < incomplete). | ||
| + | - Минимальное значение MED (распространяется между автономными системами). | ||
| + | - Путь eBGP лучше чем путь iBGP. | ||
| + | - Выбрать путь через ближайшего IGP-соседа. | ||
| + | - Выбрать самый старый маршрут для eBGP-пути. | ||
| + | - Выбрать путь через соседа с наименьшим BGP router ID. | ||
| + | - Выбрать путь через соседа с наименьшим IP-адресом. | ||
| + | |||
| + | ==== Juniper ==== | ||
| + | |||
| + | Если существует несколько маршрутов до одной сети назначения, | ||
| + | |||
| + | шаг алгоритма. Таким образом, | ||
| + | |||
| + | - проверка на доступность next-hop в локальной таблице маршрутизации. Если next-hop не доступен, | ||
| + | - маршрутизатор выбирает маршрут с наибольшим Local Preference атрибутом. | ||
| + | - маршрутизатор выбирает маршрут с кратчайшим AS Path length. | ||
| + | - маршрутизатор выбирает маршрут с наименьшим значением атрибута Origin (то есть отдается предпочтение IGP). | ||
| + | - маршрутизатор выбирает маршрут с наименьшим значением MED. Этот шаг выполняется, | ||
| + | - маршрутизатор выбирает маршруты, | ||
| + | - маршрутизатор выбирает маршрут с наименьшей метрикой IGP к анонсируемому BGP Next Hop. | ||
| + | - если используется Route Reflection для IBGP пиринга, | ||
| + | - маршрутизатор выбирает маршрут от партнера с наименьшим Router ID. | ||
| + | - маршрутизатор выбирает маршрут от партнера с наименьшим Peer Address. | ||
| + | |||
| + | <note important> | ||
| + | Только лучший путь помещается в таблицу маршрутизации и анонсируется BGP-соседям. | ||
| + | </ | ||