3. Принцип обработки пакетов

Обработка пакета в NFWare Load Balancer работает по принципу, схожему с IPVS.

Поиск RS сначала осуществляется по таблице соединений, потом по таблице Persistence и только после этого отправляется в модуль балансировки. Соединение содержит в себе информацию о Sourse/Destination IP-адресах и портах, протоколе (TCP/UDP), а также информацию о RS, который его обслуживает. Persistence содержит в себе информация о Source IP, SID и RS, который его обслуживает.

Подробней про обработку пакета можно узнасть из блок-схемы, представленной ниже:

digraph G {
   bgcolor="transparent";
   comment="Pipeline of packet processing";
   node [fontsize=12, height=.2, width=.25, color="#000000", fontcolor="#000000"];
   edge [fontsize=12, arrowsize=.8, color="#000000", fontcolor="#000000"];

     RCV [shape=box, label="Получение пакета"];
     CONN_EXIST_COND [shape=diamond, conditional=true, label="Есть ли \nинформация о соединении\n в таблице?"];
     GET_FROM_C [shape=box, label="Информацию о RS берем \nиз таблицы соединений"];
     P_ENABLE_COND [shape=diamond, conditional=true, label="Включен ли\nPersistence в настройках\n сервиса?"];
     P_EXIST_COND [shape=diamond, conditional=true, label="Есть ли\nсоответствующая запись в \nтаблице Persistence?"];
     GET_FROM_P [shape=box, label="Информацию о RS берем \nиз таблицы Persistence"];
     BAL [shape=box, label="Балансировка/Выбор RS"];
     CRT_C [shape=box, label="Заполняем таблицы соединений \nи Persistence (если нужно)"];
     SND [shape=box, label="Отправка пакета"];

     RCV -> CONN_EXIST_COND
     CONN_EXIST_COND -> GET_FROM_C [label="  Да "];
     CONN_EXIST_COND -> P_ENABLE_COND [label="  Нет "];
     P_ENABLE_COND -> P_EXIST_COND [label="  Да "];
     P_EXIST_COND -> GET_FROM_P [label = " Да "]
     P_EXIST_COND -> BAL [label = " Нет "];
     P_ENABLE_COND -> BAL [label = " Нет " ];
     BAL -> CRT_C;
     GET_FROM_P -> CRT_C;
     GET_FROM_C -> SND;
     CRT_C -> SND;

     subgraph "cluster_#1" {
       label="Fast Path";
       color="#0000ff";
       CONN_EXIST_COND; GET_FROM_C
     }
 }
digraph G {
   bgcolor="transparent";
   comment="Pipeline of packet processing";
   node [fontsize=12, height=.2, width=.25, color="white", fontcolor="white"];
   edge [fontsize=12, arrowsize=.8, color="white", fontcolor="white"];

     RCV [shape=box, label="Получение пакета", color="white", fontcolor="white"];
     CONN_EXIST_COND [shape=diamond, conditional=true, label="Есть ли \nинформация о соединении\n в таблице?", color="white", fontcolor="white"];
     GET_FROM_C [shape=box, label="Информацию о RS берем \nиз таблицы соединений", color="white", fontcolor="white"];
     P_ENABLE_COND [shape=diamond, conditional=true, label="Включен ли\nPersistence в настройках\n сервиса?", color="white", fontcolor="white"];
     P_EXIST_COND [shape=diamond, conditional=true, label="Есть ли\nсоответствующая запись в \nтаблице Persistence?", color="white", fontcolor="white"];
     GET_FROM_P [shape=box, label="Информацию о RS берем \nиз таблицы Persistence", color="white", fontcolor="white"];
     BAL [shape=box, label="Балансировка/Выбор RS", color="white", fontcolor="white"];
     CRT_C [shape=box, label="Заполняем таблицы соединений \nPersistence (если нужно)", color="white", fontcolor="white"];
     SND [shape=box, label="Отправка пакета", color="white", fontcolor="white"];

     RCV -> CONN_EXIST_COND
     CONN_EXIST_COND -> GET_FROM_C [label="  Да "];
     CONN_EXIST_COND -> P_ENABLE_COND [label="  Нет "];
     P_ENABLE_COND -> P_EXIST_COND [label="  Да "];
     P_EXIST_COND -> GET_FROM_P [label = " Да "]
     P_EXIST_COND -> BAL [label = " Нет "];
     P_ENABLE_COND -> BAL [label = " Нет " ];
     BAL -> CRT_C;
     GET_FROM_P -> CRT_C;
     GET_FROM_C -> SND;
     CRT_C -> SND;

     subgraph "cluster_#1" {
       label="Fast Path";
       color="green";
       CONN_EXIST_COND; GET_FROM_C
     }
 }