组播与跳数排查记录

这篇文章不是技术文章,这是我入职公司后第一次出差排查线上问题的记录。

项目背景

我们公司的项目属于地铁方面的业务,采用了组播的形式给我们的设备发送消息,让设备根据组播的消息显示相应的数据。

问题排查

问题描述:我在中心的服务上给我们的设备发送组播数据,发现只有在中心的服务中能接收到组播数据,在车站中是接收不到任何的组播数据的。

排查方法:通过搜索引擎搜索。

一开始我通过百度查到这个是需要交换机打开组播功能的,经过排查发现交换机的厂家是有把交换机的组播功能打开的。
然后只能去抓包,在我们出口的交换机还有抓到包,但是在经过另外一个交换机的时候 数据就接收不到了,然后接下来又是一顿搜索。
最后搜索到这个一般组播程序中是会涉及到跳数这一个概念的,也就是TTL(跳数(Hops)是一个网络通信的概念,用来衡量数据包从源节点到目标节点经过的中间路由器或交换机数量)。最后就修改程序,给socket设置了跳数,防止层级过多,就设置的比较大了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 组播下发
*
* @param data 下发数据
* @param multicastHost ip
* @param multicastPort 端口
*/
public static void multicastSend(byte[] data, String multicastHost, int multicastPort) {
if (multicastHost == null || multicastHost.equals("")) {
return;
}
try {
MulticastSocket socket = new MulticastSocket(multicastPort);
// 设置组播组的地址
InetAddress group = InetAddress.getByName(multicastHost);
// 加入 组播组
socket.joinGroup(group);
// 存储在数组中 初始化DatagramPacket
DatagramPacket packet = new DatagramPacket(data, data.length, group, multicastPort);
// 通过MulticastSocket实例端口向组播组发送数据 就是新增了这么一行
socket.setTimeToLive(128);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}

}

其实问题解决后也就很简单,这个问题的关键就在于我忽略了ttl的重要性,需要继续学习。

总结

这是我的第一次出差,遇到问题也很正常,好在最后也都解决了,在这一过程中学会了Wireshark的使用,也了解到了组播的相关概念。