Перейти к содержимому

UDP и TCP ​

У «сырых» UDP и TCP нет своего экрана. Их используют для устройства с собственным текстовым или двоичным протоколом — проектора, медиасервера, датчика, — и встречаются они в нескольких местах:

Чтобы…Используйте
отправить датаграмму или TCP-сообщение узлом и дождаться ответаузлы эксперимента
сохранить датаграмму для повторной отправки или воспроизвести захваченнуюUDP-сигнал
отправить одну датаграмму из скриптаsignallab send udp
отправить сразу многим хостам, на широковещательный адрес или в multicast-группуэкран Броадкаст
нагрузить сервер или канал трафикомШторм
узнать, какие TCP-порты открыты на хостеСканер
сыграть роль устройстваэмулятор UDP- или TCP-устройства
ухудшить сеть между двумя концамиреле помех

OSC — это формат, который передаётся в датаграммах UDP; ему посвящена отдельная страница: OSC.

Содержимое ​

Везде, где вы пишете сырое содержимое, оно бывает одного из двух видов:

ВидЧто отправляетсяПример
ТекстСимволы в UTF-8 ровно в том виде, как набраны: без терминатора и без добавленного конца строки. Строковому протоколу нужен конец строки в самом тексте.PING
Байты в hexБайт в байт, записанные парами шестнадцатеричных цифр. Между парами допускаются пробелы, :, - и ,, а перед ними — 0x.de ad be ef, DEADBEEF, 0xde,0xad

В датаграмме не больше 65 507 байт. Нечётное число шестнадцатеричных цифр или их полное отсутствие — ошибка, которая возникает до отправки.

INFO

У UDP нет подтверждения доставки. «Отправлено» значит, что датаграмма ушла с этого компьютера, а не что её кто-то получил. Чтобы знать, что устройство вас услышало, дождитесь его ответа.

Куда это уходит ​

Адресат — это IP-адрес и порт либо имя хоста и порт: 192.0.2.20:9000, [2001:db8::20]:9000 (IPv6-адрес берётся в квадратные скобки), projector.local:9000. Это относится к цели UDP-узла, цели OSC, UDP-сигналу, командам signallab send udp и signallab send osc, списку Броадкаста, цели Шторма и хосту TCP-узла.

Имя хоста разрешается при каждом использовании. Если у него есть адрес IPv4, используется он — поэтому localhost достаёт до службы, которая слушает на 127.0.0.1, хотя первым адресом, который система перечисляет для этого имени, может оказаться ::1 — а к имени, у которого есть только адреса IPv6, обращаются с сокета IPv6. Имя, которое не разрешилось, даёт ошибку Cannot resolve …; адресат без порта или не в одной из этих двух форм — … is not a valid address. Адреса, на которых служба слушает (у монитора, у ожидания, у эмулятора), — всегда IP:port.

В экспериментах ​

УзелЧто он делает
UDP-датаграммаОтправляет текст из поля Данные на цель из поля Цель host:port. Цель — IP:port или host:port (выше); если целей несколько, через запятую, датаграмму получает каждая. С параметром ждать ответ отправляет с адреса из поля Ответ на (IP:порт) и ждёт там ответа в том же шаге. Подробнее
Ждать UDPСлушает на адресе из поля Слушать (IP:порт) (IP:port) и ждёт датаграмму, содержимое которой подходит. Подробнее
TCP-сообщениеПодключается по адресу из полей Хост и Порт, записывает текст из поля Данные, 250 мс ждёт ответа и закрывает соединение. Шаг сообщает, сколько байт вернулось, а не что именно. Подробнее

Содержимое и цель UDP, хост и содержимое TCP и шаблон ожидания принимают {{templates}}, поэтому датаграмма может нести идентификатор запуска или значение, извлечённое предыдущим шагом. См. Данные и шаблоны.

Сопоставление датаграммы ​

Узел Ждать UDP и ответ узла UDP-датаграмма выбирают датаграмму по её содержимому:

СодержимоеПринимает датаграмму, когда
Любая датаграммавсегда: берёт первую пришедшую
Содержит текстеё содержимое, прочитанное как текст, содержит шаблон
Соответствует regexеё содержимое, прочитанное как текст, соответствует регулярному выражению
Содержит байты (hex)её байты содержат байты шаблона, записанные в hex

Подошедшее сохраняется в переменной шага (Переменная ответа; это reply, пока вы её не переименуете): text, hex (первые 1024 байта), bytes (размер), from (IP:port отправителя), ms (сколько это заняло) и match (найденный текст или байты либо первая группа регулярного выражения).

Ожидание начинает слушать при старте запуска, а не когда до шага дошла очередь, поэтому очень быстрый ответ не пропускается. Оно берёт только то, что пришло после последней отправки на его пути.

Ограничения и значения по умолчанию ​

ПараметрПо умолчаниюДиапазон
Узел TCP: Таймаут (мс) (подключение, запись и ответ вместе)4000 мс1–120 000 мс
Таймаут, мс ожидания или ответа2000 мс1–120 000 мс
Содержимое UDP—не более 65 507 байт
Адрес прослушивания—IP:port с портом; у Ответ на (IP:порт) ответа может быть порт 0 (любой свободный)

В Инспекторе датаграмма UDP-узла появляется с источником broadcast (или experiment, если узел ждёт ответ), а каждая датаграмма, пришедшая на порт ожидания, — с источником experiment-wait. TCP-узел появляется как два кадра tcp с источником experiment: записанное им содержимое и, если ответ пришёл, прочитанный ответ. Запись узла на ленте запуска сообщает, что он отправил и какого размера был ответ.

Сигналы ​

Сигнал типа UDP (сырой) в библиотеке — это цель и содержимое в виде текста или hex-байтов. Отправьте его с экрана Сигналы или нажатием Ctrl+K на любом экране. Его цель может быть именем хоста.

Сигналом может стать любая датаграмма, которую Инспектор сохранил целиком: кнопка Сохранить как сигнал создаёт hex-сигнал UDP в папке Захвачено, который воспроизводит ровно эти байты — на адресата кадра, если кадр был отправлен, и на адрес, принявший его, если он пришёл (на этом компьютере, если принимали все адреса). TCP-фрагмент так сохранить нельзя: это часть потока. См. Сигналы и Инспектор.

Текстовый UDP-сигнал можно добавить в эксперимент как узел UDP-датаграмма; hex-сигнал — нельзя, потому что узел отправляет текст.

Из командной строки ​

signallab send udp отправляет одну датаграмму:

bash
signallab send udp 127.0.0.1:9000 --text "PING"
signallab send udp 127.0.0.1:9000 --hex "de ad be ef"
text
✔ sent 4 bytes → 127.0.0.1:9000

Укажите ровно один из ключей --text и --hex. Цель — IP:port или host:port (выше). Код завершения: 0, если датаграмма ушла, 1, если отправка не удалась, и 2, если цель или hex недопустимы. Команды send tcp нет. См. Командная строка.

Шторм ​

Экран Шторм — источник нагрузки для ваших собственных серверов и каналов: режим UDP-флуд отправляет датаграммы заданного размера с заданным темпом, режим TCP-флуд подключений снова и снова открывает соединение, записывает содержимое и закрывает его. Пропускная способность измеряется вживую. См. Шторм.

Сканер ​

Экран Сканер пробует TCP-подключение к каждому порту диапазона и перечисляет те, что принимают соединение, — вместе с тем, что служба сообщает первой, если вы запросили баннеры. См. Сканер.

DANGER

Шторм и Сканер посылают настоящий трафик на настоящие хосты. Направляйте их только на системы, которыми вы владеете или которые вам разрешено тестировать: шторм может целиком занять канал, а оба инструмента способны сработать на системы обнаружения вторжений.

Эмулируемые устройства ​

На экране Эмуляторы Signal Lab может сам быть устройством:

  • эмулятор UDP-устройство отвечает на датаграммы по правилам для их содержимого — любого, содержащего текст, соответствующего регулярному выражению, содержащего байты — текстовым или hex-ответом, собранным из того, что пришло, отправителю или на другой IP:port, с задержкой, если вы её задали;
  • эмулятор TCP-устройство принимает соединения, делит приходящее на сообщения по выбранному вами концу строки (LF, CR LF, CR или каждый фрагмент как он пришёл), отвечает на каждое по правилам того же рода, может отправить приветствие, когда клиент подключается, и может закрыть соединение после ответа.

Оба также могут работать как узел Эмулятор на всё время запуска. См. Эмуляторы.

Помехи ​

Реле на экране Помехи стоит между клиентом и его целью и ухудшает то, что через него проходит: по датаграммам в UDP (задержка, потери, дубликаты, перестановка, ограничение полосы) или по потокам в TCP (задержка, ограничение полосы, соединения, которые сбрасываются или остаются полуоткрытыми). См. Помехи и, внутри эксперимента, Сбои.

«Порт недоступен» в Windows ​

Когда датаграмма приходит на порт, где никто не слушает, принимающий компьютер обычно отвечает ICMP-сообщением «порт недоступен». Windows сообщает об этом ответе при следующем приёме на отправляющем сокете, как будто соединение сбросили, — хотя у UDP соединения нет.

Signal Lab это учитывает. Его слушатели — монитор OSC, приёмник обнаружения, ожидания и ответы экспериментов, UDP- и OSC-эмуляторы, реле помех — отмечают это и продолжают слушать. Устройство, которое пропало, их не останавливает. Слушатель, который действительно больше не может принимать, завершает свою задачу, а консоль объясняет причину.

Проблемы ​

Что вы видитеОбычная причина
… is not a valid addressУ цели нет порта, или она не в форме IP:port и не в форме host:port.
Cannot resolve …Имя хоста не разрешается на этом компьютере.
… refused the connection — nothing is listening on that port (TCP)На этом порту никто не слушает, или подключение отклоняет брандмауэр.
No answer from … in time (TCP)Хост не отвечает вовсе — неверный адрес или брандмауэр, который отбрасывает пакеты, а не отклоняет их.
Ожидание истекает по тайм-ауту, хотя устройство отвечаетУстройство отвечает на тот порт, с которого пришла датаграмма, а не на порт ожидания. Поручите ожидание ответа самой отправке — параметром ждать ответ: тогда она уходит с того порта, на который вернётся ответ.
Датаграммы с других компьютеров не приходятВ Windows их может не пускать брандмауэр: разрешите Signal Lab, когда приложение предложит. См. Устранение неполадок.

Все сообщения об ошибках перечислены в разделе Сообщения об ошибках.