Как определить позицию, с которой начинается BGP протокол в пакете MPLS?
Как в потоке данных узнать точную позицию, с которой начинается протокл BGP, если тип пакета MPLS, а после mpls header может идти как ip протокол, так и ethernet заголовок и др. Не могу понять, как из этого узнать длину пакета до начала BGP протокола.
Валентин, потому что, как я понял, после mpls не обязательно всегда сразу идёт ip, иногда сначала нужно пройти Ethernet, VLAN или Control word. И я не понимаю, как определить, что следует за MPLS, а моя задача добраться до BGP
irdr, для понимания сути задачи уточню: Вы же понимаете, что тот BGP, который Вы, может быть, вдруг найдёте вложенным в MPLS-пакет, к L2VPN/L3VPN/EVPN MP-BGP-сессии, породившей этот пакет, отношения иметь не будет?
Тот BGP, из которого станет ясно, что именно там внутри, будет не "внутри", а "рядом".
Вероятно, проще было бы разобрать тот "рядом" находящийся MP-BGP, в котором P-маршрутизаторы договорились о типе сервиса и номерах меток...
Ярослав, под "внутри" вы подразумеваете BGP, который находится в TCP этого пакета?
А тогда, где находится протокол, который "рядом"?
(Простите я еще только начал разбираться в этой теме)
Валентин, но encapsulation type указывает только на тип первого заголовка (например ethernet), который указывает, например, на тип MPLS, а вот после него (всё в том же пакете) может идти второй заголовок, который не обязательно того же типа, что и первый
irdr, дело происходит примерно так.
Я беру самый простой случай, без промежуточных P-маршрутизаторов.
Сразу предупреждаю: будет куча неточностей во имя простоты, но я старался передать общий дух происходящего )
Итак, есть два маршрутизатора:
Маршрутизатор A: IP 10.0.0.1/30, MAC 00:00:00:00:00:01
Маршрутизатор B: IP 10.0.0.2/30, MAC 00:00:00:00:00:02
Для простоты - чтобы не получилась Война и Мир, предлагаю считать, что BGP мы поднимаем не между лупбеками, а непосредственно между сетевыми интерфейсами. Будет у нас что-то типа Inter-AS Option B ;)
Сервер A подключен к маршрутизатору A.
Сервер B подключен к маршрутизатору B.
Необходимо сделать так, чтобы Серверы A и B оказались в одном и том же VPN, для определённости, пусть это будет L3VPN.
Схема будет примерно такой:
[Сервер А] --- [Маршрутизатор A] --- [Маршрутизатор B] --- [Сервер B]
1. Итак, акт первый.
1.1. Маршрутизатор A -> Маршрутизатору B: Привет! Давай дружить по BGP! Я умею MP-BGP!
1.2. Маршрутизатор B -> Маршрутизатору A: Привет! Давай! Я тоже умею MP-BGP!
Маршрутизаторы A и B поднимают BGP-сессию, используя адреса 10.0.0.1 и 10.0.0.2
Параллельно, они договариваются о транспортных метках, например, по протоколу LDP:
1.3. Маршрутизатор A -> Маршрутизатору B: Давай, если полученный MPLS-пакет адресован мне, и пересылать его дальше никому не надо, первой MPLS-меткой будет 0!
1.4. Маршрутизатор B -> Маршрутизатору A: Давай! И если ты шлёшь пакет именно мне, не транзитом, пусть тоже 0 будет!
// На самом деле, 0 - это специальное зарезервированное значение метки под названием Explicit Null, а если по-русски, "Это тебе, лови!", но для определённости будем считать, что маршрутизаторы и об этом значении договорились явно.
2. Акт второй.
2.1. Маршрутизатор A -> Маршрутизатору B по протоколу BGP: Привет! У меня тут L3VPN появился, "Рога и Копыта Телеком", а в нём какой-то "Сервер А". Ты про "РиК Телеком" слышал что-нибудь?
2.2. Маршрутизатор B -> Маршрутизатору A по протоколу BGP: Привет! Да, у меня в "РиК Телеком" есть "Сервер В". Давай договоримся, что в РиК сервисной меткой будет 100!
2.3. Маршрутизатор A -> Маршрутизатору B по протоколу BGP: Договорились!
3. Акт третий.
3.1. Сервер A -> Серверу B: ping!
3.2. Маршрутизатор A получает ping! (Сервер A -> Серверу B). Его размышления:
3.2.1. Сервер А это "Рога и Копыта Телеком", значит, сервисная метка = 100
3.2.2. Сервер В в VPN "РиК Телеком" ко мне напрямую не подключен.
Зато, я знаю, что он подключен к Маршрутизатору В!
IP-адрес Маршрутизатора В - 10.0.0.2. Уж ты! Я с ним в одной подсети 10.0.0.0/30!
Блин, это ж MPLS, там нет транспортных IP-адресов...
Ну и что, что нет, я же с ним в одной Ethernet-подсети!
3.3. Маршрутизатор A посылает ARP-запрос: Эй, там, напомните, у кого IP-адрес 10.0.0.2?
3.4. Маршрутизатор В: Да здесь я, мой MAC 00:00:00:00:00:02!
3.5. Маршрутизатор А собирает MPLS-пакет и отправляет его по Ethernet:
[Source MAC] 00:00:00:00:00:01: "Это от Маршрутизатора А, хотя всем пофиг"
[Destination MAC] 00:00:00:00:00:02: "Ethernet switch, доставь это Маршрутизатору В!"
[Транспортная MPLS-метка] 0: "Маршрутизатор В, как получишь, разбирай пакет сам, никому пересылать его не надо!"
[Сервисная MPLS-метка с установленным флажком "End of stack" ("Больше меток нет")] 100: "VPN Рога и Копыта Телеком"
[ping! (Сервер A -> Серверу B)]
Ярослав, Сейчас у вас написана полная каша. И логика работы расписана неверно с шага 1.3, а в 3.3.2 вообще какая-то неразбериха. Расписывать Сети для самых маленьких (части L3VPN и MPLS) в ответах не представляется возможным.
Кто вам Сказал, что у вас OptB? У вас разные ASN на маршрутизаторах? Зачем?
И из расписанной вами логики не понятно, зачем искать заголовки BGP в пакете MPLS.