Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
ru:software:freebsd:ng_utp [2015/05/15 22:38] root создано |
ru:software:freebsd:ng_utp [2015/05/21 19:12] (текущий) root [Возможности] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== uTP (udp torrent) netgraph node ====== | + | ====== FreeBSD uTP (udp torrent) netgraph node ====== |
+ | Средство для работы с uTP проколом, заменяет [[ru:software:freebsd:utp_ctrl_daemon|uTPControl - block uTP torrent proto]]\\ | ||
+ | |||
+ | **Скачать**: [[http://www.netlab.linkpc.net/download/software/FreeBSD/ng_utp/|ng_utp]]\\ | ||
+ | **Лицензия**: BSD\\ | ||
===== Возможности ===== | ===== Возможности ===== | ||
- | Нода может работать на: | + | Нода может работать на хуках: |
- | * L2: Ethernet, есть поддержка вланов: все тегированные пакеты обрабатываются в нормальном режиме, дополнительных действий не требуется, ограничений на количество вланов нет; | + | * **L2** - (ng_ether и др) Ethernet, есть поддержка вланов: все тегированные пакеты обрабатываются в нормальном режиме, дополнительных действий не требуется, ограничений на количество вланов нет; |
- | * L3: IPv4, IPv6 (пока не реализовано). | + | * **L3** - (ng_ipfw и др) IPv4, IPv6 (пока не реализовано). |
Одну ноду одновременно можно подключать к различным источниками трафика, как L2 так и L3 одновременно, ограничений нет. | Одну ноду одновременно можно подключать к различным источниками трафика, как L2 так и L3 одновременно, ограничений нет. | ||
Строка 29: | Строка 34: | ||
===== Работа с нодой ===== | ===== Работа с нодой ===== | ||
==== Конфигурация ==== | ==== Конфигурация ==== | ||
- | NGM_UTP_GET_NODE_CFG("getcfg") - прочитать конфигурацию.\\ | + | NGM_UTP_GET_NODE_CFG("**getcfg**") - прочитать конфигурацию.\\ |
- | NGM_UTP_SET_NODE_CFG("setcfg") - установить новые параметры конфигурации.\\ | + | NGM_UTP_SET_NODE_CFG("**setcfg**") - установить новые параметры конфигурации.\\ |
- | параметры:\\ | + | Параметры |
- | **ip_conns_max** (uint32_t) - максимальное количество отслеживаемых L3-L4 соединений.\\ | + | * **ip_conns_max** (uint32_t) - максимальное количество отслеживаемых L3-L4 соединений. |
- | **utp_conns_max** (uint32_t) - максимальное количество отслеживаемых uTP (L5) внутри L3-L4 соединений, должно быть больше ip_conns_max.\\ | + | * **utp_conns_max** (uint32_t) - максимальное количество отслеживаемых uTP (L5) внутри L3-L4 соединений, должно быть больше ip_conns_max. |
- | **conn_ack_timeout** (uint32_t) - время (секунды) в течении которого должен придти ответный uTP пакет в соединении. Если пакет пришёл позднее - действия не применяются.\\ | + | * **conn_ack_timeout** (uint32_t) - время (секунды) в течении которого должен придти ответный uTP пакет в соединении. Если пакет пришёл позднее - действия не применяются. |
- | **conn_idle_timeout** (uint32_t) - максимальное время (секунды) не активности после которого соединение удаляется из таблицы.\\ | + | * **conn_idle_timeout** (uint32_t) - максимальное время (секунды) не активности после которого соединение удаляется из таблицы. |
<code>ngctl msg ipfw:1000 getcfg | <code>ngctl msg ipfw:1000 getcfg | ||
Rec'd response "getcfg" (1) from "[1a]:": | Rec'd response "getcfg" (1) from "[1a]:": | ||
Строка 43: | Строка 48: | ||
==== Статус ноды ==== | ==== Статус ноды ==== | ||
- | NGM_UTP_GET_NODE_STATUS("getstatus") - возвращает текущее состояние ноды\\ | + | NGM_UTP_GET_NODE_STATUS("**getstatus**") - возвращает текущее состояние ноды\\ |
- | Все счётчики uint64_t.\\ | + | Все счётчики uint64_t. |
- | **ipv4_conns** - количество IPv4+UDPv4 соединений в таблице\\ | + | * **ipv4_conns** - количество IPv4+UDPv4 соединений в таблице |
- | **ipv6_conns** - количество IPv6+UDPv6 соединений в таблице\\ | + | * **ipv6_conns** - количество IPv6+UDPv6 соединений в таблице |
- | **ip_conns_total** - общее количество IP+UDP соединений, сумма двух предыдущих\\ | + | * **ip_conns_total** - общее количество IP+UDP соединений, сумма двух предыдущих |
- | **ip_conns_max** - максимально возможное количество IP+UDP соединений. Обычно чуть больше или равно тому что задано в конфиге.\\ | + | * **ip_conns_max** - максимально возможное количество IP+UDP соединений. Обычно чуть больше или равно тому что задано в конфиге. |
- | **utpv0_conns** - количество utp v0 соединений в таблице\\ | + | * **utpv0_conns** - количество utp v0 соединений в таблице |
- | **utpv1_conns** - количество utp v1 соединений в таблице\\ | + | * **utpv1_conns** - количество utp v1 соединений в таблице |
- | **utp_conns_total** - общее количество utp соединений, сумма двух предыдущих\\ | + | * **utp_conns_total** - общее количество utp соединений, сумма двух предыдущих |
- | **utp_conns_max** - максимально возможное количество utp соединений. Обычно чуть больше или равно тому что задано в конфиге.\\ | + | * **utp_conns_max** - максимально возможное количество utp соединений. Обычно чуть больше или равно тому что задано в конфиге. |
- | **mem_ip_conns** - всего памяти использовано для хранения информации об IP-UDP соединениях\\ | + | * **mem_ip_conns** - всего памяти использовано для хранения информации об IP-UDP соединениях |
- | **mem_utp_conns** - всего памяти использовано для хранения информации об uTP соединениях\\ | + | * **mem_utp_conns** - всего памяти использовано для хранения информации об uTP соединениях |
- | **mem_total** - всего памяти, сумма двух предыдущих\\ | + | * **mem_total** - всего памяти, сумма двух предыдущих |
<code>ngctl msg ipfw:1000 getstatus | <code>ngctl msg ipfw:1000 getstatus | ||
Rec'd response "getstatus" (3) from "[1a]:": | Rec'd response "getstatus" (3) from "[1a]:": | ||
Строка 63: | Строка 67: | ||
==== Статистика ноды ==== | ==== Статистика ноды ==== | ||
- | NGM_UTP_GET_NODE_STAT("getstat") - получить\\ | + | NGM_UTP_GET_NODE_STAT("**getstat**") - получить\\ |
- | NGM_UTP_CLR_NODE_STAT("clrstat") - очистить\\ | + | NGM_UTP_CLR_NODE_STAT("**clrstat**") - очистить\\ |
- | NGM_UTP_GETCLR_NODE_STAT("getclrstat") - получить и очистить\\ | + | NGM_UTP_GETCLR_NODE_STAT("**getclrstat**") - получить и очистить\\ |
- | Все счётчики uint64_t.\\ | + | Все счётчики uint64_t. |
- | **ipv4_conns** - всего IPv4 соединений было добавлено в таблицу\\ | + | * **ipv4_conns** - всего IPv4 соединений было добавлено в таблицу |
- | **ipv6_conns** - всего IPv6 соединений было добавлено в таблицу\\ | + | * **ipv6_conns** - всего IPv6 соединений было добавлено в таблицу |
- | **ip_conns_total** - всего IP соединений, сумма двух предыдущих\\ | + | * **ip_conns_total** - всего IP соединений, сумма двух предыдущих |
- | **utpv0_conns** - всего uTPv0 соединений было добавлено в таблицу\\ | + | * **utpv0_conns** - всего uTPv0 соединений было добавлено в таблицу |
- | **utpv1_conns** - всего uTPv1 соединений было добавлено в таблицу\\ | + | * **utpv1_conns** - всего uTPv1 соединений было добавлено в таблицу |
- | **utp_conns_total** - всего uTP соединений, сумма двух предыдущих\\ | + | * **utp_conns_total** - всего uTP соединений, сумма двух предыдущих |
- | **memoryFailures** - ошибок выделения памяти\\ | + | * **memoryFailures** - ошибок выделения памяти |
<code>ngctl msg ipfw:1000 getstat | <code>ngctl msg ipfw:1000 getstat | ||
Rec'd response "getstat" (4) from "[1a]:": | Rec'd response "getstat" (4) from "[1a]:": | ||
Строка 81: | Строка 84: | ||
==== Очистка таблицы соединений IP-UDP ==== | ==== Очистка таблицы соединений IP-UDP ==== | ||
- | NGM_UTP_FLUSH_CONN4 ("flushconn4") - IPv4\\ | + | NGM_UTP_FLUSH_CONN4 ("**flushconn4**") - IPv4\\ |
- | NGM_UTP_FLUSH_CONN6 ("flushconn6") - IPv6\\ | + | NGM_UTP_FLUSH_CONN6 ("**flushconn6**") - IPv6\\ |
<code>ngctl msg ipfw:1000 flushconn4</code> | <code>ngctl msg ipfw:1000 flushconn4</code> | ||
==== Дамп таблицы соединений IP-UDP ==== | ==== Дамп таблицы соединений IP-UDP ==== | ||
- | NGM_UTP_GET_CONN_TABLE4 ("getconntbl4") - IPv4\\ | + | NGM_UTP_GET_CONN_TABLE4 ("**getconntbl4**") - IPv4\\ |
- | <del>NGM_UTP_GET_CONN_TABLE6 ("getconntbl6") - IPv6</del> - не реализовано.\\ | + | <del>NGM_UTP_GET_CONN_TABLE6 ("**getconntbl6**") - IPv6</del> - не реализовано.\\ |
<code>ngctl msg ipfw:1000 getconntbl4 | <code>ngctl msg ipfw:1000 getconntbl4 | ||
Строка 103: | Строка 106: | ||
==== Добавление фильтра ==== | ==== Добавление фильтра ==== | ||
- | NGM_UTP_ADD_FILTER("addfilter") - добавить L2:Ethernet или L3:IPv4/IPv6 фильтр\\ | + | NGM_UTP_ADD_FILTER("**addfilter**") - добавить L2:Ethernet или L3:IPv4/IPv6 фильтр\\ |
- | [u]l3_proto[/u] (uint16_t) - тип фильтра: 0 в случае ethernet, 0x0800 - для IPv4, 0x86DD - для IPv6 | + | **l3_proto** (uint16_t) - тип фильтра: 0 в случае ethernet, 0x0800 - для IPv4, 0x86DD - для IPv6\\ |
- | [u]action[/u] (uint16_t) - действие выполняемое фильтром: | + | **action** (uint16_t) - действие выполняемое фильтром:\\ |
- | 0 - UTP_FLT_ACCTION_PASS - ничего не делать с uTP, только выстраивать таблицу соединений | + | * **0** - UTP_FLT_ACCTION_PASS - ничего не делать с uTP, только выстраивать таблицу соединений |
- | 1 - UTP_FLT_ACCTION_PASS_MARK - маркировать все uTP пакеты относящиеся к uTP соединениям (см флаги | + | * **1** - UTP_FLT_ACCTION_PASS_MARK - маркировать все uTP пакеты относящиеся к uTP соединениям (см флаги UTP_FLT_FLAG_MARK_L2 и UTP_FLT_FLAG_MARK_L3) |
- | UTP_FLT_FLAG_MARK_L2 и UTP_FLT_FLAG_MARK_L3) | + | * **2** - UTP_FLT_ACCTION_DROP - уничтожать все uTP пакеты относящиеся к uTP соединениям |
- | 2 - UTP_FLT_ACCTION_DROP - уничтожать все uTP пакеты относящиеся к uTP соединениям | + | * **3** - UTP_FLT_ACCTION_SND_RST - заменять на uTP RST все uTP пакеты относящиеся к uTP соединениям |
- | 3 - UTP_FLT_ACCTION_SND_RST - заменять на uTP RST все uTP пакеты относящиеся к uTP соединениям | + | **flags** (uint32_t) - флаги: |
- | [u]flags[/u] (uint32_t) - флаги: | + | * **0x00000001** - UTP_FLT_FLAG_FORCE_QUEUE_H0 |
- | 0x00000001 - UTP_FLT_FLAG_FORCE_QUEUE_H0 | + | * **0x00000002** - UTP_FLT_FLAG_FORCE_QUEUE_H1 - принудительно использовать очередь для хука в фильтре. Включение очередей может помочь равномерно распределять нагрузку между процессорами. |
- | 0x00000002 - UTP_FLT_FLAG_FORCE_QUEUE_H1 - принудительно использовать очередь для хука в фильтре. Включение | + | * **0x00000004** - UTP_FLT_FLAG_NO_PASS - не пропускать транзитом, только сгенерированные RST будут отправлены |
- | очередей может помочь равномерно распределять нагрузку между процессорами. | + | * **0x00000010** - UTP_FLT_FLAG_MARK_L2 - маркировать на L2 пакеты относящиеся к uTP соединениями. Действие фильтра должно быть UTP_FLT_ACCTION_PASS_MARK. Метка - PCP хранится в label_l2, первые 3 бита. |
- | 0x00000004 - UTP_FLT_FLAG_NO_PASS - не пропускать транзитом, только сгенерированные RST будут отправлены | + | * **0x00000020** - UTP_FLT_FLAG_MARK_L3 - маркировать на L3 пакеты относящиеся к uTP соединениями. Действие фильтра должно быть UTP_FLT_ACCTION_PASS_MARK. Метка - DSCP хранится в label_l3, первые 6 бит. |
- | 0x00000010 - UTP_FLT_FLAG_MARK_L2 - маркировать на L2 пакеты относящиеся к uTP соединениями. Действие фильтра | + | * **0x00000100** - UTP_FLT_FLAG_CSUM_IP_CHK - проверять контрольную сумму IPv4 пакетов. |
- | должно быть UTP_FLT_ACCTION_PASS_MARK. Метка - PCP хранится в label_l2, первые 3 бита. | + | * **0x00000200** - UTP_FLT_FLAG_CSUM_UDP_CHK - проверять контрольную сумму UDP пакетов. |
- | 0x00000020 - UTP_FLT_FLAG_MARK_L3 - маркировать на L3 пакеты относящиеся к uTP соединениями. Действие фильтра | + | * **0x00000400** - UTP_FLT_FLAG_CSUM_UDP_NO_CSUMM - не рассчитывать контрольную сумму для сгенерированных uTP RST пакетов. |
- | должно быть UTP_FLT_ACCTION_PASS_MARK. Метка - DSCP хранится в label_l3, первые 6 бит. | + | **label_l2** (uint8_t) - L2 - Priority Code Point метка пакета, первые 3 бита.\\ |
- | 0x00000100 - UTP_FLT_FLAG_CSUM_IP_CHK - проверять контрольную сумму IPv4 пакетов. | + | **label_l3** (uint8_t) - L3 ip_tos/Traffic Class code (rfc2474) метка пакета, первые 6 бит.\\ |
- | 0x00000200 - UTP_FLT_FLAG_CSUM_UDP_CHK - проверять контрольную сумму UDP пакетов. | + | **h0** (char) - \\ |
- | 0x00000400 - UTP_FLT_FLAG_CSUM_UDP_NO_CSUMM - не рассчитывать контрольную сумму для сгенерированных uTP RST пакетов. | + | **h1** (char) - имя хука добавляемого в фильтр\\ |
- | [u]label_l2[/u] (uint8_t) - L2 - Priority Code Point метка пакета, первые 3 бита. | + | |
- | [u]label_l3[/u] (uint8_t) - L3 ip_tos/Traffic Class code (rfc2474) метка пакета, первые 6 бит. | + | |
- | [u]h0[/u] (char) - | + | |
- | [u]h1[/u] (char) - имя хука добавляемого в фильтр | + | |
- | Для L2 | + | Для L2: |
- | [code]ngctl mkpeer vlan777: utp lower lower | + | <code>ngctl mkpeer vlan777: utp lower lower |
ngctl connect vlan777: vlan777:lower upper upper | ngctl connect vlan777: vlan777:lower upper upper | ||
- | ngctl msg vlan777:lower addfilter '{ l3_proto=0 action=3 flags=0x00000000 h0="lower" h1="upper" }'[/code] | + | ngctl msg vlan777:lower addfilter '{ l3_proto=0 action=3 flags=0x00000000 h0="lower" h1="upper" }'</code> |
- | Для L3-IPv4 | + | Для L3-IPv4: |
- | [code]ngctl mkpeer ipfw: utp 1000 in | + | <code>ngctl mkpeer ipfw: utp 1000 in |
ngctl connect ipfw: ipfw:1000 1001 out | ngctl connect ipfw: ipfw:1000 1001 out | ||
- | ngctl msg ipfw:1000 addfilter '{ l3_proto=0x0800 action=3 flags=0x00000000 h0="in" h1="out" }'[/code] | + | ngctl msg ipfw:1000 addfilter '{ l3_proto=0x0800 action=3 flags=0x00000000 h0="in" h1="out" }'</code> |
(здесь по идее достаточно одного хука, но такое "одноногое" поведение пока не реализовано) | (здесь по идее достаточно одного хука, но такое "одноногое" поведение пока не реализовано) | ||
- | [b]Получить настройки фильтра[/b] | + | ==== Получить настройки фильтра ==== |
- | NGM_UTP_GET_FILTER ("getfilter") - получить настройки фильтра по имени одного из хуков, который в него входит. | + | NGM_UTP_GET_FILTER ("**getfilter**") - получить настройки фильтра по имени одного из хуков, который в него входит. |
- | [code]ngctl msg ipfw:1000 getfilter '"io"' | + | <code>ngctl msg ipfw:1000 getfilter '"io"' |
Rec'd response "getfilter" (13) from "[46]:": | Rec'd response "getfilter" (13) from "[46]:": | ||
- | Args: { l3_proto=0x800 action=3 flags=0x3 h0="io" } | + | Args: { l3_proto=0x800 action=3 flags=0x3 h0="io" }</code> |
- | [/code] | + | |
+ | ==== Удаление фильтра ==== | ||
+ | NGM_UTP_DEL_FILTER ("**delfilter**") - удалить фильтр по имени одного из хуков, который в него входит, хуки при этом не отключаются от нод | ||
+ | <code>ngctl msg ipfw:1000 delfilter '"in"'</code> | ||
- | [b]Удаление фильтра[/b] | ||
- | NGM_UTP_DEL_FILTER ("delfilter") - удалить фильтр по имени одного из хуков, который в него входит, хуки при этом не отключаются от нод | ||
- | [code]ngctl msg ipfw:1000 delfilter '"in"'[/code] | ||
- | + | ==== Статистика фильтра ==== | |
- | [b]Статистика фильтра[/b] | + | NGM_UTP_GET_FILTER_STATS ("**getfilterstats**")\\ |
- | NGM_UTP_GET_FILTER_STATS ("getfilterstats") | + | NGM_UTP_CLR_FILTER_STATS ("**clrfilterstats**")\\ |
- | NGM_UTP_CLR_FILTER_STATS ("clrfilterstats") | + | NGM_UTP_GETCLR_FILTER_STATS ("**getclrfilterstats**")\\ |
- | NGM_UTP_GETCLR_FILTER_STATS ("getclrfilterstats") | + | |
Все счётчики uint64_t. | Все счётчики uint64_t. | ||
- | [u]Octets[/u] - байт прошло через фильтр. | + | * **Octets** - байт прошло через фильтр. |
- | [u]Packets[/u] - количество пакетов прошедших через фильтр. | + | * **Packets** - количество пакетов прошедших через фильтр. |
- | [u]IPv4_Packets[/u] - количество IPv4 пакетов прошедших через фильтр. | + | * **IPv4_Packets** - количество IPv4 пакетов прошедших через фильтр. |
- | [u]IPv6_Packets[/u] - количество IPv6 пакетов прошедших через фильтр. | + | * **IPv6_Packets** - количество IPv6 пакетов прошедших через фильтр. |
- | [u]MatchedPackets[/u] - пакеты опознанные как uTP, к которым были применены действия. | + | * **MatchedPackets** - пакеты опознанные как uTP, к которым были применены действия. |
- | [u]BypassPackets[/u] - пакетов прошедшие через фильтр без изменений. | + | * **BypassPackets** - пакетов прошедшие через фильтр без изменений. |
- | [u]DroppedPackets[/u] - отброшенные пакеты. | + | * **DroppedPackets** - отброшенные пакеты. |
- | [u]recvErrors[/u] - ошибки приёма: отсутствует заголовок, не удалось выделить память, неправильный заголовок, ошибочная контрольная сумма и тп. | + | * **recvErrors** - ошибки приёма: отсутствует заголовок, не удалось выделить память, неправильный заголовок, ошибочная контрольная сумма и тп. |
- | [u]xmitErrors[/u] - ошибки отправки. | + | * **xmitErrors** - ошибки отправки. |
- | + | <code>ngctl msg ipfw:1000 getfilterstats '"in"' | |
- | [code]ngctl msg ipfw:1000 getfilterstats '"in"' | + | |
Rec'd response "getfilterstats" (9) from "[1a]:": | Rec'd response "getfilterstats" (9) from "[1a]:": | ||
- | Args: { Octets=5982246 Packets=38489 IPv4_Packets=38492 MatchedPackets=8760 BypassPackets=38978 recvErrors=8760 }[/code] | + | Args: { Octets=5982246 Packets=38489 IPv4_Packets=38492 MatchedPackets=8760 BypassPackets=38978 recvErrors=8760 }</code> |
- | [b][size=11pt]Исходники[/size][/b] | + | ==== Проверка работоспособности ==== |
- | [url=http://www.netlab.linkpc.net/download/software/FreeBSD/ng_utp/]http://www.netlab.linkpc.net/download/software/FreeBSD/ng_utp/[/url] | + | см [[ru:software:freebsd:utp_ctrl_daemon#Проверка работоспособности|uTPControl - block uTP torrent proto]] |