STUN协议详解

10 篇文章 3 订阅
订阅专栏

STUN 支持两种类型的事务,分别是 REQUEST/RESPONSE 事务和 INDICATION 事务。STUN 本身并不是一种穿越解决方案,而只是协议,被 NAT 穿越的解决方案(比如 ICE 和 TURN)所使用。

STUN 协议能够帮助处于内网的终端确定 NAT 为其分配的外网 IP 地址和端口。

在 ICE 中,STUN 协议用于连通性检查(BINDING_REQUEST/RESPONSE)和 ICE 的保活(BINDING_INDICATION)。在 TURN 协议中,STUN 协议用于 Allocation 的建立,可以作为中继数据的载体(比如 sendindication 和 dataindication),ICE 和 TURN 是两种不同的 STUN 使用方式。

这里,我们暂时先讨论协议本身:

STUN 报文格式

STUN协议结构由20字节头和若干个属性组成,属性的个数可以为0,且统一是大端字节序的二进制序列。报文分为两部分:

  • 20字节的 STUN Header
  • Body,其中携带0或多个attribute

STUN Header

报文头一共20个字节,其中:

// STUN packet transaction id = 96 bits
#define STUN_TRANSACTION_ID_LEN (UINT16) 12

// STUN Header
typedef struct {
    UINT16 stunMessageType; // 14 bit
    UINT16 messageLength; // 16 bit
    UINT32 magicCookie; // 32 bit
    BYTE transactionId[STUN_TRANSACTION_ID_LEN]; // 96 bit
} StunHeader, *PStunHeader;

Message Type

Message Type是主机字节序,比较重要:

1、BINDING/地址捆绑

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0001  |   BINDING REQUEST                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0011  |   BINDING INDICATION                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0101  |   BINDING RESPONSE SUCCESS                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0111  |   BINDING RESPONSE ERROR                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2、SHARED SECRET/共享私密

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0002  |   SHARED SECRET REQUEST                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0102  |   SHARED SECRET RESPONSE                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0112  |   SHARED SECRET ERROR RESPONSE                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3、ALLOCATE

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0003  |   ALLOCATE                                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0103  |   ALLOCATE SUCCESS RESPONSE                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0113  |   ALLOCATE ERROR RESPONSE                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4、REFRESH

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0004  |   REFRESH                                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0104  |   REFRESH SUCCESS RESPONSE                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0114  |   REFRESH ERROR RESPONSE                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5、SEND

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0006  |   SEND                                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0106  |   SEND INDICATION                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

6、DATA

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0007  |   DATA                                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0107  |   DATA INDICATION                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

7、CREATE PERMISSION

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0008  |   CREATE PERMISSION                                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0108  |   CREATE PERMISSION SUCCESS RESPONSE                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0118  |   CREATE PERMISSION ERROR RESPONSE                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

8、CHANNEL BIND/通道捆绑

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0009  |   CHANNEL BIND REQUEST                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0109  |   CHANNEL BIND SUCCESS RESPONSE                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x0119  |   CHANNEL BIND ERROR RESPONSE                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Message Length

这里的长度,指的是所有 STUN Attributes 的长度:

下面这段,就是 STUN Attributes:

Magic Cookie & Transaction ID

在传输中一般都认为 Cookie 是 Transaction ID 的一部分,故 Transaction ID 被认为是16字节内容。但是 Cookie 在 [RFC 3489] 或者 [RFC 5389] 中是固定数值0x2112A442

Transaction ID 是由请求一方产生,在回复时需要和请求时 Transaction ID 一样,同一请求使用相同的Transaction ID,但客户端需为新的事务选择新的Transaction ID。

STUN Attributes

属性是继在Header之后,以一个个排列的结构(STUN Attributes)组成:

其中,STUN Attributes 由 Attribute Header 和 Attribute Body 组成。其中 Attribute Header 包括了 Type 和 Length,长度固定为 4 字节。Attribute Body 长度不固定,由 Length 决定。

下面,解释一些比较重要的属性:

/**
 * STUN attribute types
 */
typedef enum {
    STUN_ATTRIBUTE_TYPE_MAPPED_ADDRESS = (UINT16)0x0001,
    STUN_ATTRIBUTE_TYPE_RESPONSE_ADDRESS = (UINT16)0x0002,
    STUN_ATTRIBUTE_TYPE_CHANGE_REQUEST = (UINT16)0x0003,
    STUN_ATTRIBUTE_TYPE_SOURCE_ADDRESS = (UINT16)0x0004,
    STUN_ATTRIBUTE_TYPE_CHANGED_ADDRESS = (UINT16)0x0005,
    STUN_ATTRIBUTE_TYPE_USERNAME = (UINT16)0x0006,
    STUN_ATTRIBUTE_TYPE_PASSWORD = (UINT16)0x0007,
    STUN_ATTRIBUTE_TYPE_MESSAGE_INTEGRITY = (UINT16)0x0008,
    STUN_ATTRIBUTE_TYPE_ERROR_CODE = (UINT16)0x0009,
    STUN_ATTRIBUTE_TYPE_UNKNOWN_ATTRIBUTES = (UINT16)0x000A,
    STUN_ATTRIBUTE_TYPE_REFLECTED_FROM = (UINT16)0x000B,
    STUN_ATTRIBUTE_TYPE_XOR_MAPPED_ADDRESS = (UINT16)0x0020,
    STUN_ATTRIBUTE_TYPE_PRIORITY = (UINT16)0x0024,
    STUN_ATTRIBUTE_TYPE_USE_CANDIDATE = (UINT16)0x0025,
    STUN_ATTRIBUTE_TYPE_FINGERPRINT = (UINT16)0x8028,
    STUN_ATTRIBUTE_TYPE_ICE_CONTROLLED = (UINT16)0x8029,
    STUN_ATTRIBUTE_TYPE_ICE_CONTROLLING = (UINT16)0x802A,
    STUN_ATTRIBUTE_TYPE_CHANNEL_NUMBER = (UINT16)0x000C,
    STUN_ATTRIBUTE_TYPE_LIFETIME = (UINT16)0x000D,
    STUN_ATTRIBUTE_TYPE_XOR_PEER_ADDRESS = (UINT16)0x0012,
    STUN_ATTRIBUTE_TYPE_DATA = (UINT16)0x0013,
    STUN_ATTRIBUTE_TYPE_REALM = (UINT16)0x0014,
    STUN_ATTRIBUTE_TYPE_NONCE = (UINT16)0x0015,
    STUN_ATTRIBUTE_TYPE_XOR_RELAYED_ADDRESS = (UINT16)0x0016,
    STUN_ATTRIBUTE_TYPE_EVEN_PORT = (UINT16)0x0018,
    STUN_ATTRIBUTE_TYPE_REQUESTED_TRANSPORT = (UINT16)0x0019,
    STUN_ATTRIBUTE_TYPE_DONT_FRAGMENT = (UINT16)0x001A,
    STUN_ATTRIBUTE_TYPE_RESERVATION_TOKEN = (UINT16)0x0022,

} STUN_ATTRIBUTE_TYPE;

MAPPED-ADDRESS/映射地址

表示 “NAT客户端的反射地址”。其中,Family 标识协议族,包括 IPv4 和 IPv6。其中,IPv4 为 0x01,IPv6 为 0x02。需要注意的是,Port 和 Address 都是以网络序存在,本地查看时需要转换到主机序。

XOR-MAPPED-ADDRESS/亦或映射

与 MAPPED-ADDRESS 属性基本相同,区别在于反射地址经过一次异或(XOR)处理,异或运算是其自身的逆运算,客户端经过一次异或运算获得真实的反射地址。之所以这么做,目的就是解决ALG篡改地址和端口的问题。

USERNAME/用户名

用户名,用于消息完整性,识别在消息完整性检查中使用的用户名和密码组合。

MESSAGE-INTEGRITY/消息认证

STUN 消息的 HMAC-SHA1 值,长度 20 字节,用于消息完整性认证。

FINGERPRINT/指纹认证

FINGERPRINT 属性可以在所有的 STUN 消息中出现。该属性的值被计算为 STUN 消息的 CRC-32 值,与 32 位值 0x5354554e 进行异或操作(这种异或操作有助于处理应用包也在其中使用 CRC-32 的情况)。

32 位 CRC 是 ITU V.42 [ITU.V42.2002] 中定义的,具有生成多项式 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。当存在时,FINGERPRINT 属性必须是消息中的最后一个属性,因此会出现在 MESSAGE-INTEGRITY 之后。

FINGERPRINT 属性可以帮助区分 STUN 数据包与其他协议的数据包。与 MESSAGE-INTEGRITY 一样,FINGERPRINT 属性中使用的 CRC 也覆盖了 STUN 消息头的长度字段。因此,在计算 CRC 之前,此值必须正确,并将 CRC 属性作为消息长度的一部分包括在内。

在消息中使用 FINGERPRINT 属性时,首先将属性放入消息中并赋予虚拟值,然后计算 CRC,最后更新属性的值。如果 MESSAGE-INTEGRITY 属性也存在,则在计算 CRC 之前必须出现具有正确 message-integrity 值的 MESSAGE-INTEGRITY 属性,因为 CRC 也会对 MESSAGE-INTEGRITY 属性的值进行操作。

PRIORITY 和 USE-CANDIDATE

终端必须在其 request 中包含 PRIORITY 属性,指明其优先级,优先级由公式计算而得。如果有需要也可以给出特别指定的候选(即 USE-CANDIDATE 属性)

UNKNOWN-ATTRIBUTES/未知属性

此属性只会在错误代码为 420 的错误响应中出现

ICE-CONTROLLING 和 ICE-CONTROLLED

ICE流程中定义了两种角色:Controlling 和 Controlled。

不同的角色在 Candidate Pair 优先级的计算,Pair Nominate 决策上有所不同。一般流程下,会话的双发各自的角色选择是与会话协商的流程相关的,Offer端是 Controlling,Answer端是 Controlled。

ICE-CONTROLLED 或者是 ICE-CONTROLLING,这两个属性都会携带一个 Tie breaker 这样的字段,其中包含一个本机产生的随机值。收到该 Binding Request 的一方会检查这两个字段,如果和当前本机的 Role 冲突,则检查本机的 Tie breaker 值和消息中携带的 Tie breaker 值进行判定本机合适的 Role。

判定的方法为 Tie breaker 值大的一方为 Controlling。如果判定本端变更角色,这直接修改;如果判定对端变更角色,则对此 Binding Request 发送487错误响应,收到此错误响应的一方变更角色即可。

ERROR-CODE/错误码

属性用于 “error response” 报文中,其中包含了300-699表示的错误码,以及一个UTF-8格式的文字出错信息(Reason phrase)。

SOFTWARE

此属性用于代理发送消息时包含版本的描述,用于客户端和服务器。它的值包括制造商和版本号。该属性对于协议的运行没有任何影响,仅为诊断和调试目的提供服务。SOFTWARE属性是个可变长度的,采用UTF-8编码的小于128个字符的序列号。

ALTERNATE-SERVER

属性表示 STUN 客户可以尝试的不同的 STUN 服务器地址,属性格式与 MAPPED-ADDRESS 相同。

Webrtc Ice协议&Stun 协议
fdsafwagdagadg6576的专栏
12-25 173
时序图: 流程图 OnIceCandidate 代表收集本地 Candidate 的过程,起始于PeerConnection::SetLocalDescription()函数,具体启动代码如下: transport_controller_->MaybeStartGathering();
STUN协议简介
最新发布
DefiniteGoal的博客
12-07 972
STUN协议组成介绍
STUN协议解析
123456789
04-17 6457
文章目录Message HeaderMessage AttributesMAPPED-ADDRESSRESPONSE_ADDRESSCHANGE-REQUESTERROR-CODERESPONSE-ORIGINOTHER-ADDRESSRFC3478 VS RFC5780RFC3478 NAT类型定义完全圆锥形NAT(Full cone NAT)受限圆锥形NAT(Address-Restricte...
stun 协议
qq_43559669的博客
12-20 559
stun存在的意义就是进行nat穿越。 上述这句话是对于stun客户端来说的。 对于客户端来说,客户端首先要发送一个stun消息给到stun服务,stun服务收到这个消息,将发送这个消息的客户端ip地址和端口带回来(过nat为外网,不过为内网地址)。此时客户端即知道自己的外网地址了,当客户端与另外一端进行通讯的时候,通过candiate的交换,就可以将自己的外网地址告诉对方,当对方拿到这个外网地址,就可以进行nat穿越了。 stun对于流媒体服务端的作用是在客户端发送stun请求时候带来用户名和密码,用户名
STUN协议
01-21 656
STUN简介 STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一 个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。一旦客户端
stun协议
BZJ的专栏
01-30 563
一、stun协议格式 1、STUN报文头 1)最高的2位必须置零,这可以在当STUN和其他协议复用的时候,用来区分STUN包和其他数据包。 2)STUN Message Type 字段定义了消息的类型(请求/成功响应/失败响应/指示)和消息的主方法。 虽然我们有4个消息类别,但在STUN中只有两种类型的事务,即请求/响应类型和指示类型。响应类型分为成功和出错两种,用来帮助快速处理STUN信息。Message Type字段又可以进一步分解为如下结构: 其中显示的位为从最高有效位M11到最低有效
WebRTC-STUN协议详解
码农修仙的博客
04-19 2319
1、STUN协议概述 STUN(Session Traversal Utilities for NAT)NAT会话穿透工具,STUN是一个Client/Server协议,支持请求/响应类型、指示类型两种类型。STUN作为ICE(Interactive Connectivity Establishment,交互式连接建立)解决方案的一种工具使用,STUN协议本身没有穿透等能力,只是为穿透提供反射地址,穿透不成功时,需要使用TURN协议。 1.1 请求/响应类型(request/response) 由客户端给服
nb服务器协议,nb-iot协议详解
weixin_33669473的博客
08-06 5432
设计的优点是都能部署在现在的LTE网络,只需要对基站和核心网的软件进行升级即可,不需要为IoT物联网通讯专门设计并建设一个专门网络,可以大大降低建设成本。与LTE一样,NB-IoT终端在开机并搜索载波(小区)时,会在可能的频率范围内重复PSS/SSS的搜索和检测过程,直至搜索到相应的载波(NB-IoT锚定载波),频率扫描的栅格(raster)大小为100kHz。nb-iot技术在有效地提供深度室内...
stun协议深入解剖
12-18
stun协议深入解剖
简析STUN协议-好东西分享
12-03
STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一 个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。
STUN穿透协议
04-24
STUN协议的全称是Simple Traversal of User Datagram Protocol Through Network Address Translators,主要功能是检测是否位于NAT后面,如果位于NAT后面,经过NAT转换后的地址和端口是什么,另外可以检测NAT的类型
STUN 协议实现源码
04-13
按照rfc3489实现STUN协议的客户端和服务端源码,可以做为研究NAT穿透的很好的资料哦!
Stun协议RFC5389
07-28
RF5389文件是08年版本的STUB协议,比较3489协议有了重大的发展
P2P技术之STUN、TURN、ICE详解
qq_52703909的博客
03-26 2192
1、内容概述 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议STUN,首先在RF
Stun/Turn协议草稿
fdsafwagdagadg6576的专栏
10-07 293
2 协议消息(协议头)struct,每个域介绍 2.1 stun and turn 协议 1) NAT 的实现分为四大类 2) stun 协议: 协议头示意图 3) turn 协议 4) stun and turn 协议关系 2.2 sdp协议 1) 与http 协议 2) 与sip协议结合 2.2 协议关系: ice 协议使用stun/turn, sdp,http/sip协议 收集candidates模块使用stun/turn。 offer-answer sdp模块,使用sdp协议 传输sd......
P2P通信标准协议(一)之STUN
weixin_33827965的博客
12-12 373
前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的。可是在现实生活中,我们的程序往往还需要和第三方的协议(如SDP,SIP)进行对接,因此使用标准化 的通用规则来进行P2P链接建立是很有必要的。本文就来介绍一下当前主要应用于P2P通信的几个标准协议,主要有STUN/RFC3489,S...
写文章

热门文章

  • 编解码标准-H.264 4554
  • 流媒体基础-RTP协议 3083
  • Linux下USB设备图像采集 2400
  • ZLMediaKit-手把手编译 1723
  • 流媒体基础-RTP封装PS流 1649

分类专栏

  • 音视频流媒体基础 13篇
  • C++11/14/17 2篇
  • 开发中遇到的各类问题
  • FFmpeg 5篇
  • Linux高性能
  • Linux网络编程 3篇
  • WebRTC 10篇
  • SRS/ZLMediaKit 1篇

最新评论

  • WebRTC-NAT打洞策略

    夏天的风9527: 文不对图!!!!

  • 编解码标准-H.264

    孤寒者: [code=python]讲的很透彻!感谢博主的分享~[/code]

  • 编解码标准-H.264

    孤寒者: 这篇文章写得很好:写的非常详细,内容丰富,具有条理清晰,结构严谨,内容丰富和可借鉴性等特点。 认真看完收获满满,期待下一篇文章的更新。

大家在看

  • 海外云购源码/一元购源码/夺宝源码/英文版云购源码
  • 第二章 网页制作的排版方法 550
  • 许少辉加工中心《乡村振兴战略下传统村落文化旅游设计》南门方向辉少许
  • 京东返利APP的高并发与高可用架构设计 2372

最新文章

  • DTLS SRTP
  • DTLS 密钥协商
  • DTLS 握手
2023年33篇
2022年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕加索解锁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家河南仿铜玻璃钢雕塑制作香港春节商场美陈山东商场美陈厂家直销玻璃钢彩绘新娘雕塑山东多彩玻璃钢雕塑定制沧州玻璃钢雕塑动物园门口玻璃钢雕塑太原玻璃钢景观园林雕塑仿铜玻璃钢雕塑厂家供应福建商业商场美陈采购贵阳商场美陈材料西安玻璃钢雕塑安装商场美陈竞赛上海大型主题商场美陈苏州玻璃钢雕塑室内临沂玻璃钢花盆花器安阳园林玻璃钢卡通雕塑厂家花溪区玻璃钢雕塑厂家电话泡沫玻璃钢人物雕塑制造南阳玻璃钢雕塑厂禅城小品玻璃钢人物雕塑来图定制吉安玻璃钢雕塑定制开封玻璃钢卡通雕塑厂家电话工艺品玻璃钢雕塑厂家玻璃钢鹿雕塑多少钱玻璃钢发光雕塑仿真小猫济南市玻璃钢雕塑定制湘潭玻璃钢牌匾雕塑黑龙江水果玻璃钢雕塑多少钱四川动物玻璃钢雕塑销售厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化