Customizing SDN Control. Part 1 (rus)

by Sasha Shkrebets last modified Mar 06, 2023 01:11 PM
Мы продолжаем наше обсуждение плоскости управления, и в этом уроке мы рассмотрим, как использовать контроллер SDN для настройки поведения плоскости управления.

С возвращением. Мы продолжаем наше обсуждение плоскости управления, и в этом уроке мы рассмотрим, как использовать контроллер SDN для настройки поведения плоскости управления. Мы будем использовать контроллер POX, который мы обсуждали в последнем уроке, для примеров, которые мы рассмотрим в этом уроке. Мы рассмотрим основные операции концентратора и коммутатора, затем будем использовать Mininet для настройки простой топологии, и мы будем использовать POX Controller для управления поведением коммутатора, который мы установили в этой топологии. Затем мы будем использовать POX Controller для реализации двух различных типов управления в топологии сети. Концентратор, который просто пересылает весь трафик из всех выходных портов, и обучающий коммутатор, который изучает записи таблицы пересылки на основе портов, на которые поступают входящие пакеты. Для обоих примеров мы рассмотрим записи таблицы потока с использованием dpctl и, в частности, мы рассмотрим, как записи таблицы потока различаются, и мы также пройдем код для каждого из этих двух примеров управления. Давайте сначала используем Mininet, чтобы настроить пример топологии, как мы делали раньше. Мы будем использовать простую трехузловую топологию с одним открытым vSwitch для подключения этих трех узлов. Даже без контроллера мы можем использовать dpctl для связи с этим коммутатором для выполнения таких операций, как проверка текущих записей таблицы потока, существующих в коммутаторе. Используя Mininet, мы настраиваем нашу одноузловую топологию с Open vSwitch и опцией, которая указывает, что мы хотим использовать пульт дистанционного управления. На данный момент у нас есть три хоста, соединенных одним открытым vSwitch, но мы еще не создали экземпляр контроллера. Поэтому, если мы попытаемся выполнить эхонг между хостом и топологией, мы видим, что хосты фактически не могут достичь друг друга. Это также подтверждается взглядом на dpctl. Если мы сбросим записи таблицы потока и коммутатор, мы увидим, что коммутатор фактически не имеет записей таблицы потока, поэтому хосты не могут достичь друг друга. Прежде чем присоединить контроллер, который ведет себя как коммутатор hubber, давайте сначала рассмотрим, что делает концентратор. В концентраторе информация о пересылке фактически не хранится на коммутаторе, который соединяет узлы и сеть. Таким образом, когда входной пакет поступает на определенный порт, коммутатор просто пересылает этот пакет из всех выходных портов. Чтобы узнать, как это работает с POX, рассмотрим приложение POX Hub. Место, чтобы начать смотреть на код, находится в hub.py, который содержит две функции. Один из них - метод запуска, который просто добавляет прослушиватель , который прослушивает переключатели OpenFlow для подключения к нему. В этом случае, когда мы запускаем концентратор, Open vSwitch, который мы создали с помощью топологии Mininet, попытается подключиться к нашему хабу. Давайте теперь посмотрим, что происходит, когда мы запускаем POX Controller, используя функциональность концентратора. При запуске POX мы видим немного информации, включая информацию о коммутаторе OpenFlow, который подключился к этому концентратору. Этот коммутатор, в частности, является открытым vSwitch, который мы создали в топологии Mininet. Если мы посмотрим на нашу новую топологию Mininet, мы увидим , что теперь у нас есть контроллер, обозначенный как C0. Это контроллер POX, работающий с функциональностью концентратора, который мы теперь рассмотрим немного более подробно. Возвращаясь к коду в hub.py, теперь мы видим, что происходит, когда контроллер POX получает попытку подключения от коммутатора OpenFlow. На слайде показан весь POX-код для реализации контроллера-концентратора. Метод подключения дескриптора просто создает сообщение изменения потока, которое мы отправим обратно в Open vSwitch, сообщив коммутатору изменить его записи таблицы потока. Таким образом, мы сначала создаем сообщение, и в этом сообщении мы добавляем конкретное действие, которое просто отправляет пакеты на все выходные порты. После того, как мы создали метод модификации таблицы потока OpenFlow, мы просто отправляем это сообщение коммутатору на соединение, которое у нас есть из Open vSwitch. Если мы теперь попытаемся проверить все узлы в топологии, мы видим, что все узлы могут достичь друг друга, и если мы используем dpctl, чтобы посмотреть на потоки, которые хранятся в Open vSwitch, теперь мы видим, что есть запись таблицы потока, действие которой заключается в потоке. Итак, чтобы просмотреть то, что мы только что сделали, мы взяли нашу топологию Mininet и запустили POX Controller под управлением hub.py, который просто выполнил функциональность, которую мы показывали на предыдущем слайде. Теперь, что мы собираемся сделать, это изменить методы управления, которые работают на контроллере POX, чтобы контроллер мог заставить коммутатор реализовать обучающий коммутатор, а не просто простой концентратор. Давайте сначала рассмотрим, что делает обучающий коммутатор и чем он отличается от хаба. Поэтому, если вы помните, когда пакет поступает на входной порт на концентраторе, концентратор просто пересылает этот пакет на все выходные порты. С другой стороны, обучающий коммутатор ведет себя немного иначе, потому что при поступлении этого входного пакета коммутатор узнает, как добраться до конкретного места назначения, отправляющего пакет на коммутатор. Например, на рисунке здесь мы видим, что пакет поступает из A. В этот момент коммутатор может проверить исходный MAC-адрес для этого пакета, а затем определить, что пакеты, предназначенные для этого MAC-адреса источника для A, должны отправляться на выходной порт в левой части переключитесь сюда. Другими словами, каждый входящий кадр заставляет коммутатор создавать новую запись таблицы потока. Чтобы заставить контроллер POX вызвать это поведение на Open vSwitch, мы подключаем контроллер POX, как и раньше, но вместо того, чтобы запустить код концентратора, который мы только что рассмотрели, мы собираемся запустить другой набор методов, который находится в файле l2_learning.py в дистрибутиве POX. Давайте впрыгнем и взглянем на алгоритм переключения обучения, который реализован в этом файле Python. [ BLANK_AUDIO]. Алгоритм имеет несколько шагов. Первым шагом является использование адреса источника пакета и порта коммутатора для обновления таблицы адресов и портов, которые контроллер поддерживает в качестве хэш-таблицы. Во-вторых, отбрасывать определенные типы пакетов. Третье — проверить, является ли адресат пакета адресатом многоадресной рассылки. Если это так, контроллер предписывает коммутатору затопить пакет на всех выходных портах. Если адрес назначения для пакета еще не содержится в хэш-таблице, которая поддерживается на контроллере для сопоставления адресов с портами, контроллер предписывает коммутатору вести себя как концентратор, заполняя трафик из всех выходных портов. Если выходной порт совпадает с входным портом, контроллер предписывает коммутатору сбросить пакет, чтобы избежать петли. В противном случае контроллер отправляет коммутатору запись изменения таблицы потока. Эта запись изменения таблицы потока аналогична той, которую мы рассматривали в примере концентратора, но разница заключается в том, что запись таблицы потока специфична для порта, на который прибыл пакет, и адреса, содержащегося в поле адреса источника входящего пакета. Контроллер принимает адрес источника для пакета и входящего порта, на который прибыл пакет, и вставляет запись таблицы потока в коммутатор, которая предписывает всем будущим пакетам, предназначенным для этого адреса, перенаправляться только из этого выходного порта, а не затопляться. из всех выходных портов. Давайте очистим топологию Mininet, которая у нас была раньше, и начнем ее снова. Теперь вместо того, чтобы присоединить контроллер POX с логикой управления концентратором, давайте вместо этого подключим контроллер POX, который запускает алгоритм обучающего коммутатора, который мы только что прошли. Таким образом, как только мы запустим контроллер, мы видим, что , как и прежде, наш Open vSwitch подключился к контроллеру, и если мы попытаемся проверить все хосты, мы можем снова увидеть, что хосты могут общаться друг с другом. Теперь это поведение выглядит так же, как и раньше, но разница возникает, когда мы смотрим на dpctl, чтобы сбросить поплавки. То, что мы видим сейчас в коммутаторе, - это куча различных записей таблицы потока. То, что мы видим, это то, что каждая запись таблицы потока имеет определенный адрес назначения и выходной порт, на который будут пересылаться пакеты для этого назначения. Давайте очень быстро рассмотрим код Python, который работает на контроллере POX. Теперь, как и прежде, у нас есть метод запуска, который регистрирует объект обучения l2 с основным контроллером POX. После создания экземпляра этот объект добавляет прослушиватель, чтобы убедиться, что он может обрабатывать события подключения от коммутаторов OpenFlow, которые пытаются подключиться к этому контроллеру. При попытке подключения с коммутатора OpenFlow этот объект затем создает экземпляр объекта обучающего коммутатора и передает событие подключения этому объекту. Когда мы копаемся в этом конкретном объекте, мы видим, что при создании экземпляра мы создаем эту хэш-таблицу, сопоставляющую адреса портам. Мы добавляем прослушиватель для пакета в сообщениях, а затем реализуем пакет в обработчике. Я не буду вдаваться во все детали реализации пакета в обработчике, но давайте просто спустимся к той части кода, которая реализует алгоритм обучающего коммутатора. Итак, если мы перейдем к этой конкретной строке, мы сможем увидеть начало алгоритма. Первым шагом является назначение записи в MAC-таблице портов, которая сопоставляет MAC-адрес источника пакета с портом, на который поступил пакет. Для удаления определенных типов пакетов, для переполнения, если назначение пакета является многоадресным пакетом, для переполнения, если назначение пакета еще не находится в MAC-адресе для сопоставления выходного порта, для проверки того, совпадает ли назначенный выходной порт, если он существует, с портом, на котором пакет прибыл и отбросить пакет, если входной порт и выходной порт одинаковы. И, наконец, установка записи таблицы потока в Open vSwitch, которая соответствует определенным свойствам пакета и отправляет пакет из выходного порта, соответствующего порту, который он только что узнал, что он должен отправлять будущие пакеты на основе порта, на который прибыл пакет. Наконец, после создания этого сообщения изменения потока контроллер отправляет его коммутатору. Подводя итог, мы рассмотрели основные операции концентратора и коммутатора. Мы создали простую топологию Mininet и использовали POX Controller для реализации функций концентратора и коммутатора, а также изучили, как реализовать эти два типа управления внутри структуры управления POX. Мы рассмотрели, как поведение отличалось с точки зрения записей таблицы потока и коммутатора с помощью dpctl, и мы также прошли через сам код.

Navigation