О проекте

Содержание:

NECCISCO

MTU’s in QinQ

QinQ between NEC and Cisco can transmit an MTU of 1500 without fragmentation.

Results:

ping 10.20.1.11 -M do -s "$((1500-20-8))" -c 1 > MTU_validation.txt
1480 bytes from 10.20.1.11: icmp_seq=1 ttl=64 time=0.434 ms

while adding 1 byte gave:

ping 10.20.1.11 -M do -s "$((1500-20-8+1))" -c 1
From 10.20.1.9 icmp_seq=1 Frag needed and DF set (mtu = 1500)

VLAN and QinQ VLAN on same port

After configuring both the NEC’s and Cisco’s VLAN 128 to be a service VLAN (as outlined in the Unit test sections) end-to-end communication was possible.

QinQ Traffic Simulations

TCP
Naboo’s VM hosts were capping out at ~230 Mbps for TCP traffic (+/- 7Mbps based on quick scanning of my iperf log files per 10sec over 10 minutes) This is a limitation of Naboo (VM server) and is not a limitation of any DUTs. This was with only 1 pair communicating — full 1Gb capacity was available. This bandwidth is less than the amount possible when the NEC<->HOP tests were conducted. However, there are quite a few more VMs on Naboo the now.

UDP
UDP testing indicated no packet-loss.

Simulated Network Topology

A single network site’s topology, as shown in the Overview diagram, is simulated for this test set up within a single switch to fully exercise the DUTs VLAN and QinQ capabilities. A single physical switch will be implementing both customer and service VLANs.

A VLAN trunk between a DUT’s customer and service VLANs looks like a «jumper» cable — a customer VLAN trunk must be created out of a customer-level switch trunk port and conencted to a service-level switch’s acess port. This is a consequence of simulating multiple virtual switches within a single physical switch This jumper is shown below in the Simulated Network Topology diagram. For complete end-to-end testing Two DUT’s, each configured as shown, would be connected using the respective QinQ port.

VLAN

VLAN is a technology to segment network into several broadcast domains. In each broadcast domain, users can communicate with each other freely. As for connections between different VLANs, VLAN tagging and inter VLAN routing are two necessary terms that users must know. VLAN tagging is to add a special tag into the frame when it passes through the VLAN trunk port which allows frames from different VLANs to cross. And one of its tagging methods is IEEE 802.1Q. In CLI and Web user interface, VLAN configuration is simple and easy. The following video shows how to configure VLAN (virtual LAN) via CLI (command-line interface) and Web user interface on FS S5800/S5850/S8050 series network switches. More about VLAN, you can read this artical:VLAN: How Does It Change Your Network Management?

Практика

Основой проектирования МКА является таблица.

  • По горизонтали пишем все-все возможные события.
  • По вертикали все состояния.
  • В клетках действия. Переход в новое состояние — это тоже действие.

Для кнопки это будет выглядеть вот так:

Состояние \ Событие Нажата Отпущена Нажата 20мс Нажата 250мс Нажата 1с Нажата 3с
Не Нажата
Кликнута
Нажата
Удержана
Слишком долго удержана

Зачем так сложно? Надо же описать все возможные состояния и учесть все возможные события.

События:

  • Нажата — это когда мы обнаружили, что контакт замкнут.
  • Отпущена — это когда выяснилось, что контакт разомкнут.
  • Нажата 20мс — надо учесть дребезг контактов и игнорировать размыкание какое-то время, дальше уже считатется, что клик.
  • Нажата 250мс — для клика 250мс достаточно, всё что дольше — это уже нажатие.
  • Нажата 1с — больше 1с это уже удержание.
  • нажата 3с — удержание больше 3с посчитаем ошибкой.

Время вы можете поставить своё, как вам удобно. Чтобы не менять потом в разных местах цифры, лучше сразу заменить их буквами 🙂

Состояния:

  • Не нажата — рапортуем, что никто кнопочку не трогал.
  • Дребезг — Ждём конец дребезга контактов.
  • Кликнута — был клик.
  • Нажата — кнопку нажали.
  • Удержана — кнопку нажали и подержали.
  • Слишком долго удержана — что-то пошло не так, предлагаю отказаться от нажатия в этом случае.

Итак, переводим русский язык на язык C++

Обращу внимание, что и события и состояния указаны не как целая переменная типа byte или int, а как enum. Такая запись не столь любима профессионалами так как не даёт экономить биты столь дорогой в микроконтроллерах памяти, но, с другой стороны очень наглядна

При использовании enum нас не заботит каким числом закодирована каждая константа, мы пользуемся словами, а не числами.

Давайте уже заполним таблицу. Значком -> я обозначу переход в новое состояние.

Состояние \ Событие Нажата Отпущена Нажата 20мс Нажата 250мс Нажата 1с Нажата 3с
Не Нажата ->Дребезг ->Не Нажата
Дребезг ->Не Нажата ->Кликнута
Кликнута ->Не Нажата ->Нажата
Нажата ->Не Нажата ->Удержана
Удержана ->Не Нажата ->Слишком долго удержана
Слишком долго удержана ->Не Нажата

Для реализации таблицы мы сделаем функцию void doEvent(enum event e). Эта функция получает событие и выполняет действие как описано в таблице.

VXLAN

VXLAN, also called virtual extensible LAN , is designed to provide layer 2 overlay networks on top of a layer 3 network by using MAC address-in-user datagram protocol (MAC-in-UDP) encapsulation. In simple terms, VXLAN can offer the same services as VLAN does, but with greater extensibility and flexibility. Similar to QinQ, VXLAN packets have a relatively fixed format too. With VXLAN MAC-in-UDP encapsulation, the original packets will be added on a VXLAN header and then placed in an UDP-IP packet. Here is a simple illustration.

VXLAN header: it consists of a 24-bit VNID which is used to identify layer 2 segments and to maintain layer 2 isolation between the segments. And all 24 bits in VNID define the number of LAN segments up to 16 million that VXLAN can support.

Outer UDP header: the VTEP (VXLAN Tunnel Endpoint) assigns the source port in the UDP header, and the destination port is typically the UDP port 4789.

Outer IP header: it has a source IP address of the source VETP associated with the inner frame source.

Outer Ethernet header: The outer Ethernet header has a source MAC address of the VTEP associated with the inner frame source.

So what is the problem?

Так если все так хорошо, в чем же проблема? Обновление имеет немало противников в сети, так как несмотря на все очевидные преимущества, оно имеет и свои слабые стороны. Рассмотрим некоторые из аргументов против.

  • Так как segwit является софт-форком, обновлены будут далеко не все клиенты, а значит в сети будут находится одновременно два вида UTXO, и такие важные изменения как устранение уязвимости id транзакций и хеширование за линейное время не будут применены к не сегвитовским выходам, а значит сеть все еще будет уязвима к атакам, основанным на изменяемости id транзакций, а также к проблеме квадратичного времени хеширования.
  • Segwit может уменьшить безопасность сети. Количество нод, проводящих полную валидацию, сильно уменьшится, так как только принявшие segwit смогут проверять witness часть транзакций.
  • Segwit не может быть отменен. Если его отменить и откатить все изменения обратно, все segwit-выходы станут доступными каждому.
  • Segwit пытается решить все проблемы сразу и, как следствие, огромное количество кода изменено. Это усложняет дальнейшую работу и увеличивает вероятность появления багов, которые будет сложнее устранить.

HP

Current Configuration

NOTE The actual password for the HP has been replaced with XXXXX for display. If you intend on using this output as a configuration you must replace XXXXX with the appropriate password.

habanero# show running-config 

Running configuration:

; J9452A Configuration Editor; Created on release #K.14.53o

hostname "habanero" 
max-vlans 2000 
module 2 type J94yyA 
module 3 type J94zzA 
module 5 type J94wwA 
module 6 type J94wwA 
no stack 
interface 1 
   unknown-vlans Disable 
exit
interface 4 
   unknown-vlans Disable 
exit
interface 6 
   unknown-vlans Disable 
exit
interface 8 
   unknown-vlans Disable 
exit
ip default-gateway 128.89.91.1 
vlan 1 
   name "DEFAULT_VLAN" 
   untagged 9,13-48,49-50,51-52 
   no untagged 1-8,10-12 
   no ip address 
   exit 
vlan 3702 
   name "VLAN3702" 
   untagged 11 
   tagged 5 
   no ip address 
   jumbo 
   exit 
vlan 3703 
   name "VLAN3703" 
   untagged 12 
   tagged 7 
   no ip address 
   jumbo 
   exit 
vlan 3704 
   name "VLAN3704" 
   untagged 10 
   tagged 5 
   no ip address 
   jumbo 
   exit 
vlan 900 
   name "VLAN900" 
   untagged 2-3 
   ip address 128.89.91.7 255.255.255.128 
   exit 
qinq mixedvlan
svlan 128
   name "VLAN128"
   tagged 1
   untagged 4
   exit
svlan 667
   name "VLAN667"
   tagged 1
   untagged 6
   exit
svlan 668
   name "VLAN668"
   tagged 1
   untagged 8
   exit
jumbo ip-mtu 1508
jumbo max-frame-size 1526
sntp server priority 1 192.1.249.10 3
ip ssh filetransfer
snmp-server community "public" unrestricted
oobm
   ip address dhcp-bootp
   exit
no tftp client
no tftp server
no autorun
password XXXXX

Useful Commands

HP ProCurve 6600 Useful Commands
The following are some notes taken while learning the HP switch syntax:
(no login username)
Enters «setup» screen to set things like the name (habanero), IP address and netmask:

setup 	
	System Name: habanero
	Default Gateway: 128.89.72.1
	IP Config 
	Spanning Tree Enabled 
	IP Address: 128.89.72.141
	Subnet Mask: 255.255.254.0
	"Save" saves and exits...

show relevant info

show 

IP address information

show ip	

VLAN information

show vlan	

VLANs Can Be Tagged and Untagged
Resets the configuration to a default state — make sure the current config is backed up before doing it!)

qinq mixedmode	

Other VLAN commands
vlan refers to customer VLANs, svlan refers to service VLANs

vlan 3702 untagged 37	        #Causes port 37 to stop tagging VLAN 3702 traffic (undoes a “vlan tag” command)
svlan 667 tagged 38	                #Causes port 38 to tags traffic as SVLAN 667 (turns it into a tunneling-trunk port)
int 45 unknown-vlans disable	#Disables GVRP 
int 45 unknown-vlans learn	#Enables GVRP
int 46 qinq port-type customer-network
vlan 1 no tagged 37,45,46	Removes the ports from VLAN 1 if they were configured as untagged participants
vlan 1 no untagged 37,45,46	Removes the ports from VLAN 1 if they were configured as tagging participants

Три подхода к реализации таблицы в код

План-А: if {} elsif {} else {}

Это первое, что приходит в голову начинающему. На самом деле, это неплохой вариант, если в таблице совсем мало заполненных клеток и действия сводятся только к смене состояний.

Плюсы:

  • Просто писать новичку, который впервые в руки взял ардуину.
  • Первое, что приходит в голову.

Минусы:

  • Сложно читать код.
  • Сложно модифицировать код, если что-то поменялось в таблице.
  • Ад, если большая часть клеток таблицы заполнена.

План-Б: Таблица указателей на функции

Другая крайность — это таблица переходов или функций. Я про такой подход писал в статье Обработка нажатий кнопок для Arduino. Скрестить ООП и МКА.. В двух словах, вы создаёте для каждой разной клетки таблицы отдельную функцию и делаете таблицу из указателей на них.

Плюсы:

  • Очень читаемый код. Не смейтесь. Достаточно один раз вкурить про массивы с указателями и вы получите простой красивый код. У вас табличка как табличка, ячейки отдельно расписаны — красота.
  • Легко писать.
  • Очень легко модифицировать логику.

Минусы:

Минус оказался таким жирным, что я после написания Обработка нажатий кнопок для Arduino. Скрестить ООП и МКА. и первого же применения кода в деле выпилил это всё нафиг. В итоге я пришёл к золотой середине «switch { switch {}}».

План-В: Золотая середина или switch { switch {}}

Самый распространённый, средний вариант — это использование вложенных операторов switch. На каждое событие как case оператора switch надо писать switch с текущим состоянием. Получается длинно, но более-менее понятно.

Умный компилятор всё-равно построит таблицу переходов, как описано в плане Б выше, но эта таблица будет в флеше, в коде и не будет занимать столь дорогую нам память переменных.

Плюсы:

  • Быстрый код.
  • Экономится память.
  • Логика понятна. Можно читать.
  • Легко менять логику.

Минусы:

На самом деле, можно использовать план-В и план-А, то есть, switch по событиям, но if внутри по состояниям. На мой вкус, switch и на то и на то понятнее и удобнее, если потребуется что-то потом поменять.

Про технологию QinQ

Технология QinQ улучшает использование VLAN, добавляя еще один тег 802.1Q к пакету, который уже имеет тег 802.1Q. Благодаря этой технологии система поддерживает до 4096 x 4096 VLAN. QinQ позволяет вставлять два заголовка VLAN в один кадр. Следовательно, пакеты, передаваемые в магистральной сети, имеют два заголовка тега 802.1Q: тег VLAN общедоступной сети и тэг VLAN частной сети.

По мере роста Metro Ethernet и развертывания большего числа сервисов существует множество сценариев, в которых могут применяться двойные теги QinQ. QinQ VLAN: пакеты с двумя тегами VLAN пересекают сети операторов. Внутренний тег VLAN прозрачно передается в общедоступную сеть. QinQ VLAN также представляет собой простую и практичную технологию L2VPN.

QinQ vs VLAN vs VXLAN: What’s the Difference?

VLANs have been used to solve different problems like Layer 2 network isolation, flood and as routing interface. VLAN supporting function is now available in most systems and network equipment such as Ethernet switches, routers and firewalls. However, the comparison in this post mainly focuses on VLAN tagging. To realize communication between different VLANs, VLAN tagging is an essential part.

As has mentioned above, VLAN tagging uses the protocol IEEE 802.1Q or ISL (Inter-Switch Link) to tag frames flowing through different VLANs. Frames that are tagged with this method have only one tag. However, QinQ technology is more flexible when compared with VLAN. On one hand, it can add tags to the incoming frames or packets selectively. On the other hand, the outer VLAN tag solves the problem of limited VLAN IDs. And the unique inner tag avoids conflict between the private VLAN IDs and the public VLAN IDs, providing a simple layer 2 VPN solution for small-scale or large enterprise networks.

Notes: VLAN belongs to public network.

When it comes to VXLAN, it offers the same functions as QinQ in some degree, but its working layer is more extensible. VXLAN encapsulates packets by MAC-in-UDP, extending layer 2 networks greatly. As we know, with the advancement of cloud computing, tenants have more demanding requirements for network builds, especially for the virtualized data center, which enhances the need for layer 2 networks. MAC-in-UDP supports the use of 24-bit VINDs, which allows a data center to accommodate multiple tenants and to break the physical distance restriction and deployment. That’s why VXLANs are becoming more popular in cloud computing and virtualization data center in recent years. However, compare to VLAN and QinQ, VXLAN technology is more expensive and complicated. Therefore, not all VLAN switches support this function. FS.COM S series 100G data center switches like S5850-48S2Q4C (20-port 40G QSFP+ switch with 4x 100G QSFP28 Uplink)and S8050-20Q4C(48-port 10G SFP+ switch with 2x 40g QSFP+ & 4x100g QSFP28 Uplink) support VXLAN and other data center features designed to offer high performance for Layer 2/3 networks.

Segregated witness benefits

Теперь, когда мы разобрались с технической частью, рассмотрим основные преимущеста segregated witness.

Transaction malleability

Одной из самых важных проблем, которые решает segwit является «изменяемость» транзакций, а если точнее, то их ID, являющиеся хешами. Разберемся немного подробнее.

В традиционном случае подписи, находящиеся внутри транзакции во входах, могут быть изменены третьей стороной без их инвалидации. Это позволяет изменять ID транзакции, являющийся ее хешем, не меняя никаких «фундаментальных» полей вроде входов/выходов/количества средств. Таким образом транзакция все еще валидна, однако теперь имеет другой ID, что создает возможность для разного рода атак, например denial-of-service.

Segwit решает эту проблему, т.к все подписи находятся снаружи транзакции, а значит не хешируются и их изменение никак не повлияет на ID транзакции. Также вводится отдельный идентификатор wtxid — он хеширует не только транзакцию но и всю witness часть, так что если транзакция передается без witness данных, то txid равен wtxid.

Решение данной проблемы позволяет создавать цепочки неподтвержденных транзакций без какого-либа риска — очень важное свойство для таких протоколов как Lightning Network

Network and Storage Scaling

Witness данные зачастую составляют самую большую часть транзакции. В скриптах наподобие multisig’a они могут занимать до 75% места используемого транзакцией. Благодаря segwit’y передача подписей становится опциональной — нода запрашивает их только если собирается проводить валидацию транзакции. SPV () клиенты или ноды, не поддерживающие сегвит, в таком случае могут не загружать лишние данные, экономя место на диске.

Block size increase and lower transaction fees

Segwit транзакции обходятся дешевле, нежели традиционные за счет скидки на хранение witness данных. Если быть точнее, то было изменено само понятие «размера» для segwit транзакций. Вместо обычного размера для них было введено понятие «виртуального размера» (virtual size) — все данные, хранящиеся в «witness», учитываются с коэффицентом в 0.25, что также позволяет разместить в блоке больше транзакций. Рассмотрим на примере.

Пусть у нас есть традиционная транзакция размером в 200 байт. В блок размера 1 МB поместится 5000 таких. Теперь возьмем ее segwit эквивалент, где примерно 120 байт это witness данные. Тогда ее vsize = 80 + 0.25 * 120 = 110 и теперь уже 9090 таких транзакций влезут в блок. Также при комиссии, допустим, в 40 satoshi/byte для 1ой транзакции мы получим комисси в 8000 сатоши, а для 2ой 4400 сатоши, что практически в два раза меньше.

Script Versioning

Как вы уже могли заметить, каждый locking script имеет байт, отвечающий за версию скрипта. Использование версий позволяет вносить дополнения и изменения (изменения в синтаксисе, новые операторы и тд.) в виде софт-форков.

Signature Verification Optimization

Segregated Witness также оптимизирует работу алгоритмов с подписями (CHECKSIG, CHECKMULTISIG и тд.). До segwit’a количество хеш-вычислений увеличивалось квадратично от количества подписей, в то время как в обновлении сложность алгоритма понижена до O(n).

QinQ

QinQ, also known as stacking VLAN or double VLAN, is standardized by IEEE 802.1ad. It encapsulated the VLAN tag with two layers—an inner tag of a private network and an outer tag of the public network. As there are increasing users in networks, which require large numbers of VLANs ID. The traditional VLAN tagging that uses IEEE 802.1Q is unable to identify and isolate users’ data on expanding metro Ethernet works. Therefore, QinQ is used to extend the VLAN numbers up to 4096×4096, which can save public VLAN IDs effectively.

QinQ packets have a fixed format. Usually an 802.11Q tagged packet is encapsulated in another 802.1Q tag, which is the name “QinQ” derives from. During transmission, packets are forwarded on the basis of the outer VLAN tag on the public network. The inner VLAN tag is taken as data that also transmitted on the public network. With this double tag form, QinQ packets have four more bytes than common 802.1Q VLAN tagged packets.

There are two kinds of QinQ implementations—basic QinQ and selective QinQ.

Basic QinQ is a tagging way based on port. When a packet arrives at the interface that has VLAN VPN enabled, the switch will tag the packet with its default VLAN tag. It doesn’t matter whether the incoming packet is tagged or not. If it has been tagged, then it will have double VLAN tags; if not, it will have a single VLAN tag with the switch port.

Selective QinQ Selective QinQ owns the functions of basic QinQ, but it is more flexible. It can identify the inner VLAN tag of the packets according to the MAC address, IP protocol, source IP address and VLAN tag, then determine which tag it should be added.

Немного теории

Так или иначе, но у вас есть объекты. Вы можете называть их кнопками, дисплеями, светодиодными лентами, роботами и измерителем уровня воды в бачке. Если ваш код выполняется не в одну ниточку последовательно, а по каким-то событиям, вы храните состояние объектов. Вы можете называть это как угодно, но это факт. Для кнопки есть, например, состояния «нажата» и «отпущена». Для робота, например: стоит, едет прямо, поворачивает. Количество этих состояний конечно. Ну, в нашем случае, да. Добавим состояния «клик», «нажатие» и «удержание». Уже пять состояний, которые нам надо различать. Причём, интересны нам лишь последние три. Этими пятью состояниями живёт кнопка. В страшном внешнем мире происходят события, которые от кнопки в общем-то никак не зависят: тыкания в неё пальцем, отпускания, удержания на разное время итп. Назовём их событие.

Итак, мы имеем объект «кнопка» у которого конечное количество состояний и на него действуют события. Это и есть конечный автомат (КА). В теории КА список возможных событий называют словарём, а события словами. Я дико извиняюсь, я это проходил 30 лет назад и плохо помню терминологию. Вам же не терминология нужна, правда?

В данной статье мы напишем замечательный код, который будет переводить наш КА из состояния в состояние в зависимости от событий. Он и является собственно машиной конечных автоматов (МКА).

Не обязательно всё ваше устройство запихивать в один огромный КА, можно разбить на отдельные объекты, каждый из которых обслуживается своей МКА и даже находится в отдельном файле кода. Многие свои объекты вы сможете поместить на GitHub в виде готовых библиотек ардуины и использовать потом не вникая в их реализацию.

Если ваш код не требует переносимости и повторного использования, можно всё лепить в один большой файл, что и делают как раз начинающие.

HPCISCO

MTU’s in QinQ

QinQ between NEC and HP can transmit an MTU of 1500 without fragmentation.

Results:

ping 10.20.1.11 -M do -s "$((1500-20-8))" -c 1 > MTU_validation.txt
1480 bytes from 10.20.1.11: icmp_seq=1 ttl=64 time=0.434 ms

while adding 1 byte gave:

ping 10.20.1.11 -M do -s "$((1500-20-8+1))" -c 1
From 10.20.1.9 icmp_seq=1 Frag needed and DF set (mtu = 1500)

See the NEC IP8800 Manual: Configuration Settings, Vol. 3, section 1.4.3 for more information.

VLAN and QinQ VLAN on same port

After configuring both the HP’s and Cisco’s VLAN 128 to be a service VLAN (as outlined in the Unit test sections) end-to-end communication was possible.

QinQ Traffic Simulations

TCP
Naboo’s VM hosts were capping out at ~230 Mbps for TCP traffic (+/- 7Mbps based on quick scanning of my iperf log files per 10sec over 10 minutes) This is a limitation of Naboo (VM server) and is not a limitation of any DUTs. This was with only 1 pair communicating — full 1Gb capacity was available. This bandwidth is less than the amount possible when the NEC<->HOP tests were conducted. However, there are quite a few more VMs on Naboo the now.

UDP
UDP testing indicated no packet-loss.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *