找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

211

积分

0

好友

23

主题
发表于 3 天前 | 查看: 2| 回复: 0

在构建网络交互软件时,常采用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:数据会到达网卡吗?

不会,因为网关未收到对该组播地址的加入请求。

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 15:43 , Processed in 0.098548 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表