Я отправляю 4 байта данных по UDP по запросу из другой программы. Иногда протокол фрейма идентифицируется в Wireshark как STUN, но я не знаю почему.
Рубиновый прототип коммуникации выглядит так (максимально упрощен для ясности)
Код запроса:
require 'Socket'
sock = UDPSocket.new
loop do
sock.send "req", 0, "127.0.0.1", 40004
x = sock.recvfrom 4
dataLength = x[0].unpack('L')[0]
received = 0
sleep 2
end
Код ответа:
require 'Socket'
sock = UDPSocket.new
sock.bind "127.0.0.1", 40004
loop do
x = sock.recvfrom 3
if x[0] == 'req'
sock.send [(Random.rand 10000..300000)].pack('L'), 0, "127.0.0.1", x[1][1]
end
end
Анализируя это сообщение в Wireshark, он показывает, что кадры, отправленные
sock.send [(Random.rand 10000..300000)].pack('L'), 0, "127.0.0.1", x[1][2]
иногда идентифицируются как простой UDP, иногда как STUN. Я заметил, что 2 наиболее значимых байта проверенных мной кадров STUN имеют значения 0x00, но некоторые простые кадры UDP также имеют 2 наиболее значимых байта со значением 0x00.
Изображение кадра STUN:
Изображение простого UDP-кадра:
Почему это происходит?
Это просто совпадение. Вы генерируете случайную полезную нагрузку, и иногда сгенерированные случайные байты будут иметь структуру заголовка пакета STUN.