我根据另一个程序的请求通过 UDP 发送 4 个字节的数据。有时帧的协议在 Wireshark 中被识别为 STUN,但我不知道为什么。
通信的 Ruby 原型如下所示(为了清晰起见,尽可能简化)
请求代码:
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。我注意到,我检查的 STUN 帧中 2 个最高有效字节的值为 0x00,我敢打赌,一些普通 UDP 帧也具有 2 个最高有效字节,其值为 0x00。
STUN 帧的图像:
普通 UDP 帧的图像:
为什么会发生这种情况?
答案1
这只是巧合。您正在生成随机有效负载,有时生成的随机字节将具有 STUN 数据包的标头结构。