在构建网络交互软件时,常采用UDP组播实现单发送侧和单接收侧的通信。接收侧绑定三个端口号(例如5001、5002和5003),并加入一个组播地址。当发送侧向该组播地址及对应端口发送数据时,接收侧即可接收信息。
然而,一个常见疑问是:接收侧绑定的端口是用于控制数据接收,还是用于接收后的筛选?例如,如果接收侧已加入组播,但发送侧向组播地址发送数据时指定端口为5004,这组数据是否还会到达接收侧?是否会占用接收侧的网络接口带宽?

问题1:接收侧所绑定的端口是用于控制接收还是用于控制接收后的筛选?
答案是控制接收后的筛选。数据首先由网络接口卡(NIC)和IP层接收,然后UDP层通过socket进行匹配。如果匹配成功(基于五元组,包括目的端口),数据包会被放入匹配socket的接收队列;否则丢弃。
举例说明:假设组播数据包的目的IP为239.1.1.1,目的端口为5004。接收方有三个应用程序:
- App1:加入组播组239.1.1.1,绑定UDP端口5001
- App2:加入组播组239.1.1.1,绑定UDP端口5002
- App3:加入组播组239.1.1.1,绑定UDP端口5003
只要有一个应用程序运行,它会向网关发送IGMP加入组239.1.1.1的请求,从而接收该组播流量。当数据包到达时,UDP层会使用socket五元组(包括目的端口5004)进行匹配。由于没有应用程序绑定端口5004,匹配失败,数据包被丢弃。
问题2:这一组数据是否还会到达接收侧?
参考上述过程,数据已经到达接收侧,但在UDP层被丢弃。
问题3:是否会占用接收侧的网络接口带宽?
是的,数据包到达网卡并上行到UDP层,因此会占用接收侧的网络带宽。
问题4:如何避免不感兴趣的组播数据包到达网卡并占用带宽?
解决方案是使用独一无二的组播地址来识别应用,而非依赖端口号。例如:
- App1:加入组播组239.1.1.1,UDP端口为任意
- App2:加入组播组239.1.1.2,UDP端口为任意
- App3:加入组播组239.1.1.3,UDP端口为任意
如果发送侧向组播地址239.1.1.4端口5004发送数据,网关只会转发你感兴趣的组播IP(239.1.1.1、239.1.1.2、239.1.1.3),因此239.1.1.4的数据不会到达你的网卡,也不会占用带宽。
问题5:数据会到达网卡吗?
不会,因为网关未收到对该组播地址的加入请求。
|