projects:qoe_analytics:unknown_discovering:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projects:qoe_analytics:unknown_discovering:start [2026/07/28 14:25] – Обобщён охват: метод применим к HTTPS 0-RTT/resumption/ECH, не только QUIC claudeprojects:qoe_analytics:unknown_discovering:start [2026/07/28 15:24] (current) – [Маршрутизация к наборам сервисов] evgeniy
Line 41: Line 41:
   * **Регистр** — матчинг регистронезависимый.   * **Регистр** — матчинг регистронезависимый.
   * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле.   * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле.
 +  * **Доп. фильтры набора.** Помимо масок host, набор может нести дополнительные фильтры (например по ''Host AS'' — номеру автономной системы). Записи, не проходящие фильтр, не учитываются ни в числителе, ни в знаменателе набора. Фильтры смотри на странице провайдера; они могут задаваться индивидуально для каждого набора.
  
 ===== Выделение и дополнение сетов ===== ===== Выделение и дополнение сетов =====
Line 73: Line 74:
  
 Наборы масок по провайдерам — в [[projects:qoe_analytics:unknown_discovering:services:start|:services]]: Наборы масок по провайдерам — в [[projects:qoe_analytics:unknown_discovering:services:start|:services]]:
-  * [[projects:qoe_analytics:unknown_discovering:services:google|google]] — youtubegoogle_playgoogle_mapsgoogle_cloud, google_cdn + 
-  * [[projects:qoe_analytics:unknown_discovering:services:facebook|facebook meta]] + 
-  * [[projects:qoe_analytics:unknown_discovering:services:tiktok|tiktok]] +===== DSL декларация ===== 
-  * [[projects:qoe_analytics:unknown_discovering:services:apple|apple]]+ 
 +Формальная нотация для описания правил классификации. Основные конструкции: ''SELECT'' (выборка кандидатов, шаг 1), ''SET'' (декларация набора), ''RULE'' (правило классификации, шаг 3); плюс ''DISCOVER'' — обратный ход (выделение набора). 
 + 
 +Общие соглашения: 
 +  * Маски host — семантика fnmatch: ''*'' = любая подстрока, включая точки. 
 +  * Доля совпадения считается **только по числу записей** (by records). Знаменатель — записи с непустым host на IP, прошедшие фильтры. 
 +  * Комментарии — ''//'' до конца строки. 
 +  * Строковые значения с пробелами/числами — в кавычках (напр. ''"quic_unknown 49293"''). 
 + 
 +==== SELECT — выборка кандидатов (шаг 1) ==== 
 +Отбор IP-кандидатов из агрегированного netflow. Здесь же задаётся фильтр по AS — он применяется ко всей выборке. 
 + 
 +<code> 
 +CANDIDATES = 
 +  SELECT host_ip, total_volume 
 +  FROM   top_ip_host_agg 
 +  WHERE  application_protocol = "quic_unknown 49293" 
 +     AND host_as IN (28917)            // Fiord 
 +  ORDER BY total_volume DESC 
 +  LIMIT  30 
 +</code> 
 + 
 +  ''WHERE'' — условия отбора; ''host_as IN (...)'' — список AS (под несколько значений). 
 +  * Фильтр по AS обычно живёт здесь, на шаге 1, и применяется ко всему пулу кандидатов. Примеркеш-сервер Instagram развёрнут в Fiord (''AS28917''), поэтому AS фильтруется на выборке, а не в наборе. 
 + 
 +==== SET — декларация набора ==== 
 +Именованный набормаски + порог. Фильтр — опционально. 
 + 
 +<code> 
 +SET instagram { 
 +  masks: 
 +    instagram.*.fbcdn.net 
 +    *.cdninstagram.com 
 +  threshold90% 
 +
 +</code> 
 + 
 +  * ''masks'' — многострочный список масок (fnmatch). 
 +  * ''threshold'' — порог на набор; единственный источник истины по порогу. 
 +  * ''ttl'' — необязательный срок годности метки (напр. ''30d''''60d''''90d''). По истечении узел требует повторной проверкит.к. IP в CDN ротируются. Задаётся на набор. 
 +  * ''filter'' — необязательное поле. Обычно опускается, потому что фильтр по AS задаётся на шаге 1 (в ''SELECT''). Указывается только когда конкретному набору нужен доп. фильтр, отличный от выборки шага 1 (см. наборы Google, где ''Host AS'' задан пофакторно). 
 + 
 +Пример с фильтром на уровне набора (наборы Google): 
 +<code> 
 +SET google_play { 
 +  masks: 
 +    play.googleapis.com 
 +  filterhost_as IN (15169)          /основная AS Google 
 +  threshold50% 
 +
 +</code> 
 + 
 +==== RULE — правило классификации (шаг 3) ==== 
 +Развёрнутая формассылается на объявленный ''SET'', порог берётся из набора. 
 + 
 +<code> 
 +RULE instagram { 
 +  for ip in RAW 
 +  match SET instagram 
 +  if match_share_by_records > instagram.threshold 
 +  then LABEL (ip:443) -> instagram 
 +
 +</code> 
 + 
 +  * ''for ip in RAW'' — перебор IP из сырого netflow (записи с непустым host). 
 +  * ''match SET instagram'' — сверка host каждой записи с масками набора. 
 +  * ''match_share_by_records'' — доля по числу записей (единственная метрика в этом алгоритме). 
 +  * ''LABEL (ip:443) -> instagram'' — присвоение метки узлу. 
 +  * Если у набора задан ''filter'', он применяется здесь жезаписи вне фильтра не идут ни в числитель, ни в знаменатель. 
 + 
 +==== DISCOVER — выделение набора (обратный ход) ==== 
 +Не присваивает метку; возвращает распределение FQDN на IP, из которого строятся ''masks''. Соответствует разделу «Выделение и дополнение сетов». 
 + 
 +<code> 
 +DISCOVER SET candidate 
 +  FROM  RAW where host_ip = "35.241.31.20" and host is not null 
 +  GROUP BY host 
 +  RANK  BY records                     // по числу записей 
 +</code>
  
 ===== Планируемое ===== ===== Планируемое =====
  • projects/qoe_analytics/unknown_discovering/start.1785241532.txt.gz
  • Last modified: 2026/07/28 14:25
  • by claude