上海电信 TL-EP110 + RT-AC86U 实现观看 4K IPTV 无卡顿 (2019-10)

前言

网上能找到不少路由器接 IPTV 的例子,前期给了我很大的帮助。但我选的这两个设备给我留了两个大坑,几经折腾才终于能流畅观看了。过程中学到不少目前百度/谷歌都找不到或很难找到的东西,做一下分享。

拓扑图

拓扑图

两个大坑

  • RT-AC86U 不支持 robocfg 命令,网上找不到正确配置 VLAN 的例子。
  • 目前能找到的例子都有使用电信设备设置组播(VLAN 51),这背后隐藏了一些细节,不正确配置会导致卡顿/卡死。

几个知识点

  • 路由器接 IPTV 需要在路由器上配置 DHCP OPTION 125 (上海电信是这个),网上很多例子,这里不再赘述。
  • 上海电信拨号上网(PPPoE)走 Native VLAN (untagged),IPTV 专网走 VLAN 85,组播走 VLAN 51。
  • 网上有人提到现在 4K IPTV 不需要 VLAN 51 了,其实是需要的,这跟前面提到的坑有关。

RT-AC86U VLAN 配置

照着网上的例子,发现 RT-AC86U 没有 robocfg,而且找不到替代方法,很绝望啊有没有。倒是看到有人提到 vlanctl,但没正确配置的例子,谷歌也只看到有人在研究,没有个结果。不过发现梅林的源代码里其实有用到这个命令,经过仔细对比上下文,加上大脑的飞速运转 [滑稽](其实是花了一整天就琢磨那几个参数),终于弄明白了。

由于示例太长,单独发了博客:RT-AC86U VLAN 配置 - vlanctl 篇。另外过程中还发现使用 vconfig 同样可以配置 VLAN,甚至更简单,参见:RT-AC86U VLAN 配置 - vconfig 篇

不看也没有关系,本文最后有完整脚本。

IGMP Snooping

配置好 VLAN 85 后,IPTV 盒子 就能同时获取到 公网 和 专网 的 IP 地址了。但是事情总没那么顺利,这时你会发现看直播一会就卡,再过一会直接卡死。

在说怎么解决之前,先说一下我当时的情况。因为某种没必要细说的原因,我当时撤下了自己的光猫(TL-EP110),换回了电信光猫,这时候抓包会发现组播的数据是在 VLAN 85 传输的。

经过对每一层接口进行抓包分析,发现组播数据传到了 vlan85 这个 bridge 后就没再往后传了。好在当时花时间狂补了组播相关知识,感觉应该跟 IGMP Snooping 有关。几番查找,在 梅林 源代码中看到 bcmmcastctl 这个命令,用法如下:

bcmmcastctl mode -i vlan85 -p 1 -m 1  # 对 vlan85 启用 IGMP Snooping
bcmmcastctl mode -i vlan85 -p 2 -m 1  # 对 vlan85 启用 MLD Snooping(这个是针对 IPv6 的,可以不管)

测试后可用![泪流满面]

然而还是高兴得太早...

VLAN 51

换回自己的光猫,发现直播还是卡,这时候心里飘过一群草泥马。继续抓包发现组播数据是从 VLAN 51 传进来的,而用电信光猫时完全就没看见 VLAN 51 的影子!这时候我做了一个大胆的假设,电信光猫一定是把 VLAN 51 的数据转发到了 LAN 端 的 VLAN 85 ,如下图所示:

说时迟那时快(其实是说时快那时傻p兮兮的),我立马尝试在路由器上做类似的配置,果不其然(心里想我真TND聪明),终于可以无比丝滑地看电视了(虽然以后会不会看还不一定呢)!

最终配置

两个版本二选一,推荐使用 vconfig 版。另外,记得还要配置 DHCP OPTION 125(自行百度吧)。

#!/bin/sh

# 该脚本需要在 services-start 中运行

ifconfig eth0 allmulti up

#####################################################################
vlanctl --mcast --if-create eth0 0                                  #
vlanctl --if eth0 --rx --tags 0 --set-rxif eth0.v0 --rule-append    #
ifconfig eth0.v0 up                                                 #
                                                                    #
brctl addbr br1                                                     #
brctl addif br1 eth0.v0                                             #
ifconfig br1 up                                                     #
                                                                    #
nvram set wan_ifnames=br1                                           #
nvram set wan_ifname=br1                                            #
nvram set wan0_ifname=br1                                           #
#####################################################################

#####################################################################
brctl delif br0 eth1                                                #
                                                                    #
vlanctl --mcast --if-create eth1 0                                  #
vlanctl --if eth1 --rx --tags 0 --set-rxif eth1.v0 --rule-append    #
ifconfig eth1.v0 up                                                 #
                                                                    #
brctl addif br0 eth1.v0                                             #
#####################################################################

vlanctl --mcast --if-create eth0 85
vlanctl --if eth0 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --rx --tags 1 --filter-vid 51 0 --pop-tag --set-rxif eth0.v85 --rule-append
vlanctl --if eth0 --tx --tags 0 --filter-txif eth0.v85 --push-tag --set-vid 85 0 --rule-append
ifconfig eth0.v85 up

vlanctl --mcast --if-create eth1 85
vlanctl --if eth1 --rx --tags 1 --filter-vid 85 0 --pop-tag --set-rxif eth1.v85 --rule-append
vlanctl --if eth1 --tx --tags 0 --filter-txif eth1.v85 --push-tag --set-vid 85 0 --rule-append
ifconfig eth1.v85 up

brctl addbr vlan85
brctl addif vlan85 eth0.v85
brctl addif vlan85 eth1.v85
ifconfig vlan85 up

bcmmcastctl mode -i vlan85 -p 1 -m 1
bcmmcastctl mode -i vlan85 -p 2 -m 1
#!/bin/sh

# 该脚本可手动执行,或放入 wan-start 中开机自动运行

vconfig set_name_type DEV_PLUS_VID_NO_PAD
vconfig add eth0 85
vconfig add br0 85

brctl addbr vlan85
brctl addif vlan85 eth0.85
brctl addif vlan85 br0.85

bcmmcastctl mode -i vlan85 -p 1 -m 1
bcmmcastctl mode -i vlan85 -p 2 -m 1

ifconfig eth0.85 up
ifconfig br0.85 up
ifconfig vlan85 up

vconfig add eth0 51
brctl addif vlan85 eth0.51
ebtables -A FORWARD -i eth0.51 -o ! br0.85 -j DROP
ebtables -A FORWARD -o eth0.51 -j DROP
ifconfig eth0.51 up

作者:u128393
首发:https://www.cnblogs.com/u128393/p/11629969.html

posted @ 2019-10-07 12:19  u128393  阅读(5877)  评论(2编辑  收藏  举报