首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书
BH5UVN
Search
1
使用ReDroid打造自己的云手机
5,065 阅读
2
Cloudflare SAAS 接入自选教程
2,774 阅读
3
CloudFront CDN配置教程
2,347 阅读
4
Frpc使用XTCP不通过服务器传输
2,206 阅读
5
兽装曲腿制作文档
2,205 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
447
篇文章
累计收到
129
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
友情链接
公告栏
友人
iMin博客
特资啦!个人资源分享站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
猎空のBlog“
Suntの小破站
BG5VXJ-无线电
Abyss博客
麟图图床
麟云文件
麟云证书
BH5UVN
搜索到
63
篇与
的结果
2025-07-11
DNS压力测试工具的Go实现
DNS压力测试工具的Go实现:高并发网络编程实战最近开发了一个DNS压力测试工具,主要用于测试DNS服务器的性能和稳定性。这个项目使用Go语言实现,充分利用了Go的并发特性来模拟大量DNS查询请求。项目已经开源在GitHub,这篇文章详细分析一下其中的技术实现和设计思路。DNS协议基础和数据包结构在深入代码分析之前,先了解一下DNS协议的基本结构和工作原理,这对理解后续的实现细节至关重要。DNS消息格式详解DNS协议基于UDP传输(标准情况下),每个DNS消息都有固定的结构格式。一个标准的DNS查询包含以下几个部分:DNS Header (12 bytes) +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+Header字段解析:ID (16位):查询标识符,用于匹配查询和响应QR (1位):查询/响应标志,0表示查询,1表示响应Opcode (4位):操作码,0表示标准查询RD (1位):期望递归查询标志QDCOUNT (16位):问题部分的条目数ANCOUNT (16位):回答部分的条目数DNS查询段(Question Section)Header之后是查询段,包含要查询的域名和查询类型:Question Section +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / QNAME / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+QNAME编码:域名使用特殊的编码格式,比如www.example.com会被编码为:3www7example3com0每个标签前面是长度字节,整个域名以0字节结尾。QTYPE常见值:A记录 (1):IPv4地址NS记录 (2):权威名称服务器MX记录 (15):邮件交换记录AAAA记录 (28):IPv6地址TXT记录 (16):文本记录QCLASS:通常为1,表示Internet类别。DNS包大小和传输特性UDP限制:传统DNS over UDP的包大小限制为512字节。如果响应超过这个大小,服务器会设置TC(截断)标志,客户端需要使用TCP重新查询。EDNS扩展:现代DNS实现支持EDNS(0)扩展,允许更大的UDP包(通常4096字节),同时提供额外的功能标志。查询特征:DNS查询通常很小(50-100字节)响应大小变化很大(从几十字节到几KB)查询具有突发性特征大部分查询会被缓存,减少上游服务器负载真实网络中的DNS行为模式理解真实DNS流量的特征对于设计压力测试工具很重要:查询分布特征:80%的查询集中在少数热门域名20%的查询是长尾域名或随机查询恶意查询通常具有高随机性特征时间特征:查询具有明显的时间周期性工作时间查询量显著高于夜间突发事件会导致特定域名查询激增地理特征:本地DNS服务器承载大部分查询跨地区查询延迟明显更高CDN和缓存系统影响查询分布miekg/dns库的设计理念在我们的代码中使用的github.com/miekg/dns库是Go语言中最专业的DNS处理库,它的设计有几个重要特点:完整的RFC兼容性:库实现了DNS相关的所有主要RFC标准,包括基础的RFC 1035、EDNS的RFC 2671、安全扩展DNSSEC等。类型安全的API:msg := new(dns.Msg) msg.SetQuestion(dns.Fqdn(domain), dns.TypeA)通过类型安全的API,避免了手动构建DNS包可能出现的格式错误。性能优化:库内部使用了高效的字节操作和内存管理,避免了不必要的内存分配和拷贝。扩展性支持:支持现代DNS特性如EDNS、DNSSEC、DNS over HTTPS等。了解了这些DNS协议的基础知识后,我们再来看代码实现就更容易理解每个部分的设计考虑了。项目背景和应用场景DNS压力测试在网络基础设施维护中是一个重要的环节。无论是评估DNS服务器的承载能力,还是测试网络防护设备的过滤效果,都需要能够生成大量真实的DNS查询流量。传统的压力测试工具往往功能复杂,配置繁琐,而这个工具专注于DNS查询的核心功能,提供了简洁高效的解决方案。这个工具的主要应用场景包括:DNS服务器性能测试、网络设备压力测试、DNS缓存系统验证、网络安全设备测试等。通过模拟真实的DNS查询流量,可以有效评估目标系统在高负载情况下的表现。架构设计思路整个工具的架构设计遵循了"简单而高效"的原则。核心思路是使用Go的goroutine为每个DNS服务器创建独立的查询线程,每个线程负责向特定的DNS服务器发送连续的查询请求。这种设计的优势在于:// 为每个DNS服务器启动一个goroutine for _, serverAddr := range dnsServers { wg.Add(1) go func(addr string) { defer wg.Done() sendDNSQueries(addr, *mainDomain, qType) }(serverAddr) }每个goroutine都是完全独立的,这意味着如果某个DNS服务器出现问题(比如超时或拒绝连接),不会影响其他goroutine的正常工作。同时,通过sync.WaitGroup来协调所有goroutine的生命周期,确保程序能够优雅地启动和关闭。DNS服务器选择策略工具内置了一个精心选择的DNS服务器列表,涵盖了全球主要的公共DNS服务提供商:dnsServers := []string{ "8.8.8.8:53", // Google DNS "8.8.4.4:53", // Google DNS Secondary "1.1.1.1:53", // Cloudflare DNS "1.0.0.1:53", // Cloudflare DNS Secondary "223.6.6.6:53", // 阿里DNS "223.5.5.5:53", // 阿里DNS Secondary "114.114.114.114:53", // 114DNS "114.114.115.115:53", // 114DNS Secondary // ... 更多服务器 }这个列表的设计考虑了几个因素:地理分布覆盖全球主要区域,确保测试的代表性;服务质量这些都是知名的、稳定的DNS服务提供商;负载分散通过向多个服务器发送请求,避免对单一服务器造成过大压力。这种多目标策略的好处是可以同时测试不同地理位置、不同服务商的DNS服务器性能,获得更全面的测试数据。随机子域名生成算法为了模拟真实的DNS查询场景,工具实现了一个智能的随机子域名生成算法。这个算法的核心思想是生成具有真实域名特征的随机字符串:func generateRandomSubdomain(domain string) string { // 生成2-15级长度的子域名 levels := rand.Intn(14) + 2 // 生成2-15之间的随机数 subdomain := "" for i := 0; i < levels; i++ { subdomain += generateRandomString(rand.Intn(10)+1) + "." } return subdomain + domain }这个算法有几个关键的设计决策:层级数量的随机化:真实的域名结构复杂多样,从简单的二级域名到复杂的多级子域名都存在。通过随机生成2-15层的子域名,可以更好地模拟真实网络环境中的查询模式。字符集的选择:const charset = "123456789abcdefghijklmnopqrstuvwxyz"字符集排除了数字0和字母o,这是一个很细致的考虑。在真实的域名中,为了避免混淆,很多域名注册商都会避免使用容易混淆的字符组合。这种设计让生成的域名更接近真实情况。长度的变化:每个域名级别的长度在1-10个字符之间随机变化,这种变化模拟了真实域名的长度分布特征。短的级别可能代表常见的前缀(如www、mail),长的级别可能代表具体的服务名称或随机标识符。网络连接管理网络连接的管理是这个工具的核心技术点。代码使用了UDP协议进行DNS查询,这是DNS协议的标准传输方式:conn, err := net.Dial("udp", serverAddr) if err != nil { fmt.Printf("Error connecting to DNS server %s: %v\n", serverAddr, err) return } defer conn.Close()使用UDP的原因有几个:性能优势:UDP是无连接协议,没有TCP的三次握手开销,适合高频率的短消息传输;DNS标准:绝大多数DNS查询都使用UDP协议,除非响应数据超过512字节才会回退到TCP;资源效率:UDP连接的系统资源消耗更小,可以支持更高的并发量。连接复用策略:每个goroutine建立一个长连接,然后复用这个连接发送所有查询。这种设计避免了频繁建立和销毁连接的开销,同时保持了代码的简洁性。DNS消息构建和序列化工具使用了第三方库github.com/miekg/dns来处理DNS协议的细节:msg := new(dns.Msg) msg.SetQuestion(dns.Fqdn(subdomain), qType) data, err := msg.Pack()这个库的使用体现了Go语言生态的优势。dns.Fqdn()函数自动处理域名的FQDN(Fully Qualified Domain Name)格式转换,确保域名以点号结尾。msg.Pack()将DNS消息结构体序列化为符合RFC标准的二进制格式。查询类型的处理:qType, ok := dns.StringToType[*queryType] if !ok { fmt.Println("Invalid query type. Please use A, MX, NS, etc.") return }通过dns.StringToType映射表,用户可以使用直观的字符串(如"A"、"MX"、"NS")来指定查询类型,工具会自动转换为对应的数值常量。这种设计大大提高了工具的易用性。并发控制和资源管理Go语言的并发模型是这个工具的核心优势。通过goroutine和channel,可以轻松实现高并发的网络操作:var wg sync.WaitGroup for _, serverAddr := range dnsServers { wg.Add(1) go func(addr string) { defer wg.Done() sendDNSQueries(addr, *mainDomain, qType) }(serverAddr) } wg.Wait()WaitGroup的使用:sync.WaitGroup提供了一种简洁的方式来等待所有goroutine完成。在这个应用中,由于每个goroutine都运行无限循环,wg.Wait()实际上会一直阻塞,直到程序被外部信号终止。goroutine的生命周期管理:每个goroutine都有明确的生命周期,从创建到销毁都有对应的资源管理。defer conn.Close()确保无论goroutine如何退出,网络连接都会被正确关闭。闭包和变量捕获:在启动goroutine时使用了闭包的技巧,通过函数参数传递serverAddr,避免了闭包捕获循环变量可能导致的问题。错误处理策略工具采用了"容错但不静默"的错误处理策略:_, err = conn.Write(data) if err != nil { //fmt.Printf("Error sending DNS query to %s: %v\n", serverAddr, err) }可以看到,发送错误的日志输出被注释掉了。这是一个有意的设计决策:在高并发的压力测试中,网络错误是很常见的(比如目标服务器过载、网络拥塞等),如果每个错误都输出日志,会产生海量的日志信息,反而影响工具的性能和可用性。但连接建立失败的错误仍然会被输出,因为这类错误通常表示配置问题或严重的网络问题,需要用户关注。性能优化考虑内存使用优化:每次查询都会创建新的DNS消息对象,这在高并发场景下可能产生大量的短生命周期对象。Go的垃圾回收器可以很好地处理这种模式,但如果需要进一步优化,可以考虑使用对象池来复用消息对象。CPU使用优化:随机字符串生成是CPU密集型操作,特别是在高频率查询的情况下。当前的实现使用了简单的循环,如果需要更高的性能,可以考虑预生成字符串池或使用更高效的随机数生成算法。网络I/O优化:当前每个UDP连接都是阻塞式的,在极高并发的场景下,可能需要考虑使用非阻塞I/O或者连接池来进一步提升性能。扩展性设计虽然当前的工具功能相对简单,但代码结构为扩展提供了良好的基础:配置参数化:通过flag包提供的命令行参数,用户可以自定义目标域名和查询类型。这种设计为添加更多配置选项(如并发数、查询频率等)提供了框架。模块化设计:子域名生成、DNS查询发送、连接管理等功能都被分离到独立的函数中,便于单独测试和修改。数据输出接口:虽然当前版本没有实现详细的统计功能,但代码结构可以很容易地添加性能监控、成功率统计、响应时间测量等功能。实际使用场景和效果这个工具在实际使用中表现出了很好的效果。在一台普通的个人电脑上,可以轻松生成每秒数千次的DNS查询,足以对大多数DNS服务器产生明显的负载压力。测试DNS服务器性能:通过观察不同DNS服务器的响应情况,可以评估其性能差异和稳定性。网络设备压力测试:可以用来测试防火墙、路由器等网络设备在高DNS查询负载下的表现。DNS缓存验证:通过查询大量不存在的域名,可以测试DNS缓存系统的行为和性能。安全和合规考虑需要特别强调的是,这个工具的设计初衷是用于合法的测试和研究目的。在使用时必须遵守相关的法律法规和服务条款:合理使用:避免对公共DNS服务器造成过度负载,建议在自己的测试环境中使用。监控和控制:建议添加查询频率限制和总查询数量控制,避免无节制的压力测试。透明性:在企业环境中使用时,应该确保相关人员知晓测试活动,避免被误认为是恶意攻击。技术栈总结这个项目充分展示了Go语言在网络编程中的优势:并发模型:goroutine和channel让高并发网络编程变得简单直观。标准库:丰富的网络和系统调用支持,减少了对第三方依赖的需求。生态系统:优秀的第三方库(如miekg/dns)提供了专业的协议支持。部署简便:编译后的单一可执行文件,无需复杂的部署环境。总结这个DNS压力测试工具虽然代码量不大,但涵盖了网络编程、并发控制、协议处理、随机算法等多个技术领域。通过精心的设计,用不到200行的代码实现了一个功能完整、性能优秀的专业工具。从开发的角度来看,这个项目是学习Go语言网络编程和并发编程的一个很好的案例。它展示了如何用简洁的代码实现复杂的功能,以及如何在性能和可维护性之间找到平衡。完整的源代码和使用说明可以在GitHub仓库中找到。如果你对网络编程或DNS技术感兴趣,这个项目提供了一个很好的学习和实验平台。欢迎fork和提交issue,一起完善这个工具。
2025年07月11日
14 阅读
0 评论
1 点赞
2024-02-15
Linux下使用tcpdump监听DNS查询
Linux下使用tcpdump监听DNS查询 并解决docker connection reset by peer问题
2024年02月15日
248 阅读
0 评论
0 点赞
2024-01-13
使用ReDroid打造自己的云手机
前言市面上已经存在很多云手机厂商如红手指、多多云、雷电云、河马云手机等,价格从几十到上百元每月一台。价格还好说,但设备运行稳定性、可靠性、数据安全性全部依赖第三方厂商,注定不能进行敏感性操作或部署对安全可靠高要求的企业级服务。本文介绍一种开源的 AIC (Android In Container) 解决方案 ReDroid,使用本教程可以在一台普通型服务器运行多个安卓设备环境,并可在客户机电脑连接使用该云手机。Redroid介绍redroid(Remote an Droid)是一个 GPU 加速的 AIC(Android In Cloud)解决方案。Docker您可以在 Linux 主机( 、podman等)中启动多个实例k8s。redroid支持arm64和amd64架构。 redroid适用于云游戏、虚拟化电话、自动化测试等。目前支持:安卓 14 ( redroid/redroid:14.0.0-latest)仅适用于 Android 14 64 位 ( redroid/redroid:14.0.0_64only-latest)安卓 13 ( redroid/redroid:13.0.0-latest)仅适用于 Android 13 64 位 ( redroid/redroid:13.0.0_64only-latest)安卓 12 ( redroid/redroid:12.0.0-latest)仅适用于 Android 12 64 位 ( redroid/redroid:12.0.0_64only-latest)安卓 11 ( redroid/redroid:11.0.0-latest)安卓 10 ( redroid/redroid:10.0.0-latest)安卓 9 ( redroid/redroid:9.0.0-latest)安卓 8.1 ( redroid/redroid:8.1.0-latest)入门redroid 应该能够在任何 Linux 上运行(启用一些内核功能)。这里以使用阿里云的X86服务器进行演示,具体如下:配置:vCPUs2内存2G储存40G系统ubuntu-22.04架构x86-64带宽3M安装Docker## 安装 docker https://docs.docker.com/engine/install/#server # 根据 Docker 官方文档安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh #或者从仓库下载 sudo apt update sudo apt-get install -y docker.io systemctl start docker systemctl enable docker 安装内核扩展模块更具不同的系统,有不一样的安装方法,具体如下 # 拉取内核模块源码 git clone https://github.com/remote-android/redroid-modules cd ./redroid-modules # Ubuntu 16.04 / 18.04 / 20.04 sudo apt-get install -y git kmod make gcc linux-headers-`uname -r` sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Ubuntu 20.04+ (kernel 5.0+) sudo modprobe ashmem_linux sudo modprobe binder_linux devices=binder,hwbinder,vndbinder # AmazonLinux2 git checkout origin/amazonlinux2 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Alibaba Cloud Linux 2 git checkout origin/alibabalinux2 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Alibaba Cloud Linux 3 git checkout origin/alibabalinux3 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # openEuler 20.03 / kernel 4.19 git checkout origin/openeuler2003 sudo yum install gcc kernel-devel sudo KDIR=/usr/src/kernels/<VER> make install # 检查模块状态 lsmod | grep -e ashmem_linux -e binder_linux # example output: # binder_linux 147456 79 # ashmem_linux 16384 23 # 也可以这样验证 grep binder /proc/filesystems # output should like: nodev binder grep ashmem /proc/misc # output should like: 56 ashmem我这边因为是ubuntu 22.04,便使用 modprobe 安装如果不想换系统,可以尝试升级内核到5.0以上,默认就自带相关模块了启动容器创建Docker-compose文件docker-compose.ymlversion: "3" services: redroid: image: redroid/redroid:11.0.0-latest stdin_open: true tty: true privileged: true ports: - "20055:5555" volumes: # 資料存放在目前目錄下 - ./redroid-11-data:/data command: # 設定libndk相關 - ro.product.cpu.abilist0=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi - ro.product.cpu.abilist64=x86_64,arm64-v8a - ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi - ro.dalvik.vm.isa.arm=x86 - ro.dalvik.vm.isa.arm64=x86_64 - ro.enable.native.bridge.exec=1 - ro.dalvik.vm.native.bridge=libndk_translation.so - ro.ndk_translation.version=0.2.2 - ro.secure=0 cap_add: - CAP_SYS_MODULE 启动容器#确保安装了docker-compose apt install docker-compose # 进入储存docker-compose.yml的目录 cd /data/redroid-1 docker-compose up -d如果使用 22.04可能出现如下异常解决方案pip install 'urllib3<2'链接根据 Scrcpy 官方文档下载安卓投屏软件源码包到客户机,解压使用adb connect ip:5555 # adb devices 可查看连接设备列表 scrcpy --serial ip:5555高级一些额外参数样例docker run -itd --rm --privileged \ --pull always \ -v ~/data:/data \ --cap-add CAP_SYS_MODULE \ -p 5555:5555 \ redroid/redroid:11.0.0-latest \ androidboot.redroid_width=1080 \ androidboot.redroid_height=1920 \ androidboot.redroid_dpi=480 \参数描述默认androidboot.redroid_width显示宽度720androidboot.redroid_height显示高度1280androidboot.redroid_fps显示 FPS30(启用 GPU) 15(未启用 GPU)androidboot.redroid_dpi显示 DPI320androidboot.use_memfd使用 memfd 替换已弃用的 ashmem计划默认启用假androidboot.use_redroid_overlayfs使用overlayfs共享data分区/data-base:共享data分区/data-diff:私有数据0androidboot.redroid_net_ndnsDNS 服务器数量,如果未指定 DNS 服务器,将使用“8.8.8.8”0androidboot.redroid_net_dns<1..N>域名解析 androidboot.redroid_net_proxy_type代理类型;从以下选项中选择:“静态”、“pac”、“无”、“未分配” androidboot.redroid_net_proxy_host androidboot.redroid_net_proxy_port 3128androidboot.redroid_net_proxy_exclude_list逗号分隔列表 androidboot.redroid_net_proxy_pac androidboot.redroid_gpu_mode从以下选项中选择:auto、host、guest;guest:使用软件渲染;host:使用 GPU 加速渲染;auto:自动检测自动androidboot.redroid_gpu_node 自动检测ro.xxxDEBUG 目的,允许覆盖 ro.xxx 属性;例如设置ro.secure=0,则默认提供root adb shell
2024年01月13日
5,065 阅读
2 评论
3 点赞
2023-08-11
D-Link Go-RT-AC750命令注入漏洞复现
D-Link Go-RT-AC750命令注入漏洞复现
2023年08月11日
356 阅读
0 评论
0 点赞
2023-07-21
linux 聚合链路
linux 聚合链路
2023年07月21日
54 阅读
0 评论
0 点赞
2023-07-20
使用nginx发布tomcat站点
使用nginx发布tomcat站点
2023年07月20日
32 阅读
0 评论
0 点赞
2023-07-20
TCPIP四层网络模型
TCPIP四层网络模型
2023年07月20日
45 阅读
0 评论
0 点赞
2023-07-20
OSI七层网络模型
OSI七层网络模型
2023年07月20日
41 阅读
0 评论
0 点赞
2023-07-20
IP地址
IP地址
2023年07月20日
87 阅读
0 评论
0 点赞
2023-07-20
计算机网络介绍
计算机网络介绍
2023年07月20日
76 阅读
0 评论
0 点赞
2023-07-20
传输层协议
传输层协议
2023年07月20日
47 阅读
0 评论
0 点赞
2023-07-17
使用CloudFlare Worker搭建Vless服务,实现无服务器代理
使用CloudFlare Worker搭建Vless服务,实现无服务器代理
2023年07月17日
999 阅读
0 评论
2 点赞
1
2
...
6