HTTP连通性测试
测试HTTP/HTTPS网站的响应时间
端口连通性测试
测试指定端口的可用性(通过代理)
DNS解析测试
查询域名的DNS解析结果
代码示例
以下是在不同编程语言中实现网络连通性测试的代码示例:
JavaScript HTTP Ping
// HTTP Ping - 测量HTTP请求响应时间
async function httpPing(url, count = 5) {
const results = [];
for (let i = 0; i < count; i++) {
const startTime = performance.now();
try {
const response = await fetch(url, {
method: 'HEAD',
mode: 'no-cors',
cache: 'no-cache'
});
const endTime = performance.now();
const latency = Math.round(endTime - startTime);
results.push({
index: i + 1,
success: true,
latency: latency,
timestamp: new Date().toISOString()
});
} catch (error) {
const endTime = performance.now();
const latency = Math.round(endTime - startTime);
results.push({
index: i + 1,
success: false,
latency: latency,
error: error.message,
timestamp: new Date().toISOString()
});
}
// 间隔一秒
if (i < count - 1) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
return results;
}
// 计算统计数据
function calculatePingStats(results) {
const successful = results.filter(r => r.success);
const latencies = successful.map(r => r.latency);
if (latencies.length === 0) {
return {
total: results.length,
success: 0,
failed: results.length,
min: '-',
max: '-',
avg: '-'
};
}
return {
total: results.length,
success: successful.length,
failed: results.length - successful.length,
min: Math.min(...latencies) + 'ms',
max: Math.max(...latencies) + 'ms',
avg: Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length) + 'ms'
};
}
// 使用示例
httpPing('https://www.baidu.com', 5).then(results => {
console.log('Ping结果:', results);
console.log('统计:', calculatePingStats(results));
});
Python Ping测试
import subprocess
import re
import time
from statistics import mean
# 使用系统ping命令
def ping_host(host, count=4):
try:
# 根据操作系统选择ping命令
if platform.system() == 'Windows':
cmd = ['ping', '-n', str(count), host]
else:
cmd = ['ping', '-c', str(count), host]
result = subprocess.run(cmd, capture_output=True, text=True)
output = result.stdout
# 解析结果
# Windows: 平均 = 12ms
# Linux: rtt min/avg/max/mdev = 10.123/12.456/15.789/2.123 ms
return {
'host': host,
'success': result.returncode == 0,
'output': output
}
except Exception as e:
return {
'host': host,
'success': False,
'error': str(e)
}
# 使用requests库测试HTTP响应
import requests
def http_ping(url, count=5):
results = []
for i in range(count):
start_time = time.time()
try:
response = requests.head(url, timeout=10)
latency = round((time.time() - start_time) * 1000)
results.append({
'index': i + 1,
'success': True,
'latency': latency,
'status': response.status_code
})
except Exception as e:
latency = round((time.time() - start_time) * 1000)
results.append({
'index': i + 1,
'success': False,
'latency': latency,
'error': str(e)
})
if i < count - 1:
time.sleep(1)
return results
# 计算统计数据
def calculate_stats(results):
successful = [r for r in results if r['success']]
latencies = [r['latency'] for r in successful]
if not latencies:
return {
'total': len(results),
'success': 0,
'failed': len(results),
'min': '-',
'max': '-',
'avg': '-'
}
return {
'total': len(results),
'success': len(successful),
'failed': len(results) - len(successful),
'min': f'{min(latencies)}ms',
'max': f'{max(latencies)}ms',
'avg': f'{round(mean(latencies))}ms'
}
# 使用示例
if __name__ == '__main__':
print(http_ping('https://www.baidu.com', 5))
Node.js TCP端口检测
const net = require('net');
const dns = require('dns').promises;
// TCP端口检测
async function checkPort(host, port, timeout = 5000) {
return new Promise((resolve) => {
const startTime = Date.now();
const socket = new net.Socket();
let resolved = false;
socket.setTimeout(timeout);
socket.on('connect', () => {
const latency = Date.now() - startTime;
socket.destroy();
if (!resolved) {
resolved = true;
resolve({
host,
port,
success: true,
latency
});
}
});
socket.on('timeout', () => {
socket.destroy();
if (!resolved) {
resolved = true;
resolve({
host,
port,
success: false,
error: 'Connection timeout'
});
}
});
socket.on('error', (err) => {
if (!resolved) {
resolved = true;
resolve({
host,
port,
success: false,
error: err.message
});
}
});
socket.connect(port, host);
});
}
// DNS查询
async function dnsLookup(domain, type = 'A') {
try {
switch (type) {
case 'A':
const address = await dns.lookup4(domain);
return { type: 'A', records: [address.address] };
case 'AAAA':
const address6 = await dns.lookup6(domain);
return { type: 'AAAA', records: [address6.address] };
case 'MX':
const mx = await dns.resolveMx(domain);
return { type: 'MX', records: mx.map(r => `${r.exchange} (priority: ${r.priority})`) };
case 'TXT':
const txt = await dns.resolveTxt(domain);
return { type: 'TXT', records: txt.flat() };
case 'NS':
const ns = await dns.resolveNs(domain);
return { type: 'NS', records: ns };
case 'CNAME':
try {
const cname = await dns.resolveCname(domain);
return { type: 'CNAME', records: [cname] };
} catch (e) {
return { type: 'CNAME', records: [] };
}
default:
throw new Error(`Unsupported record type: ${type}`);
}
} catch (error) {
throw new Error(`DNS lookup failed: ${error.message}`);
}
}
// 使用示例
async function main() {
// 测试端口
const portResult = await checkPort('www.baidu.com', 80);
console.log('Port check:', portResult);
// DNS查询
const dnsResult = await dnsLookup('www.baidu.com', 'A');
console.log('DNS result:', dnsResult);
}
main();
Go TCP端口检测
package main
import (
"fmt"
"net"
"time"
)
// 检查TCP端口
func CheckPort(host string, port int, timeout time.Duration) (bool, time.Duration, error) {
startTime := time.Now()
address := fmt.Sprintf("%s:%d", host, port)
conn, err := net.DialTimeout("tcp", address, timeout)
if err != nil {
latency := time.Since(startTime)
return false, latency, err
}
defer conn.Close()
latency := time.Since(startTime)
return true, latency, nil
}
// HTTP Ping
func HTTPPing(url string, count int) {
for i := 0; i < count; i++ {
startTime := time.Now()
resp, err := http.Get(url)
latency := time.Since(startTime)
if err != nil {
fmt.Printf("Ping %d: 失败 (%v)\n", i+1, err)
} else {
resp.Body.Close()
fmt.Printf("Ping %d: 成功 - 延迟: %v, 状态: %d\n",
i+1, latency, resp.StatusCode)
}
if i < count-1 {
time.Sleep(1 * time.Second)
}
}
}
func main() {
// 测试端口
success, latency, err := CheckPort("www.baidu.com", 80, 5*time.Second)
if success {
fmt.Printf("端口可达 - 延迟: %v\n", latency)
} else {
fmt.Printf("端口不可达: %v\n", err)
}
}
关于Ping检测
什么是Ping?
Ping是一种网络工具,用于测试主机之间的连通性。它通过发送ICMP回显请求(Echo Request)并等待回复来测量网络延迟和丢包率。
Ping的应用场景
- 网络故障诊断:确定网络是否可达,定位网络问题
- 性能测试:测量网络延迟,评估网络质量
- 服务器监控:持续监控服务器状态
- 负载测试:测试服务器在高负载下的响应
常用的网络端口
- 21:FTP (文件传输协议)
- 22:SSH (安全外壳协议)
- 23:Telnet (远程登录)
- 25:SMTP (邮件发送)
- 53:DNS (域名解析)
- 80:HTTP (网页浏览)
- 110:POP3 (邮件接收)
- 143:IMAP (邮件接收)
- 443:HTTPS (安全网页)
- 3306:MySQL (数据库)
- 3389:RDP (远程桌面)
- 6379:Redis (缓存数据库)
- 27017:MongoDB (数据库)
DNS记录类型
- A:IPv4地址记录
- AAAA:IPv6地址记录
- CNAME:别名记录
- MX:邮件交换记录
- TXT:文本记录
- NS:域名服务器记录
- SRV:服务记录