wuwentao / bj-unicom-iptv

北京联通IPTV播放列表 Beijing Unicom IPTV playlist bj-unicom-iptv.m3u
https://github.com/wuwentao/bj-unicom-iptv
593 stars 114 forks source link

广播风暴控制 (Mbps) 这个你设置了多少? #3

Closed qwerttvv closed 4 years ago

qwerttvv commented 4 years ago

开组播的话,这个应该多少合适啊

wuwentao commented 4 years ago

不好意思啊!我用的是Merlin,貌似没有您说的这项参数设置 话说,IGMP我一直也开着,但是基本吃灰……送的那个机顶盒基本没怎么开机用。

其次中继带宽目前看也足够用,都是走千兆接口,300M上网带宽,IPTV正常是接在100M接口下面的,我继续使用千兆口中继了,所以平时使劲跑也占不了多少,就没有过多关注这一块的设置。

按理来说,这个参数是通过哪个程序的功能来实现?我也顺带学习一下! ssh登录路由器,ps查看相关的进程名称和运行的服务,应该是类似的。

例如,我这边Merlin的路由器:

ps命令找到路由器里面正在运行的三个程序daemon: ··· /usr/sbin/igmpproxy /tmp/igmpproxy.conf /usr/sbin/snooper -b br0 -s vlan1 -x /usr/sbin/udpxy -m eth0 -p 8012 -B 65536 -c 10 -a br0 ···

然后查看帮助文件和配置文件:


admin@xxxx:/tmp/home/root#  /usr/sbin/snooper -h
Usage: snooper [-d|-D] [-q|-Q] [-s <switch>] [-b <bridge>] [-v <vid] [-x]

admin@xxxx:/tmp/home/root# /usr/sbin/igmpproxy -h
Usage: igmpproxy [-h] [-d] [-v [-v]] <configfile>

   -h   Display this help screen
   -d   Run in debug mode. Output all messages on stderr
   -v   Be verbose. Give twice to see even debug messages.

igmpproxy 0.1.2
admin@xxxx:/tmp/home/root#

admin@xxxx:/tmp/home/root#  cat /tmp/igmpproxy.conf
phyint eth0 upstream ratelimit 0 threshold 1 altnet 0.0.0.0/0
phyint br0 downstream ratelimit 0 threshold 1
admin@xxxx:/tmp/home/root#

admin@xxxx:/tmp/home/root# /usr/sbin/udpxy
udpxy 1.0-23.10 (prod) standard [Linux 2.6.36.4brcmarm armv7l]
usage: /usr/sbin/udpxy [-vTS] [-a listenaddr] -p port [-m mcast_ifc_addr] [-c clients] [-l logfile] [-B sizeK] [-n nice_incr]
    -v : enable verbose output [default = disabled]
    -S : enable client statistics [default = disabled]
    -T : do NOT run as a daemon [default = daemon if root]
    -a : (IPv4) address/interface to listen on [default = 0.0.0.0]
    -p : port to listen on
    -m : (IPv4) address/interface of (multicast) source [default = 0.0.0.0]
    -c : max clients to serve [default = 3, max = 5000]
    -l : log output to file [default = stderr]
    -B : buffer size (65536, 32Kb, 1Mb) for inbound (multicast) data [default = 2048 bytes]
    -R : maximum messages to store in buffer (-1 = all) [default = 1]
    -H : maximum time (sec) to hold data in buffer (-1 = unlimited) [default = 1]
    -n : nice value increment [default = 0]
    -M : periodically renew multicast subscription (skip if 0 sec) [default = 0 sec]
Examples:
  /usr/sbin/udpxy -p 4022
    listen for HTTP requests on port 4022, all network interfaces
  /usr/sbin/udpxy -a lan0 -p 4022 -m lan1
    listen for HTTP requests on interface lan0, port 4022;
    subscribe to multicast groups on interface lan1

  udpxy and udpxrec are Copyright (C) 2008-2013 Pavel V. Cherenkov and licensed under GNU GPLv3
  Contact: www.udpxy.com/forum; support@udpxy.com

admin@xxxx:/tmp/home/root#
qwerttvv commented 4 years ago

我其实没开组播,机顶盒隔几个月抓一次包看看频道更新

每次机顶盒链接的是猫的wifi

wuwentao commented 4 years ago

那问题就是以下几个方面:

  1. 你IPTV是绑定固定的接口么?那么上网流量就不会影响了,因为不同的vlan的流量互相隔离了的。
  2. 如果不绑定固定接口,就是任何接口都可以,取决于你的光猫接口是百兆还是千兆,如果是千兆,那就占用不了多大带宽,记得opengg的帖子里面是有带宽测试的,十路IPTV也占用不了多少,我也简单试了试,高清带宽占用并不大,4K节目稍微高点,一路4K节目源大概30M左右即可,开十路也就300M。
  3. 如果你光猫是百兆了,可能就悲剧了,建议找联通换光猫吧! 路由器升级千兆应该也ok了。
  4. 所以这个广播风暴你主要的关注点是哪里?我理解应该就是IGMP流量的上限,因为当普通百兆路由器时,确实是互相影响非常大,毕竟高清节目占用10M左右带宽,多开几路就会把普通百兆带宽撸满了,造成网络拥塞,而我用的Merlin路由器所有接口都是全千兆的,所以带宽可能压力小很多,就压根没得这个选项了…… 欢迎继续讨论,交流,主要我也没用过这个功能,以上纯属个人猜测,也许有误,仅供参考
qwerttvv commented 4 years ago

我很奇怪就是我当时设置1m,一样可以看4k,4k台我看大概带宽需求是24m

所以不知道是设置不生效还是哪里的问题,单纯的奇怪,实际环境中其实用不到这个

wuwentao commented 4 years ago

我很奇怪就是我当时设置1m,一样可以看4k,4k台我看大概带宽需求是24m

所以不知道是设置不生效还是哪里的问题,单纯的奇怪,实际环境中其实用不到这个

那就是还是在路由器上UDPXY实现组播转多播呗?这个设置只是针对IGMP相关的带宽吧?你用udpxy以后下行播放的是TCP http流量,不属于IGMP组播流量,所以就没有限制了。 既然这个IGMP带宽限制不生效,那就说明它是针对IGMP组播的下行单宽的限制,而不是上行的源接口,这样就说的通了。

qwerttvv commented 4 years ago

我实际环境中组播都关了,没igmp流泪

但是打开组播,设置广播风暴控制1m,也能看4k,就比较奇怪

wuwentao commented 4 years ago

你是路由器上关闭了IGMP吧?光猫里面关闭了么? 另外,你是PC端播放4K吧?不是IPTV机顶盒吧?

qwerttvv commented 4 years ago

光猫当然没关,关了就都看不了了啊

pc播4k走udpxy的http流量

机顶盒连光猫wifi走igmp

测试的时候,路由打开组播,走igmp,pc走igmp播4k,设置1m广播风暴,不卡,pc到路由是wifi连接

wuwentao commented 4 years ago

请问最后一句是什么意思?

  1. 路由打开组播, 走IGMP?应该是说路由开启IGMP proxy和snooping吧?
  2. PC走IGMP播4K? 请问你怎么通过PC走IGMP播4K? 这里不是udpxy的 http流量?
wuwentao commented 4 years ago

@qwerttvv 还有一个问题一直忘了 麻烦您设置好这个限速以后,ssh或telnet登录路由器,使用ps命令查看igmproxy进程,以及后面的igmproxy.conf的配置文件路径,然后cat /xxxx/igmproxy.conf,共享一下配置结果? 限速设置理论上来说,应该是写入了这个配置文件,所以,web上配置成功以后,麻烦看一下这个配置,里面会显示上行还是下行的速率!

qwerttvv commented 4 years ago

电脑你随便来个支持的播放器,rtp地址直接播就是了,vlc,mpcbe都行

修改10m和100m,这个配置文件没变化

wuwentao commented 4 years ago

@qwerttvv 请问您用的什么路由器和固件版本?固件得查一下对应的web选项实际是配置哪个daemon上的限速功能了! 如果是针对igmproxy.config的,则可能是bug 如果是针对其他daemon的配置文件,则需要使用该daemon的连接,才能使用这个限速功能了, 所以,核心还得根据路由器固件和版本、尤其是源码去确认这个功能最终影响的范围。

qwerttvv commented 4 years ago

先看看这个吧。。。https://github.com/pcherenkov/udpxy/issues/18

wuwentao commented 4 years ago

这个端口监听冲突reuse的,没搞过……抱歉,估计只能follow作者的patch,验证一下reuse是否有效了如果能解决最好,如果实在解决不了,恐怕你还是得看看到底啥服务运行在udp的这个IP:port导致冲突,然后调整配置,太具体化的东西了

qwerttvv commented 4 years ago

我编译失败。。。测都没能力测,,

wuwentao commented 4 years ago

@qwerttvv 我前几天找了个斐讯,刷了个Padavan,今天刚好看到了你说的这个广播风暴的配置,大概看明白了,这个参数应该和IPTV没啥直接联系,貌似是直接控制switch芯片的!

结论: 也就是修改这个参数,是直接通过switch芯片来控制**广播风暴的最大速率,根本不是多播或者IPTV直播的速率限制**(其实我没有环境,也没法仔细看,现在看完才清楚)

另外,这个页面里面应该是有多播控制的,估计是switch芯片不支持,所以就被隐藏了?所以实际只控制广播风暴,用英文版,旁边就有详细的图文说明了

  1. 网页原始配置源代码:

    <table width="100%" align="center" cellpadding="4" cellspacing="0" class="table">
                                        <tr>
                                            <th colspan="2" style="background-color: #E3E3E3;"><#SwitchStorm#></th>
                                        </tr>
                                        <tr id="row_storm_ucast">
                                            <th><a class="help_tooltip" href="javascript:void(0);" onmouseover="openTooltip(this, 6, 7);"><#RouterConfig_GWMulticast_unknownUni_itemname#></a></th>
                                            <td>
                                                <input type="text" maxlength="4" class="input" size="15" name="controlrate_unknown_unicast" value="<% nvram_get_x("", "controlrate_unknown_unicast"); %>" onkeypress="return is_number(this,ev
                                                &nbsp;<span style="color:#888;">[0..1000]</span>
                                            </td>
                                        </tr>
                                        <tr id="row_storm_mcast_unk">
                                            <th><a class="help_tooltip" href="javascript:void(0);" onmouseover="openTooltip(this, 6, 8);"><#RouterConfig_GWMulticast_unknownMul_itemname#></a></th>
                                            <td>
                                                <input type="text" maxlength="4" class="input" size="15" name="controlrate_unknown_multicast" value="<% nvram_get_x("", "controlrate_unknown_multicast"); %>" onkeypress="return is_number(thi
                                                &nbsp;<span style="color:#888;"></span>
                                            </td>
                                        </tr>
                                        <tr id="row_storm_mcast">
                                            <th><a class="help_tooltip" href="javascript:void(0);" onmouseover="openTooltip(this, 6, 9);"><#RouterConfig_GWMulticast_Multicast_itemname#></a></th>
                                            <td>
                                                <input type="text" maxlength="4" class="input" size="15" name="controlrate_multicast" value="<% nvram_get_x("", "controlrate_multicast"); %>" onkeypress="return is_number(this,event);"/>
                                                &nbsp;<span style="color:#888;">[0..1000]</span>
                                            </td>
                                        </tr>
                                        <tr>
                                            <th width="50%"><a class="help_tooltip" href="javascript:void(0);" onmouseover="openTooltip(this, 6, 10);"><#RouterConfig_GWMulticast_Broadcast_itemname#></a></th>
                                            <td>
                                                <input type="text" maxlength="4" class="input" size="15" name="controlrate_broadcast" value="<% nvram_get_x("", "controlrate_broadcast"); %>" onkeypress="return is_number(this,event);"/>
                                                &nbsp;<span id="lbl_bcast" style="color:#888;">[0..1000]</span>
                                            </td>
                                        </tr>
                                    </table>
  2. 网页选项叫:Broadcast Storm Control (Mbps): 网页上详细解释是:Enable this feature to control the network traffic and avoid a broadcast storm, which would result to a network slowdown or to an unusable network. The range for this field is 1 to 1000. Enter 0 (zero) to disable this feature.

  3. 修改这个参数以后,所有的参数实际是直接存在nvram里面了,但是只支持broadcast配置,并没有开放multicast的配置功能,我不确定这个switch芯片是否支持:

    xxx:/home/root # nvram show  |grep broadcast
    controlrate_broadcast=10
    xxx:/home/root # nvram show  |grep multicast
    controlrate_unknown_multicast=0
    controlrate_multicast=0
    xxx:/home/root #
  4. 实际代码貌似是在这里: https://github.com/shantanugoel/asus-rt-n66u-merlin/blob/master/release/src/router/rc/sysdeps/init-ralink.c 搜索关键字broadcast即可。