CPE上的STUN和TR069功能详解和实验

这篇具有很好参考价值的文章主要介绍了CPE上的STUN和TR069功能详解和实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stun上所设计到的4种nat类型:

最近在测试cpe的时候遇到了一个感觉比较老的协议stun和tr069,以前没怎么用过,所以来记录一下:

  1. Full Cone NAT: 这种类型的NAT只需一个公共IP地址,它将任何外部IP地址和端口映射到内部网络中的一个特定IP地址和端口。这种类型的NAT不会更改IP地址或端口,因此被称为“全锥形”。

  2. Restricted Cone NAT: 这种类型的NAT只会将来自一个外部IP地址和端口的流量映射到内部网络中的一个特定IP地址和端口。但是,只有在内部网络中的特定IP地址和端口向外部IP地址和端口发送数据包时,才能建立连接。这种类型的NAT被称为“受限制的锥形”。

  3. Port Restricted Cone NAT: 这种类型的NAT与受限制的锥形NAT类似,但还限制了内部网络中的特定IP地址和端口只能与一个特定的外部IP地址和端口通信。这种类型的NAT被称为“端口受限的锥形”。

  4. Symmetric NAT: 这种类型的NAT会将来自外部IP地址和端口的数据包映射到内部网络中的一个特定IP地址和端口,并为该连接创建一个新的映射。当内部网络中的不同IP地址和端口向外部IP地址和端口发送数据包时,将创建不同的映射。这种类型的NAT被称为“对称的”。

备注:上述的这几种nat类型在实际应用过程中,只有第4种类型的nat无法应用与stun,至于为什么不能可以去详细搜一下相关资料;我们家庭里面所使用的路由器基本上nat类型都是属于对称nat类型,openwrt路由器在被一些厂家定制自己的uboot的时候都是默认用的该种类型的nat,可能是考虑的安全吧,因为这种nat类型和路由器上nf_conntrack里面记录的seesion会话数是一一对应的,不同的外网ip映射的公网ip和端口都是不同的,且还有会话超时时间,我没记错的话,openwrt路由器上的udp会话老化时间是60s,icmp是120s,tcp的几种状态机制我不太记得了,所以在测试stun和tr069的时候,模拟nat类型需要排除第4种nat类型;如果想知道自己的当前网络是那种nat类型可以去下载一个nat检测工具来检测一下;一般情况下,光猫是路由模式的话,这种网路环境就是对称nat,如果光猫是桥模式,路由器去pppoe拨号的话,这种网络环境就是全锥型nat类型。

什么是TR069?

这是CPE上的一种设备远程管理平台,用于远程管理和监控网络中的设备和设施。TR-069协议主要用于家庭网关、路由器、光猫等网络设备的远程管理,可以实现远程配置、监控和维护。TR-069采用客户端/服务器模型,通过服务器向客户端发送命令,控制客户端设备的配置和状态。TR-069协议的使用可以提高网络设备的管理效率,减少管理成本,同时也可以提高网络安全性。其实我也不太明白为什么要花钱去买个ACS来管理,因为现在基本上所有做路由器的厂商在进行云管理的时候,一般都通过一些TCP的长连接就管理设备了,不知道为啥还需要用这个老协议。一般acs这个平台就是通过tr069管理自己的路由设备的,比如路由器可以将自己的cpu和基本信息上报给acs平台,acs平台可以通过路由器每次上报的时间间隔所建立的会话来下发一些配置,如重启呀这些乱七八糟的东西,我看到cpe上报的这些信息和我之前所接触的snmp种mib很像,不过snmp是一个比较大的管理协议,且一般在x86架构的设备上使用,可能tr069是实用与这种小型的网络设备的管理吧。

TR069和stun有什么联系?

我们的CPE设备100%都是挂在一个nat网络环境中的,而在这种网络环境中,我们的ACS平台要去下发一些命令配置给CPE就必须要等下一次CPE主动上报后,利用这个上报所建立的seesion去反向给设备下发配置,这样设备才能收到,但是假如我们想随时随地的去下发配置和获取CPE的一些状态信息,那不是每次都要等CPE主动上报的时间间隔才能下发?这显然不是我们所期待的,于是就有个stun,一般stun和acs都继承在一个平台,通过在cpe上配置stun服务器的地址,cpe定时的想stun绑定自己的公网ip和端口,这样acs下一次就可以利用这个绑定的公网ip和端口向CPE发起udp连接,通知CPE主动和acs建立tcp连接,acs好立刻把消息通过这个会话数下发下去。

下图是我的这款CPE的tr069上报的间隔时间为18000s,所以如果我没有stun那么每次下发配置就要等18000秒后,cpe主动上报后我才能下发配置。

tr069服务器搭建,智能路由器,网络,测试工程师,运维 

这里可能就有疑问了,我把它设置个30s或者10s不就完了?这显然是不符合现实的网络环境的,你想不可能就你一台设备在上报消息,而且acs这种平台本身稳定性感觉不高,当这个平台管理了1000台甚至1万台设备的时候,绝对会出现消息拥堵的,所以stun就是为了缓解这种现象的。

具体使用方法 

1、配置好你自己的测试环境的stun服务器地址和前面的TR069相关的配置:

tr069服务器搭建,智能路由器,网络,测试工程师,运维

2、搭建好自己的测试环境,模拟好nat,注意一定不能使用对称nat环境否则stun穿透就没啥用的,因为他穿透不进来,这是我的一个拓扑图,我没有公网的stun和acs所以只能在内网搭建环境进行测试。

 tr069服务器搭建,智能路由器,网络,测试工程师,运维

 文章来源地址https://www.toymoban.com/news/detail-672525.html

3、环境搭建好后我们去acs上查看就可以看到cpe上报的udpconnect的连接地址和端口了,这个就是stun绑定的公网ip和饥饿端口,也就是我上面的openwrt路由器的外网的ip和端口。 

 tr069服务器搭建,智能路由器,网络,测试工程师,运维

4、这个时候我们就可以不用等待18000s后下配置了,直接在acs上通过udpconnectionrequestaddress先给cpe下发url地址

tr069服务器搭建,智能路由器,网络,测试工程师,运维

备注 :这里acs连续发了三次UDP Connection Request,我去搜索了解了一下,这是acs规定的,避免网络丢包所以连续发了三次,所发送的包里面包含了一个url的消息体格式,ACS向CPE发送一个UDP Connection Request,来触发一个CWMP TR069会话的流程。此示例中,STUN服务器发送了多次相同的UDP Connection Request,以保障消息能被CPE成功接收

5、下面就是开始cpe和acs之间进行相关交互的报文,cpe主动发起TCP与acs建立好连接后开始进行相关配置的下发的操作,在下发配置前,还交互了几个TCP的data报文,我没看懂是什么意思,抓包看,我的cpe和acs之前好像不需要进行auth相关的摘要认证,cpe就直接对acs发起了http请求,然后ACS响应了200 OK,SOAP内容为InformResponse。根据响应头的Set-Cookie信息设置CPE下个请求的Cookie。

tr069服务器搭建,智能路由器,网络,测试工程师,运维

tr069服务器搭建,智能路由器,网络,测试工程师,运维 

 6、后面cpe就发起了一个空的http请求,根据TR069协议,消息体长度必须为0,如下案例可以看到Content-Length是0:

tr069服务器搭建,智能路由器,网络,测试工程师,运维

 7、ACS响应HTTP 空请求,封装SOAP调用RPC方法,对终端设备进行参数配置或者查询等操作

tr069服务器搭建,智能路由器,网络,测试工程师,运维

8、CPE响应上述所下发的配置参数是否成功 

tr069服务器搭建,智能路由器,网络,测试工程师,运维

9、ACS下发一个空HTTP响应,根据TR069协议,状态码使用“204(无内容)”,表示本次会话结束,就是目前所有的配置我都下发完了,准备关闭咱们后续的tcp连接了

tr069服务器搭建,智能路由器,网络,测试工程师,运维 

10、开始关闭acs和CPE之前的连接了,后面所需要再次进行下发配置,步骤应该和前面大差不差 

总结

     到这里我的stun和acs的测试已经结束了,可以看到acs这一套的流程还蛮复杂,各种各样的消息体格式,我到现在可能都还有些地方有些模糊。那么就到这里了,有问题留言哦,欢迎前辈们,指正所出现的错误。

备注:上述设计到的acs和cpe之前的交互参考了博文:ACS与CPE的全双工实现-51CTO.COM

如设计到相关侵权问题请立马告知,完全属于无意,秉承学习态度在这里记录自己所遇到的一些新的东西。

 

到了这里,关于CPE上的STUN和TR069功能详解和实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • tr td 编写表格

    用于创建表格的3个基本元素是: 首标签table和尾标签/table分别表示一个表格的开始与结束。这是不难理解的。 tr是“ t able  r ow(表格行)”的缩写,用于表示一行的开始和结束。这也容易理解。 td是“ t able  d ata(表格数据)”的缩写,用于表示行中各个单元格(cell)的开

    2024年02月16日
    浏览(30)
  • HTML <tr> 标签

    一个简单的 HTML 表格,包含两行两列: tr 标签定义 HTML 表格中的行。 元素 Chrome IE Firefox Safari Opera tr Yes Yes Yes Yes Yes 所有浏览器都支持 tr 标签。 在 HTML 4.01 中,tr 元素的 \\\"bgcolor\\\" 是不被赞成使用的。 在 XHTML 1.0 Strict DTD 中,tr 元素的 \\\"bgcolor\\\" 是不被支持的。 属性 值 描述 alig

    2024年02月09日
    浏览(50)
  • Linux----tr命令详细使用方法

    【原文链接】Linux----tr命令详细使用方法 tr命令用于字符转换、替换和删除,主要用于删除文件中的控制符或进行字符串转换等。 -d: 删除字符串 -s: 删除所有重复出现字符序列,只保留第一个,即将重复出现字符串压缩为一个字符串 字符串 含义 a-z或[:lower:] 匹配所有小写字母

    2024年02月07日
    浏览(44)
  • 如何用java来实现TR369协议

    要用Java实现TR-369协议,您需要做以下几个步骤: 一、理解TR-369协议规范 : 首先,您需要仔细阅读和理解TR-369协议的规范文档。这将帮助您理解协议的各个组成部分,包括数据模型、管理接口、消息格式、通信流程等。 二、定义数据模型 : TR-369定义了一个用户设备数据模型

    2024年03月14日
    浏览(46)
  • linux命令---grep、sort、uniq、tr

    grep命令 grep命令用于按行提取文本内容 语法格式: grep命令中常用的参数及作用 参数 作用 -b 将可执行文件(binary)当做文本文件(text)来搜索 -c 仅显示找到的行数 -i 忽略大小写 -n 显示行号 -v 反向选择–仅列出没有“”的行 -A -A 2:搜索时显示匹配到的那一行以及下

    2023年04月13日
    浏览(35)
  • 常用文本内容命令(tr cut sort uniq)

    1,替换 将1  替换成   a 将小写替换成大写 2,删除  -d 删掉 1 3,压缩(连续的)    -s 压缩连续的1 1,cut -d  指定分隔符 2,cut -f   指定需要的列 1,3  (1,3两列)        1-3(1到3列) 3,切割指定内容 切割sda 磁盘使用量        查看磁盘|   过滤sda|  压缩连续的空格为一

    2024年01月18日
    浏览(36)
  • 【KITTI】Kitti数据集 Tr(旋转平移)矩阵求逆

            本节详细介绍KITTI从图像坐标系到激光雷达坐标系的变换原理、过程和代码。         Kitti数据集的Tr_velo_to_cam矩阵是将激光雷达点云坐标变换到图像坐标系。Tr是一个3x4的矩阵,直接左乘激光雷达坐标即可得到图像坐标系中的坐标。         Tr可以认为是由

    2023年04月24日
    浏览(47)
  • Linux系统命令 --- seq tr cut sort uniq

    目录 一、seq ---- 输出序列化参数 1、seq  数字    按照顺序打印 2、-s   使用指定字符串分割数字 3、计算1-20,并求和 4、-w  在每一列数字前加零  默认补全 二、tr、对数字进行处理 1、替换 2、删除 3、压缩 4、补集 三、cut   截取 四、sort  排序 五、uniq  压缩连续的字符

    2024年02月01日
    浏览(37)
  • Qt中QObject::tr():qt中的翻译之道

    在Qt中,QObject::tr()函数是一个用于国际化的重要工具,它提供了文本翻译和本地化的支持。本篇博文将详细介绍QObject::tr()函数的使用方式、特性以及应用场景,帮助入门级开发者了解如何在Qt应用程序中进行文本翻译和本地化。 什么是QObject::tr()函数? 为什么使用QObject::tr(

    2024年02月16日
    浏览(30)
  • 复制tr的一行数据或者复制数据使用,使用jq和php

    1.插入tr就是在数据库加入一条数据。如果想td都为空,把它删除,可以在刷新的时候,判断td是否都为空那就删除。 2.删除tr就是先删除dom节点,然后再删除数据库的数据。 3.这个操作有好的一面,就是用户在刷新后,也可以保存数据的完整性。如果使用jq复制的数据,刷新就

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包