共计 5750 个字符,预计需要花费 15 分钟才能阅读完成。
导语 :之前写过一个测速小工具,应用的是
speedtest-cli
提供的 api 办法,当然除了这个还有其余的测速工具,明天就这个测速工具来说一下应用体验和感触。
- 测速科普
- 测速工具
- DNS 模块
- 实战案例
测速科普
- 上传下载
网络传输分为发送和接收数据两局部,上传就是发送数据,下载就是接收数据,传输的速度会受到带宽和设施的制约。
- Byte 和 Bit
日常传输中大概 1Mbps=1024/8KB/s=128KB/s(1/8), 大 B 是 byte 字节,小 b 是 bit 比特,1B=8b。比如说你家里的宽带是 100Mbps,那么实践上最大上传速度是 12800KB/s, 也就是 12.5MB/s。
上网过程中的过程中网速快慢会受到来自本身电脑软硬件配置、旅行网站地位、运营商切换等影响,所以理论网速会低于实践网速的。
- 宽带速率
上面是一个常见的宽带速率对照表:
宽带速率单位用 bps 示意,即比特每秒钟传输多少信息,是 bit per second 的缩写,实际上说的 1M 带宽是 1Mbps(兆比特每秒)。
- Ping
ping 是指一个数据包从用户的设施发送到测速点或站点,而后再返回所用的工夫。个别以毫米奥计算,0-100ms 都是失常的,不会有显著的卡顿。
- 抖动
网络提早是指信息从发送到接管通过的延迟时间,抖动是最大提早和最小提早的时间差,比方最大提早 30ms,最小提早 10ms,抖动就是 20ms,标识网络的稳定性。
- 丢包
丢包是指一个或者多个数据包无奈通过网络达到目的地。起因可能有网络中门路衰败造成信号衰减,通道阻塞,损坏的数据包被回绝通过,有缺点的网上硬件,网络驱动程序有故障等等。
测速工具
说到测速,大家都应该不生疏吧,咱们生存在这个网络时代,简直家家户户都装了宽带,连贯了无线,都要上网。
那么网速的快慢就决定了你的上网体验,网速快的话,购物,玩游戏,看剧刷视频都很棒的,然而很卡的网速什么也做不了。
接下来,我就说一下我平时用到的几款测速工具。
- ookla
- 测速网
- 便民查问网
上面就来看一下测速的界面后果和差别。
ookla 的测速后果:
便民查问网的测速后果:
测速网的测速后果:
不过开发一款测速小工具就须要用到命令行工具了,能够本人抉择测速供应商,获取专属测速后果,很不便开发者应用。
DNS 模块
这个 dns 模块是 nodejs 自带的一个外部模块,用来进行 dns 相干的操作。上面就简略的几个办法进行阐明。
- 获取用户 ip 地址
进行 dns 首选获取用户的 ip 地址,而后再进行相应的操作。上面是我本人写的一个获取用户 ip 地址的办法,在这里写一下, 肯定要应用 nodejs 或者相干框架比方 express 才能够调用的。
// 获取用户 ip 地址 | |
/** | |
* req 就是申请头 | |
*/ | |
function getClientIP(req) {return req.headers['x-forwarded-for'] || // 判断是否有反向代理 IP | |
req.connection.remoteAddress || // 判断 connection 的近程 IP | |
req.socket.remoteAddress || // 判断后端的 socket 的 IP | |
req.connection.socket.remoteAddress; | |
}; |
- 查问城市和运营商
这里要应用到一个 npm 包 ip2region, 这个能够查问 ip 所对应的运营商和城市。
通过下面办法拿到用户 ip 后,能够通过这个包提供的办法查问,反对 ipv4 和 ipv6。
const ip2region = require('ip2region').default; | |
const query = new ip2region(); | |
let ip = getClientIP(req); // 比方这里 ip 是 120.25.58.68 | |
const res1 = query.search(ip); | |
console.log(res1); | |
// {country: '中国', province: '广东省', city: '深圳市', isp: '阿里云'} | |
const res2 = query.search('240e:47d:c20:1627:30a3:ba0d:a5e6:ec19'); | |
console.log(res2); | |
// {country: "中国", province: "广东省", city: "", isp:" 中国电信 "} |
- 获取域名对应的 ip
这里能够应用 dns 模块的 lookupService
办法,能够查问域名对应的 ip 地址。
const dns = require('dns'); | |
dns.lookup('www.baidu.com', function (err, data) {if (err) {throw new Error(err); | |
} else {console.log(data); // 180.101.49.12 | |
} | |
}) |
dns 的办法就到这里,具体的能够看 Nodejs 的 dns 文档的阐明。
实战案例
接下来就通过 speedtest.net 提供的命令行工具测速一下网速。
装置命令行
- macOS
brew tap teamookla/speedtest | |
brew update | |
brew install speedtest --force |
或者
下载地址
- Ubuntu/Debian
sudo apt-get install curl | |
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash | |
sudo apt-get install speedtest |
- Fedora/Centos/Redhat
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash | |
sudo yum install speedtest |
- FreeBSD
sudo pkg update && sudo pkg install -g libidn2 ca_root_nss | |
sudo pkg add "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-freebsd12-x86_64.pkg" | |
# freeBSD 13 install | |
sudo pkg add "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-freebsd13-x86_64.pkg" |
- windows
下载地址
- Linux
x86_64
i386
armel
armhf
aarch64
查看帮忙命令
Speedtest by Ookla is the official command line client for testing the speed and performance of your internet connection. | |
Version: speedtest 1.2.0.84 | |
Usage: speedtest [<options>] | |
-h, --help Print usage information | |
-V, --version Print version number | |
-L, --servers List nearest servers | |
-s, --server-id=# Specify a server from the server list using its id | |
-I, --interface=ARG Attempt to bind to the specified interface when connecting to servers | |
-i, --ip=ARG Attempt to bind to the specified IP address when connecting to servers | |
-o, --host=ARG Specify a server, from the server list, using its host's fully qualified domain name | |
-p, --progress=yes|no Enable or disable progress bar (Note: only available for 'human-readable' | |
or 'json' and defaults to yes when interactive) | |
-P, --precision=# Number of decimals to use (0-8, default=2) | |
-f, --format=ARG Output format (see below for valid formats) | |
--progress-update-interval=# Progress update interval (100-1000 milliseconds) | |
-u, --unit[=ARG] Output unit for displaying speeds (Note: this is only applicable | |
for‘human-readable’output format and the default unit is Mbps) | |
-a Shortcut for [-u auto-decimal-bits] | |
-A Shortcut for [-u auto-decimal-bytes] | |
-b Shortcut for [-u auto-binary-bits] | |
-B Shortcut for [-u auto-binary-bytes] | |
--selection-details Show server selection details | |
--ca-certificate=ARG CA Certificate bundle path | |
-v Logging verbosity. Specify multiple times for higher verbosity | |
--output-header Show output header for CSV and TSV formats | |
Valid output formats: human-readable (default), csv, tsv, json, jsonl, json-pretty | |
Machine readable formats (csv, tsv, json, jsonl, json-pretty) use bytes as the unit of measure with max precision | |
Valid units for [-u] flag: | |
Decimal prefix, bits per second: bps, kbps, Mbps, Gbps | |
Decimal prefix, bytes per second: B/s, kB/s, MB/s, GB/s | |
Binary prefix, bits per second: kibps, Mibps, Gibps | |
Binary prefix, bytes per second: kiB/s, MiB/s, GiB/s | |
Auto-scaled prefix: auto-binary-bits, auto-binary-bytes, auto-decimal-bits, auto-decimal-bytes |
获取网速服务商
speedtest --servers
后果是
Closest servers: | |
ID Name Location Country | |
============================================================================== | |
6715 China Mobile Zhejiang 5G Hangzhou China | |
5396 China Telecom JiangSu 5G Suzhou China | |
45170 China Unicom Wu Xi China | |
30852 Duke Kunshan University Kunshan China | |
24447 China Unicom 5G ShangHai China | |
25637 Chinamobile-5G Shanghai China | |
3633 China Telecom Shanghai China | |
36663 China Telecom JiangSu 5G Zhenjiang China | |
26352 China Telecom JiangSu 5G Nanjing China | |
5317 江苏电信 5G Yangzhou China |
测试
我就抉择第一个 id 为 6715 的中国移动浙江 5G 服务商吧。
speedtest --server-id=6715
测试后果为
Speedtest by Ookla | |
Server: China Mobile Zhejiang 5G - Hangzhou (id: 6715) | |
ISP: China Telecom | |
Idle Latency: 9.50 ms (jitter: 0.21ms, low: 9.33ms, high: 10.10ms) | |
Download: 93.55 Mbps (data used: 58.3 MB) | |
29.61 ms (jitter: 3.47ms, low: 10.80ms, high: 44.25ms) | |
Upload: 23.23 Mbps (data used: 40.7 MB) | |
11.31 ms (jitter: 6.19ms, low: 9.37ms, high: 335.13ms) | |
Packet Loss: 0.0% |
当然,以上是通过 Linux 的 centos7 发行版测试的,咱们能够试一下 node 看看行不行。
node 测试
- 新建文件夹
mkdir speedtest | |
cd speedtest | |
npm init -y |
- 装置测试包
npm i speedtest-cli -g
- 获取运营商
speedtest-cli --list --json
- 测试开始
sid 就是运营商的 id。
speedtest-cli --share --json --server sid
刚刚试了下貌似不能够,去年我用的时候还是能够的,那就间接引入包测试下吧。
// speed.js | |
const speedtest = require('speedtest-cli'); | |
console.log(speedtest); |
测试后果如下:
START: 1663385827468 | |
{} | |
received 0.01Mb 0% | |
received 0.21Mb 2% | |
received 3.02Mb 27% | |
received 7.74Mb 69% |
没有达到想要的成果,那还是应用 ookla 家的测试命令行工具吧。
通过以上几个步骤就能够测试你的网速了。
写在最初
以上就是我之前开发测速小工具的一些心得体会,如果对此感兴趣的敌人,也能够试着体验一下哦。