我在通过udp以双工方式进行通信的两个设备之间嗅探。我正在使用wireshark嗅闻。第一个设备(一个正在测试的硬件)的配置文件表明客户端端口是54718,服务器是54717.在第二个设备的配置文件(多年前编写的模拟器)中,只指定了一个端口。 54718.
这两台设备没有任何问题进行通信。
但是当第二个设备不知道它时,它如何设置连接并发送到54717?
在wireshark中我可以看到第一个设备发送到第二个设备,使得源端口为54717,目的地为54718.我还可以看到第二个设备正在向第一个设备发送源端口是54718,目的地是54717.
第一个设备首先发送,协议被描述为Wireshark中的UDP协议。模拟器也通过UDP回复。后续交换被描述为STUN ChannelData TURN消息。我不知道这个协议,但也许它解释了为什么我在模拟器配置文件中没有看到54717。
感谢您的帮助,
百里
答案 0 :(得分:1)
首先,在UDP通信中,没有“连接”动作。 UDP不是面向连接的。
其次,第二个设备将从recvfrom()api调用中获取对等地址和端口。
答案 1 :(得分:1)
很可能,第一个设备使用术语“客户端端口”和“服务器端口”并不是指客户端设备中的两个不同端口。相反,“客户端端口”是指在第一个设备中用作原点的端口,“服务器端口”是指远端设备上的远程目标端口,第一个设备的传出流量将是发送。
另一方面,第二个设备可能从根本上说是一个“监听”设备。它只知道它需要监听的UDP端口,并等待发往该端口的任何查询从任何地方到达。
因此,我将“第一个设备”称为客户端,将“第二个设备”称为服务器。
从客户端发送到服务器的每个数据报包含两组地址信息: 1)目的IP地址和端口,以及 2)返回IP地址和端口。
服务器可以使用recvfrom()从每个传入请求中提取完整的返回地址(包括端口号)。
这样,我们实际上只需要预先定义一个端口号并由服务器和客户端同意:服务器的端口号。
客户可以想象选择使用任何随机端口号作为其原始端口(但按照惯例,它可能会选择避免任何众所周知的保留端口以避免潜在的互操作性问题),并且服务器可以动态地读取返回每个传入请求的地址信息,并动态地将其响应发送到正确的目的地。
答案 2 :(得分:0)
但是当第二个设备不知道它时,第二个设备如何设置连接并发送到54717?
UDP是无连接的,如果没有指定其他内容(例如在配置文件中),您的程序可能会将54717作为默认回退值。