# 2. Cisco Express Forwarding

## Общая информация

Для ускорения коммутации и маршрутизации в оборудовании Cisco используется ряд технологий и наработок. Это как и использование особых типов памяти CAM и TCAM, так и технология CEF как логическая надстройка, снимающая лишние задачи с CPU при обработке пакетов и кадров.

Для начала рассмотрим, какие типы трафика обрабатывает коммутатор. Напомним, что кадры обрабатываются как на интерфейсах, так и на CPU, когда речь идет о кадрах, предназначенных самому коммутатору, или же если он сам их и генерирует.

*   **L2 трафик**

    * "Known" multicast - "известный" мультикаст, то есть когда на коммутаторе запущены процессы, умеющие с ним работать, например, IGMP Snooping
    * Known unicast - известный мультикаст
    * "BUM" (broadcast, unknown unicast, unknown multicast)


* **L3 трафик**
  * Unicast/Anycast
  * Multicast/Broadcast

Принцип работы L2 коммутатора заключается в том, чтобы отправить копию кадра во всех порты, кроме тех, которые попадают под ряд условий. Кадр не отправляется:

* в порт источника
* в другие порты в той же группе агрегации (речь об Etherchannel)
* в порты, где нет заведомо получателей для конкретного кадра (порты, с которых не было IGMP Join, при известном unicast, известном порту)

## Структура коммутатора

![](https://804939388-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LUAmDRmV-jNSoF58Ufl%2F-LhS2t4QCOxlOY9ZwALH%2F-LhS37jkEjvK3ScxSQiK%2Fimage.png?alt=media\&token=4e88e09c-0c8a-4015-b23d-85934dc6193d)

* ASIC - Application-Specific Integrated Circuit
  * С помощью ASIC анализируются пакеты и кадры
  * Является основным элементом Forwarding Engine
* Forwarding Engine может быть как одиночный (single), так и распределенный (distributed)

## CAM

CAM - Content Addressable Memory.

* Данный тип памяти предполагает адресацию по содержимому (так называемая ассоциативная память), а не просто по адресу ячейки, как в обычной RAM
* Часто состоит из обычной RAM и контроллера, который использует хитрую организацию RAM через таблицы хэшей или сбалансированные деревья.
* По заданному ключу память возвращает за конкретное время хранимую запись или сообщает об ее отсутствии  с ключом.
* CAM удобна для хранения в первую очередь MAC адресов. Пополнение памяти проходит за счет процесса изучения MAC адресов - MAC Learning.

## TCAM

TCAM - Ternary Content Addressable Memory.

* Данный тип памяти хранит "троичные" значения (отсюда и название типа памяти), с которыми сравнивается ключ.
* Троичные символы, используемые в TCAM: "1", "0", "не важно".
* Также, как и CAM, по заданному ключу память возвращает за конкретное время хранимую запись или сообщает об ее отсутствии  с ключом.
* Используется для ACL, FIB, при работе с задачами, где используются маски.

Физически TCAM состоит из двоичных комбинаций VMR:

* **V - Value.** Указатель на эталон для сравнения с ключом, 134 бита.
* **M - Mask.** Указатель на троичную маску эталона, 134 бита.
* **R - Result.** Числовой результат (permit, deny, указатель на полисер или next-hop)

Также используется компонент **LOU (Logical Operation Unit)**, который используется для L4 эталонов. За счет него обеспечивается выполнение таких регулярных выражений, как "eq", "neq", "gt", "lt", "range".

![](https://804939388-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LUAmDRmV-jNSoF58Ufl%2F-LhS2t4QCOxlOY9ZwALH%2F-LhS4DmEJGSmaE5YohOq%2Fimage.png?alt=media\&token=85c3ca6a-74b7-40c9-8652-3261a8309d6a)

TCAM может быть распределена под конкретные задачи. Для этого можно задать шаблон, который перераспределит память с нужными администратору параметрами. Данные шаблоны называются **шаблонами SDM (Switching Database Manager).**

```
SWITCH(config)# sdm prefer ?
```

После применения нужна перезагрузка.

![](https://804939388-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LUAmDRmV-jNSoF58Ufl%2F-LhS2t4QCOxlOY9ZwALH%2F-LhS4Ppby1klhQvkTaEt%2Fimage.png?alt=media\&token=9bb4766a-9ec8-4701-bbaa-a4504fa94773)

Посмотреть текущий шаблон и его параметры, а также утилизацию TCAM:

```
SWITCH#show sdm prefer
SWITCH#show platform tcam utilization
```

## Обработка трафика

САМ разбита фактически на разделы (L2 FIB, QoS, ACL и т. д.). В случае обращения к памяти запрос обрабатывается одновременно по всем разделам, и на основании их всех уже принимается решение по коммутации.

В случае использования L3 коммутаторов фактически мы имеем дело с виртуализацией сетевых функций: одного или нескольких свитчей в случае VLAN, одного или нескольких роутеров в случае с VRF. L3 свитч при выполнении "маршрутизации" коммутирует кадр по специальной таблице и перезаписывает некоторые его поля. При этом правила коммутации и перезаписи полей не зависит от содержимого пакета. L3 свитч меняет DA, SA; TTL, DA, SA в L3 вложении.

Все это удобно обрабатывать в TCAM.

## Topology-based Switching

Особенность CEF - интерфейс и next-hop IP просчитывается сразу при добавлении маршрута в RIB, чтобы при необходимости форвардинга трафика уже были просчитаны все данные для этого. В том числе и готов MAC-заголовок для next-hop.

```markup
ROUTER>sh ip cef 84.52.75.154
84.52.75.154/31
  nexthop 84.52.75.68 TenGigabitEthernet1/0/0.2006 label 5064
```

```markup
ROUTER>show adjacency 84.52.75.157 encapsulation 
Protocol Interface                 Address
IP       Vlan2025                  84.52.75.157(15)
  Encap length 14
  E48D8C0EABEB001E13E554C00800
                                   L2 destination address byte offset 0
                                   L2 destination address byte length 6
                                   Link-type after encap: ip
  Provider: ARPA
TAG      Vlan2025                  84.52.75.157(5)
  Encap length 14
  E48D8C0EABEB001E13E554C08847
                                   L2 destination address byte offset 0
                                   L2 destination address byte length 6
                                   Link-type after encap: tagswitch
  Provider: ARPA
```

## Таблицы CEF

* **FIB (Forwarding Information Base)** - таблица правил коммутации (что и куда коммутировать) (IP Routing Table)
* **Buckets** - таблица "балансировки"
* **Adjacencies** - таблица правил перезаписи (как модифицировать кадр). Наполняется L2 таблицами типа ARP или Frame-Relay Mapping Table

```
Switch# show ip cef [detail]
Switch# show ip cef <ip addr> <mask> detail 
```

```
Switch# show adjacency <intf type/number > [summary | detail]
Switch# show adjacency vlan <vlan-id> detail 
```

*   **Adjacencies состоит из нескольких подструктур:**

    * Cache - нормальная запись, для которой сформирован L2 Header
    * Receive - виртуальная запись для собственных маршрутов
    * Null - виртуальная запись для маршрутов в null0
    * Punt - виртуальная запись, где требуется process switching
    * Glean - запись для соседства, у которого не сформирован L2 Header
    * Discard/Drop -  виртуальная запись для сбрасываемых пакетов


* **Buckets:**

FIB может иметь несколько вариантов next-hop для одного префикса. Например, когда речь идет о маршрутах равной стоимости в OSPF или неравной в пределах variance в EIGRP. В зависимости от платформы бакетов может быть до 15. Трафик будет балансировать по хэш-алгоритму.

```
SWITCH#show ip cef 192.168.0.0 internal
```

* **Distributed CEF** - когда линейные карты пересылают транзитные пакеты без участия Routing Engine

## Варианты хэширующего алгоритма

```
ROUTER#ip cef load-sharing algorithm
```

* **Original** - хэш от L3 Header
* **Universal** - хэш от L3 Header и "соли" (universal id - случайное значение)
* **Include**-**ports** - хэш от L3 и L4 Header'ов
* **Tunnel** - хэш для туннелей, считается от L3 Header и "соли"

Различные варианты хэш алгоритма используются для избежания такой проблемы, как **CEF Polarization**, когда используется один алгоритм для всех устройств в сети, в результате балансировка происходит с неполной утилизацией каналов, так как трафик постоянно ходит по одним и тем же линкам.

## Управление CEF

По умолчанию CEF включен на всех новых платформах. На некоторых платформах CEF невозможно отключить, об этом сообщит консоль при попытке отключения.

Отключается CEF глобально по команде:

```
SWITCH(config)#no ip cef
SWITCH(config)#no ipv6 cef
```

Отключение на интерфейсе:

```
SWITCH(config)#interface vlan 1
SWITCH(config-if)#no ip route-cache cef
SWITCH(config-if)#no ipv6 cef
```

## Non-CEF пакеты

Часть пакетов не может быть обработана CEF:

* ARP запросы
* Пакеты, адресованные CPU
* Траффик протоколов маршрутизации
* CDP
* Зашифрованные пакеты

```
Switch# show cef drop
```
