Теоретические основы и архитектура
Архитектура MPLS чётко разделяет роли маршрутизаторов и таблицы маршрутизации. LER (Label Edge Router) находится на границе домена MPLS: входящий ingress LER классифицирует IP-пакет, определяет FEC и добавляет стек меток (Push), а выходной egress LER снимает метку (Pop) и отправляет чистый пакет клиенту. В операторских сетях LER называют PE (Provider Edge), а клиентское устройство — CE (Customer Edge). Внутри ядра работают LSR (Label Switching Router), называемые P (Provider) маршрутизаторами: они не смотрят в IP-заголовок, а выполняют замену метки (Swap) на основе входящей метки. Для этого используются 4 таблицы: RIB (Routing Information Base — общая база протоколов IGP/BGP), FIB (Forwarding Information Base — аппаратная таблица IP-пересылки CEF), LIB (Label Information Base — все метки, полученные от LDP-соседей) и LFIB (Label Forwarding Information Base — рабочая таблица меток в Data Plane). Наличие префикса в RIB не означает автоматической доставки: пока префикс не привязан к исходящей метке в LFIB, коммутация по меткам невозможна.
Роли устройств: кто что решает
В MPLS роль определяется не моделью маршрутизатора, а тем, какую операцию он выполняет над пакетом. LER (Label Edge Router) стоит на границе домена: на входе (ingress) он берёт обычный IP-пакет, делает поиск по FIB (longest prefix match), определяет FEC и накладывает метку (push); на выходе (egress) снимает последнюю метку и делает обычный IP-поиск либо поиск в VRF. В операторской терминологии LER обычно называют PE (Provider Edge), а клиентский маршрутизатор - CE (Customer Edge). CE ничего не знает про MPLS: он шлёт чистый IP и общается с PE по статике, OSPF, BGP. LSR в ядре называют P (Provider): он коммутирует пакеты только по верхней метке и не имеет ни клиентских маршрутов, ни VRF. Отсюда принцип BGP-free core: клиентские префиксы (сотни тысяч) живут только на PE, а на P нужны лишь loopback'и PE и стыки - несколько сотен записей в LFIB. Один и тот же физический маршрутизатор может быть PE для одних сервисов и P для транзита других; RR (route reflector) - отдельная control-plane роль и в пути данных обычно не участвует.
Четыре структуры: RIB, FIB, LIB, LFIB
RIB строится протоколами маршрутизации (connected, static, IGP, BGP) и содержит все кандидаты с метриками и административными дистанциями. FIB - оптимизированная копия лучших маршрутов для пересылки IP (на Cisco это CEF вместе с таблицей смежности/adjacency, на Junos - forwarding table в PFE, на Huawei - FIB на интерфейсных платах). LIB (Label Information Base) - программная база всех привязок «префикс -> метка»: и local binding (метка, которую маршрутизатор выделил сам и анонсирует соседям), и remote binding (метки, полученные от каждого LDP-соседа, даже от того, кто не является next-hop). LFIB - то, что реально используется для коммутации: по одной записи на входящую метку с действием и исходящей информацией. Для данных значима именно связка FIB (для push на ingress) и LFIB (для swap/pop на транзите и egress); LIB - это control-plane склад, из которого эти записи выбираются. Терминология RFC 3031 в этих же понятиях: FTN (FEC-to-NHLFE) - правило ingress, ILM (Incoming Label Map) - поиск по входящей метке, NHLFE (Next Hop Label Forwarding Entry) - действие, исходящая метка и next-hop.
Названия по вендорам: Cisco - show mpls ldp bindings (LIB), show mpls forwarding-table (LFIB), show ip cef (FIB с метками). Junos - inet.0 (RIB), inet.3 (маршруты до PE с меткой push, ими пользуется только BGP для разрешения next-hop), mpls.0 (транзитные swap/pop по входящей метке); LIB отдельно смотрится через show ldp database. Huawei - display ip routing-table, display fib, display mpls lsp. MikroTik - /ip/route, /mpls/ldp/local-mapping + /mpls/ldp/remote-mapping, /mpls/forwarding-table.
Откуда берётся метка для префикса
По умолчанию метка выделяется независимо от остальной сети (downstream unsolicited, liberal label retention; ordered/independent control зависят от платформы): как только IGP-маршрут появился в RIB, LSR создаёт local binding и анонсирует его всем LDP-соседям в сообщении Label Mapping (FEC TLV + Label TLV). Cisco делает это для всех IGP-префиксов, включая стыки, поэтому mpls ldp label / allocate global prefix-list сокращает список до loopback'ов /32 - это снижает размер LIB. Huawei по умолчанию запускает LSP только для host-маршрутов /32 (lsp-trigger host), Junos по умолчанию анонсирует только адрес loopback (lo0), остальное нужно разрешать egress-policy. Если префикс подключён непосредственно или это сам маршрутизатор - он egress для FEC и анонсирует implicit null (метка 3): предпоследний хоп снимает метку сам (PHP), а egress избавлен от двойного поиска. Зарезервированные значения 0-15: 0 - explicit null IPv4, 1 - router alert, 2 - explicit null IPv6, 3 - implicit null (никогда не появляется на проводе), 7 - ELI, 13 - GAL, 14 - OAM alert. Динамический диапазон начинается с 16 (Cisco IOS-XE), Junos выделяет метки LDP с 299776, на Huawei VRP обычно с 1024 (диапазон зависит от версии).
Ключевое правило: LDP сопоставляет FEC и маршрут по точному совпадению префикса. Привязка 10.255.0.2/32 пригодна, только если в RIB есть именно 10.255.0.2/32, а next-hop этого маршрута совпадает с LDP-соседом, приславшим метку. Метки от остальных соседей остаются в LIB (liberal retention) как резерв: при смене лучшего пути LFIB перестраивается без новых запросов.
Поиск на каждой роли
Ingress PE: FIB (LPM по IP-адресу назначения) -> запись содержит next-hop и исходящую метку (на Cisco label 17-(local:21) в show ip cef detail) -> push; TTL метки копируется из IP TTL (propagation включена по умолчанию), а EXP/TC берётся из DSCP по политике. Транзитный P: точный (не LPM) поиск по 20-битной входящей метке в LFIB -> swap на новую метку, TTL уменьшается на 1. Предпоследний P: исходящая метка = implicit null, поэтому действие Pop (Cisco Pop Label, Junos Pop); пакет уходит к egress с одной меткой меньше. Egress PE: если осталась только VPN-метка, она определяет VRF или интерфейс; для чистого IPv4 LSP пакет приходит уже без метки и обрабатывается обычным IP-поиском. Поиск по LFIB быстрее и проще, чем LPM: хеш/индекс по 20 битам вместо поиска по префиксу.