现场设备(Loxone 小型服务器)正在将 UDP 数据包中的测量结果发送到 azure VM 的公共地址和我的本地计算机,两者都在端口 1234 上(为了完整性而更改)。在与现场设备位于同一网络的本地计算机上,我用 C# 实现了一个测试接收器,它可以正确获取数据包。 在天蓝色虚拟机上已运行的应用程序上,我添加了与本地计算机中相同的接收器代码,但没有收到 UDP 数据包。 我已经在azure管理平台上做了什么: - 在网络配置中允许传入端口1234 - 关闭防火墙
为了测试,我尝试了以下操作: - 在天蓝色虚拟机中的应用程序上实现了 UDP 发送器,该发送器通过广播 IP 发送到端口 1234 -> 这有效! - 在网络接口中添加了数据包监视器 -> 在这里我看到了两个数据包、内部广播和现场设备
//接收器代码简化为相关部分
class Program{
public static void Main(string[] args){
program.Run();
}
public void Run(){
var sync = new LoxoneSyncProcess();
while(true){
sync.readUDP();
Thread.sleep(10000);
}
}
}
class LoxoneSyncProcess{
public LoxoneSyncProcess(){
private UDPSocket c = new UDPSocket();
c.Client(1234);
}
public void readUDP(){
String buffer = c.getDatBuf();
Console.WriteLine(buffer);
//process buffer
}
}
public class UDPSocket{
private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private const int bufSize = 8 * 1024;
private State state = new State();
private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
private AsyncCallback recv = null;
private String datBuf = "";
public class State
{
public byte[] buffer = new byte[bufSize];
}
public String getDatBuf()
{
String temp = datBuf;
datBuf = "";
return temp;
}
public void Client(int port)
{
_socket.Bind(new IPEndPoint(IPAddress.Any, port));
Receive();
}
private void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
datBuf += Encoding.ASCII.GetString(so.buffer, 0, bytes);
//Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
}, state);
}
}
代码正在运行,我收到自己发送到广播 IP 上端口 1234 的 UDP 数据包,但不是来自现场设备。 是否需要 NAT 配置之类的表?还是端口转发? Azure 是否支持公共 UDP 端点?
Azure 支持 UDP 公共端点。只是想检查您使用的 UDP 有效负载的大小。如果 UDP 有效负载 > 1500 字节,则它将不起作用。
这是目前的设计初衷,因为我们目前在 vswitch 中不支持公共 VIP 端点的片段。建议客户将 UDP 数据报保持在 1500 以下。短期内我们确实无法在不更改代码的情况下允许片段通过 - NAT 根本不支持它们
需要注意的一件事是微软提到的碎片。 当然,这些信息是关于 TCP/IP 的,但 MTU 显然也会影响 UDP 流量。
Azure 和 VM MTU
Azure VM 的默认 MTU 为 1,500 字节。 Azure 虚拟网络堆栈 > 将尝试将数据包分段为 1,400 字节。
请注意,虚拟网络堆栈本质上并不是低效的,因为它会以 1,400 字节的大小对数据包进行分段,即使虚拟机的 MTU 为 1,500。 >很大一部分网络数据包远小于 1,400 或 1,500 >字节。
来源https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-tcpip-performance-tuning