🎊 P2P穿透打洞技术:文件传输实现详解

P2P穿透打洞技术:文件传输实现详解

本文还有配套的精品资源,点击获取

简介:P2P穿透打洞技术是解决NAT环境下端到端通信的关键,涉及到STUN、TURN和ICE协议。本项目将深入探讨这些协议在文件传输中的应用,并通过源码和示例来展示如何实现高效的P2P网络通信。开发者可以通过这些内容学习到如何构建一个能够穿透NAT限制的P2P文件传输工具,减少中心服务器带宽压力,提升传输速度。

1. P2P技术介绍

1.1 P2P技术概述

P2P(Peer-to-Peer)技术,即对等网络技术,它改变了传统客户端/服务器模式,在网络中的每个节点既是客户端又是服务器。这种模式允许节点之间直接通信和资源共享,大大提升了网络资源的使用效率和系统的扩展性。

1.2 P2P技术的特点

P2P技术具有分布式处理、去中心化和高效的数据传输等特点。这些特点使得P2P网络在文件共享、分布式计算和数据存储等领域显示出强大的优势和潜力。

1.3 P2P技术的应用领域

P2P技术广泛应用于即时通讯、在线流媒体、分布式数据库、云计算以及加密货币等多种场景。随着技术的不断进步,P2P正在逐步渗透进互联网技术的各个领域,展现出前所未有的生命力。

graph LR

A[开始] --> B{P2P技术介绍}

B --> C[1.1 P2P技术概述]

B --> D[1.2 P2P技术的特点]

B --> E[1.3 P2P技术的应用领域]

C --> F[结束]

D --> F

E --> F

在本章中,我们先了解了P2P技术的基本概念,然后探讨了它的核心特点,并初步了解了P2P技术的应用领域。接下来的章节,我们将深入探讨P2P技术面临的挑战以及解决这些问题的关键技术。

2. NAT穿透问题描述与协议解析

2.1 NAT穿透问题的本质与影响

NAT(网络地址转换)技术允许一个私有网络的多台计算机共享一个公有IP地址访问外部网络。然而,这种便利性在P2P通信中引发了一系列问题。

2.1.1 NAT技术的工作原理

NAT工作在IP层,它修改IP数据包的源和目的地址及端口号,以允许内网设备与外网设备通信。当内网主机(例如,使用私有IP地址192.168.0.10)向外部网络发送数据时,NAT网关会替换源IP和端口号(例如,192.168.0.10:33456)为自己的公共IP和一个新的端口号(例如,1.2.3.4:56789)。收到返回数据时,NAT网关根据目的端口号识别内网设备,并将数据包转发回对应的内网主机。

graph LR

A[内网设备] -->|源IP:192.168.0.10
目的IP:www.example.com| B(NAT网关)

B -->|源IP:1.2.3.4
目的IP:www.example.com| C[外部网络]

C -->|源IP:www.example.com
目的IP:1.2.3.4:56789| B

B -->|源IP:www.example.com
目的IP:192.168.0.10:33456| A

2.1.2 穿透问题对P2P通信的挑战

NAT穿透问题主要影响点对点(P2P)通信场景。在P2P网络中,两个内网设备(如两台PC)希望直接连接进行数据交换,但由于NAT的存在,两台设备的公网IP和端口号都是由NAT网关动态分配的,无法直接建立连接。

2.2 STUN协议原理与应用

为了应对NAT带来的问题,STUN(Session Traversal Utilities for NAT)协议被设计出来,它能帮助NAT环境中的客户端发现其公网IP地址和端口。

2.2.1 STUN协议的工作机制

STUN客户端(位于内网)向STUN服务器(位于公网上)发送请求。STUN服务器从收到的请求中提取公网地址和端口号,然后将这些信息返回给客户端。之后,客户端利用这些信息尝试与外部世界进行通信。

sequenceDiagram

participant C as 内网设备

participant S as STUN服务器

C->>S: STUN请求

S-->>C: 公网IP和端口

C->>外部网络: 使用公网IP和端口尝试连接

2.2.2 STUN在实际中的应用场景

STUN协议广泛用于VoIP、即时通讯和在线游戏等应用中。例如,在一个VoIP电话应用程序中,使用STUN协议来确定设备的公网地址和端口,从而允许其他用户发起呼叫。

2.3 TURN协议原理与应用

然而,STUN协议在某些NAT配置下(如对称NAT)不能正常工作。因此,TURN(Traversal Using Relays around NAT)协议作为STUN的一个补充被引入,以提供一个更为可靠的连接方式。

2.3.1 TURN协议的工作机制

TURN协议通过在公网上建立中继服务器来解决NAT穿透问题。如果STUN无法穿透NAT,那么客户端会申请从TURN服务器建立中继,所有外部通信都通过这个中继进行转发。

2.3.2 TURN在实际中的应用场景

TURN通常作为最后的手段,在其他穿透技术失败时使用。例如,在视频会议中,当两个内网用户无法直接连接时,可以使用TURN服务器作为中继点,进行视频数据的转发。

sequenceDiagram

participant C1 as 内网设备1

participant C2 as 内网设备2

participant T as TURN服务器

C1->>T: 请求中继连接

T-->>C1: 中继建立

C1->>C2: 通过T中继数据

C2->>T: 通过T中继数据

T->>C1: 转发数据

2.4 ICE协议原理与应用

ICE(Interactive Connectivity Establishment)协议综合了STUN和TURN的优点,并使用一系列候选(candidates)来尝试建立连接。

2.4.1 ICE协议的工作机制

ICE协议使用STUN和TURN作为其基本组件。在尝试连接时,它首先尝试最直接的连接方式,如果失败,依次尝试较为复杂的方式,直到成功建立连接。

2.4.2 ICE协议的优势与实际应用

ICE的主要优势在于它能够适应各种网络条件,提供更为灵活和可靠的连接方式。ICE被广泛应用于WebRTC等实时通信框架中,以支持浏览器之间的直接通信。

ICE协议通过候选的排序机制来实现连接优化。它会根据多种因素(如延迟、带宽、网络类型等)来确定最合适的候选,以此提高连接的成功率和性能。在实际应用中,ICE协议使WebRTC技术得以在各种复杂的网络环境中都能保持良好的通讯质量。

3. P2P穿透打洞技术应用

3.1 穿透打洞技术的基本概念

3.1.1 何为穿透打洞

穿透打洞技术是解决NAT(网络地址转换)环境下P2P(点对点)通信的一种常用技术。在NAT环境中,内网设备无法被外部直接访问,这导致了P2P通信的困难。穿透打洞技术通过一系列的技术手段,使得原本处于不同NAT后的设备能够直接建立连接。

穿透打洞技术的核心在于让两个位于不同NAT后的设备互相“发现”对方,并建立直接的网络连接。这一过程通常涉及到多个步骤,包括:内网设备向公网服务器报告自己的公网地址信息、尝试发现对端设备的公网地址信息,以及利用这些信息尝试建立连接。

3.1.2 穿透打洞的适用场景与优势

穿透打洞技术适用于以下场景:

内网限制:当两个P2P通信的节点处于不同NAT之后,且无法直接通过公网IP进行通信时。 高延迟问题:在一些使用代理或VPN的情况下,传统的P2P连接建立会变得复杂且延迟较高,穿透打洞能够解决这一问题。

穿透打洞技术的优势包括:

能够有效绕过NAT限制,减少通信延迟。 提高数据传输的效率和稳定性,尤其在大规模网络环境中更加明显。 可以提升网络覆盖范围,增加连接的成功率。

3.2 穿透打洞的实现机制

3.2.1 基于UDP的穿透打洞原理

在基于UDP的穿透打洞场景中,通常会使用STUN(Session Traversal Utilities for NAT)或TURN(Traversal Using Relays around NAT)协议辅助。STUN协议允许位于NAT后的设备获取其公网地址和端口信息,并通过公网服务器反射数据包来建立连接。

实现步骤大致如下:

两个内网设备各自与公网STUN服务器建立连接,获取公网IP和端口。 两个设备通过交换对方获取到的公网信息,互相“发现”对方的公网地址。 在确认了对方的公网地址后,尝试直接发送数据包。 若直接通信成功,则建立起直接连接;若失败,则可能需要回退到使用TURN服务器进行数据中转。

3.2.2 基于TCP的穿透打洞原理

TCP穿透打洞相对UDP来说更为复杂,因为TCP协议的三次握手特性使得连接的建立依赖于稳定的通信链路。在NAT环境下,TCP连接的建立需要借助于NAT的绑定持续性,这通常涉及两个NAT的联合工作。

实现TCP穿透打洞的步骤大致如下:

首先通过三次握手建立初始连接。 尝试在连接上发送数据,以此来检测是否能够建立持久的通信。 如果数据可以发送成功,则尝试保持此连接不关闭,以此来维持NAT的端口绑定。 在一段时间的持续通信后,再次尝试直接发送数据包来测试连接。

TCP穿透打洞的关键在于维持NAT端口的持续绑定,这可能需要一些特殊手段,如持续发送空数据包,以保持NAT设备的状态。

3.3 穿透打洞技术的实践案例分析

3.3.1 典型案例的选择与分析方法

在实践中,选择穿透打洞的典型案例是至关重要的。一个典型的案例应当满足以下条件:

涉及到的NAT类型多样,包括对称NAT、受限对称NAT、全锥NAT和地址限制NAT等。 网络条件要尽可能复杂,包括不同网络运营商、不同类型的网络设备等。

分析方法可以包括:

通过日志记录每个阶段的通信数据和状态,包括发送和接收的数据包。 使用网络抓包工具,如Wireshark,来详细分析数据包的交换过程。 结合源代码日志,检查关键函数的执行结果,以及相关的错误信息。

3.3.2 穿透打洞成功与否的判断标准

穿透打洞成功与否的判断标准有:

在数据包追踪中,能够看到两个设备之间的直接通信数据包。 没有额外的公网服务器介入,数据包直接从一个内网设备传输到另一个内网设备。 通信双方均能收到对方发送的数据包,并能正确解析数据内容。

如果上述标准未能满足,可能需要进行以下排查:

检查NAT设备的配置,确认是否支持需要的NAT类型。 重新进行穿透打洞尝试,检查在交换公网信息时是否准确。 如果必要,可能需要回退到使用STUN或TURN协议进行中转通信。

穿透打洞技术的实现通常需要对网络协议有深入的理解,并针对不同的网络环境进行适当的调整和优化。通过案例的分析,可以进一步了解该技术在实际应用中可能遇到的问题及其解决方案。

4. 文件传输中的P2P技术优势

4.1 P2P文件传输的技术特点

4.1.1 P2P文件传输的分布式特性

P2P文件传输技术最大的特点之一是其分布式特性。在P2P网络中,所有参与节点既是服务提供者,又是服务请求者。这种架构使得数据传输可以不依赖中心服务器,直接在各个节点间进行。每个节点都有能力向其他节点提供服务,承担数据存储与分发的角色。

这种分布式模式带来了多方面的优势,其中最明显的是减轻了中央服务器的压力,避免了单点故障的问题。由于数据在各个节点之间分散存储和传输,使得系统整体的可靠性和扩展性得到了提升。即便在面对大量用户同时下载同一文件时,网络依然能够保持高效运转。

4.1.2 P2P文件传输的去中心化优势

去中心化是P2P技术的另一大优势。在传统客户端-服务器模型中,一旦中心服务器出现问题,整个服务就会受到影响。而去中心化的P2P网络则没有这样的弱点。即便部分节点失效,其他节点仍然可以继续提供服务,数据传输不会中断。

去中心化还带来了成本优势。由于P2P网络中的每个节点都参与到服务的提供中,这大大降低了对中心服务器的依赖,减少了运维成本。此外,P2P网络中,数据可以被切分成小块,分散存储在多个节点上,使得数据恢复更加高效和经济。

4.2 P2P文件传输效率优化策略

4.2.1 分块与并行传输策略

在P2P文件传输中,分块与并行传输策略是提高效率的关键。首先,文件会被分割成多个小块,每个小块都独立编号。分块传输可以加快文件的下载速度,因为它允许并行下载,即多个小块可以同时从不同的节点传输到接收端。

分块传输的另一优势是易于管理。如果某个小块在传输过程中发生错误,只需要重新请求该特定的小块即可,而不必重新下载整个文件。此外,这种策略也使得文件的校验变得更为高效,因为只需要校验每个小块的数据完整性。

4.2.2 缓存与预取策略

缓存策略在P2P文件传输中同样重要。为了提升用户获取数据的速度,节点会将下载过的内容缓存起来,以便在未来有相同请求时,可以直接提供,减少再次从其他节点获取数据的需要。这种本地缓存不仅加速了文件的获取,还减少了网络的负载。

预取策略是指在文件传输过程中,根据用户的行为模式提前预测他们可能需要的数据并提前下载。这可以显著减少延迟,提升用户体验。例如,当用户正在下载一个视频文件时,系统可以预测用户会继续观看接下来的部分,并预先下载这些数据。预取策略需要精心设计,以避免过量下载和浪费带宽资源。

4.3 P2P文件传输的安全性分析

4.3.1 加密传输的重要性

在P2P文件传输过程中,数据在多个节点间传递,面临着被窃听和篡改的风险。因此,加密传输显得尤为重要。加密可以保证数据在传输过程中的机密性和完整性,防止未经授权的访问和数据泄露。

常用的加密方法包括对称加密和非对称加密。在对称加密中,同一个密钥既用于加密数据也用于解密数据,而在非对称加密中,有两个密钥,一个是公钥用于加密数据,另一个是私钥用于解密数据。P2P文件传输中常常结合使用这两种加密方法,以确保数据的安全。

4.3.2 身份验证与信任机制

为了防止恶意节点的加入和攻击,P2P网络需要一套有效的身份验证与信任机制。身份验证可以确保网络中的每个节点都是可信的,并且可以追溯其行为。身份验证通常涉及数字证书或某种形式的公钥基础设施(PKI)。

信任机制则用于评估节点的可信程度。每个节点可以根据其他节点的历史行为来打分,并据此决定是否与其建立连接和交换数据。在一些先进的P2P网络中,甚至采用了基于信誉的系统,例如在BitTorrent网络中,节点会根据上传和下载速率来评估其他节点的信誉,优先与信誉好的节点连接。

P2P技术在文件传输方面通过其独特的技术特点,如分布式存储和去中心化,不仅优化了网络传输的效率,还提升了整个传输过程的安全性。接下来的章节将继续深入探讨P2P文件传输源码分析与架构设计,以及如何实现高效的连接策略。

5. P2P文件传输源码分析与架构设计

在前几章节中,我们对P2P技术、NAT穿透、以及文件传输中的P2P技术优势进行了深入的探讨。现在,我们将深入到源码层面,解析P2P文件传输的核心技术细节,并讨论在NAT环境下如何设计一个健壮的网络架构。本章将重点关注如何在代码中实现P2P文件传输,并探讨如何在复杂的网络环境中建立稳定连接。

5.1 P2P文件传输源码解析

5.1.1 源码组织与模块划分

在实际的P2P文件传输项目中,源码通常会被组织成几个核心模块,以便于管理和维护。一般来说,可以将源码分为以下几个模块:

网络通信模块 :负责底层的网络连接建立、数据包的发送与接收。 文件管理模块 :负责文件的分块、索引、下载和上传。 P2P逻辑模块 :包含对等节点的发现、节点信息的维护、以及文件的搜索和定位逻辑。 用户界面模块 :提供用户与系统交互的界面,如文件的选择、状态显示等。

为了更好地理解源码的组织和模块划分,我们假设有一个简单的P2P文件传输项目的源码结构如下:

project/

├── network/ # 网络通信模块

│ ├── connection.py

│ ├── packet.py

│ └── utils.py

├── file_manager/ # 文件管理模块

│ ├── file_chunk.py

│ ├── file_index.py

│ └── transfer.py

├── p2p/ # P2P逻辑模块

│ ├── peer.py

│ ├── discovery.py

│ └── search.py

└── ui/ # 用户界面模块

├── main_window.py

└── widgets.py

5.1.2 关键代码逻辑与实现细节

在P2P文件传输的源码中,有几段关键的代码逻辑至关重要,包括建立网络连接、文件分块与索引、以及节点间的消息交互。

网络连接建立

一个基本的TCP连接建立通常通过三次握手实现,下面是一个简化的Python代码示例:

import socket

def create_server_socket(port):

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind(('localhost', port))

server_socket.listen(5)

return server_socket

def create_client_socket(ip, port):

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect((ip, port))

return client_socket

server_socket = create_server_socket(5000)

client_socket = create_client_socket('127.0.0.1', 5000)

# 服务器端接受连接

connection_socket, client_address = server_socket.accept()

在P2P环境中,每个节点既是客户端也是服务器,因此需要能够同时处理客户端的连接请求和作为服务器接受连接。

文件分块与索引

文件分块是P2P文件传输中的另一个关键点,这使得文件可以被分成多个块进行并行传输,从而提高效率。以下是一个简单的文件分块和索引的代码示例:

def file_to_chunks(file_path, chunk_size=1024):

chunks = []

with open(file_path, 'rb') as file:

while True:

chunk = file.read(chunk_size)

if not chunk:

break

chunks.append(chunk)

return chunks

def create_file_index(chunks):

return [index for index, chunk in enumerate(chunks)]

chunks = file_to_chunks('large_file.zip')

index = create_file_index(chunks)

5.2 NAT环境下P2P网络架构设计

5.2.1 网络架构的基本要求

在NAT环境下设计P2P网络架构需要满足几个基本要求:

兼容性 :能够兼容不同的NAT类型,包括完全锥形、地址限制锥形、端口限制锥形和对称型NAT。 鲁棒性 :在网络条件不佳或节点频繁变动的情况下,网络仍能保持稳定。 扩展性 :架构需要能够支持大规模节点数量,并允许节点的自由加入和退出。

5.2.2 架构设计中的关键组件

关键组件包括但不限于:

NAT穿透代理 :为位于对称型NAT后的节点提供中继服务。 发现服务 :帮助节点发现其他节点,如DHT(分布式哈希表)。 控制通道 :用于节点间交换控制信息,如STUN和TURN协议的实现。

5.3 直接通信与中继转发的实现

5.3.1 直接通信的实现机制

直接通信是P2P网络最理想的状态,它意味着节点之间可以直接交换数据,不需要任何中继。实现直接通信的关键在于NAT穿透技术,如STUN、TURN和ICE协议。

5.3.2 中继转发的实现机制与优势

当中继转发被用于P2P网络时,它可以提供一个替代的通信方式,以应对直接通信失败的情况。中继服务器允许位于不同NAT后的节点通过服务器转发数据包。优势包括:

增加了连接的成功率,尤其是在防火墙限制严格的情况下。 可以提供额外的安全保障,因为数据流会经过服务器的检查。 能够在某些情况下减少延迟,特别是当直接通信因NAT配置复杂而耗时较长时。

架构设计的代码示例

以下是一个使用STUN协议实现NAT穿透的简单代码示例:

import stun

def stun_punchthrough(local_ip, local_port, remote_ip, stun_server):

stun_client = stun.Client()

stun_client.local_ip = local_ip

stun_client.local_port = local_port

stun_client.remote_ip = remote_ip

stun_client.stun_server = stun_server

# 发送Binding Request到STUN服务器并获取公网IP和端口

public_ip, public_port = stun_client.get_public_ip_port()

return public_ip, public_port

stun_server = 'stun.l.google.com:19302'

public_ip, public_port = stun_punchthrough('192.168.1.10', 5000, '216.239.46.206', stun_server)

print(f'Public IP: {public_ip}, Public Port: {public_port}')

以上代码展示了如何使用STUN协议获取节点的公网IP和端口,以实现NAT穿透。

结论

在本章节中,我们对P2P文件传输的源码进行了深入分析,并探讨了在NAT环境下如何设计和实现一个健壮的网络架构。我们了解到直接通信和中继转发的重要性,并通过代码示例了解了如何使用STUN协议进行NAT穿透。本章的讨论为下一章,关于ICE协议最佳连接策略选择与优化,提供了坚实的基础。在下一章中,我们将深入探讨ICE协议,并研究如何选择和优化连接策略,以进一步提高P2P网络的性能和可靠性。

6. ICE协议最佳连接策略选择与优化

6.1 ICE协议连接策略分析

6.1.1 连接候选与优先级划分

ICE(Interactive Connectivity Establishment)协议作为P2P通信中实现NAT穿透的优选方案,它通过收集和选择多种网络地址候选(Candidates),来建立最优化的连接路径。在ICE协议中,每个候选代表一个潜在的终端通信方式,可能包括主机地址(Host Candidates)、服务器反射地址(Server Reflexive Candidates)、端口反射地址(Peer Reflexive Candidates)以及中继地址(Relay Candidates)。

ICE为这些候选设置了优先级,优先级的高低取决于候选的类型及其与本地网络的亲和性。一般情况下,主机候选优先级最高,因为它们不受NAT或防火墙的影响;而端口反射候选和服务器反射候选通常优先级较低。优先级的设定会根据候选类型、网络类型、以及候选地址的相对优先级来决定。

6.1.2 连接策略的选择标准

ICE协议在连接时根据候选的类型和优先级,通过STUN和TURN协议来测试候选对的连通性。连接策略的选择依赖于NAT环境的复杂性,需要考虑的因素包括对称NAT和非对称NAT的存在、防火墙限制等。选择策略时,必须综合考虑以下标准:

最小延迟原则 :尝试选择延迟最小的路径以保证实时通信的流畅性。 NAT类型适应性 :根据NAT的类型进行候选策略的调整,以提高穿透的成功率。 冗余备份 :为了增强连接的可靠性,要优先选择有多个候选的路径。 成本效益分析 :对于使用中继的场景,要评估使用中继的成本和通信质量。

6.2 ICE连接策略的实践应用

6.2.1 实际环境中的连接策略调整

在实际环境中,由于网络配置的多样性和复杂性,必须动态调整ICE的连接策略。连接过程通常包括如下步骤:

候选收集 :收集所有可能的候选地址。 候选对生成 :将本地候选地址与远端候选地址配对形成候选对。 候选对排序 :基于候选的类型和优先级对候选对进行排序。 连通性检查 :通过STUN协议进行连通性检查,根据返回的响应调整候选对的状态。 连接建立 :从候选对中选择最佳连接路径,建立连接。

6.2.2 连接性能评估与案例分析

连接性能评估是ICE实施过程中的重要环节,通过对连接时延、丢包率、吞吐量等指标的测量,可以对连接策略的有效性进行验证。案例分析可以让我们更直观地了解不同网络环境下的最佳实践:

案例一:家庭网络环境 :通常为对称NAT,需要利用中继地址进行连接。 案例二:企业网络环境 :多为非对称NAT且具有更严格的防火墙规则,需优先考虑主机候选和服务器反射候选。 案例三:移动网络环境 :连接策略可能需要针对频繁变更的IP地址进行调整。

6.3 连接策略的优化与未来展望

6.3.1 基于反馈机制的动态优化策略

动态优化策略是根据连接过程中的反馈来进行调整的。在实际的P2P通信中,可利用如下反馈机制:

实时状态监控 :监控连接的质量并记录连接状态变化,实现快速响应和策略调整。 历史数据学习 :分析历史连接数据,预测并优化候选对的排序。 用户行为分析 :用户交互模式也可以用来指导候选对选择,提升用户体验。

6.3.2 ICE协议的未来发展方向与挑战

随着互联网环境的不断变化,ICE协议的优化和发展也将面临新的挑战:

端到端加密 :对通信内容加密的需求日益增长,ICE协议如何在保持效率的同时保证安全。 智能网络适配 :如何使ICE更加智能,更好地适应未来网络环境的多样性。 跨平台兼容性 :随着各种新设备的出现,如何保证ICE协议跨不同操作系统和硬件平台的兼容性。

ICE协议作为P2P通信的关键技术,其连接策略的选择与优化对于整个网络的通信效率和质量起到了至关重要的作用。未来,随着网络环境的不断进化,ICE协议也将不断创新和优化,以适应新的挑战。

本文还有配套的精品资源,点击获取

简介:P2P穿透打洞技术是解决NAT环境下端到端通信的关键,涉及到STUN、TURN和ICE协议。本项目将深入探讨这些协议在文件传输中的应用,并通过源码和示例来展示如何实现高效的P2P网络通信。开发者可以通过这些内容学习到如何构建一个能够穿透NAT限制的P2P文件传输工具,减少中心服务器带宽压力,提升传输速度。

本文还有配套的精品资源,点击获取

🎯 相关推荐

它将教您如何挑选毛豆,这样采摘的毛豆健康又美味,学到的方法可以受用一生
一个男人心凉了意味着什么 男人寒了心就是不爱了吗
查一查12月份的星座(农历生日星座查询表)
mobile28365正规网址

查一查12月份的星座(农历生日星座查询表)

📅 10-25 👀 8957
微信进去密码怎么设置
mobile28365正规网址

微信进去密码怎么设置

📅 07-29 👀 7565
430台币等于多少人民币?
mobile28365正规网址

430台币等于多少人民币?

📅 10-21 👀 5613
LOL刀妹被削 设计师chunli谈刀妹改动
beat365老版本

LOL刀妹被削 设计师chunli谈刀妹改动

📅 07-06 👀 3332
如何保持良好的心态
mobile28365正规网址

如何保持良好的心态

📅 10-28 👀 108
中土世界历史简介
mobile28365正规网址

中土世界历史简介

📅 07-26 👀 9514
阿剌克涅兽
beat365老版本

阿剌克涅兽

📅 11-11 👀 6064