网络测试工具
一、常用网络测试工具详解
1. telnet - 远程登录测试
# 测试端口连通性
telnet 192.168.1.1 8888
telnet www.example.com 80
# 如果没有指定端口,默认使用23端口(远程登录)
作用:测试TCP端口是否开放,验证服务是否可达
2. netstat - 网络状态查看
# 查看所有网络连接
netstat -anp
# 按协议查看
netstat -n -t # 仅TCP连接
netstat -n -u # 仅UDP连接
# 查看监听端口
netstat -lnp | grep 8888
# 查看网络接口统计
netstat -n -i
常用选项:
-
-a:显示所有连接 -
-n:以数字形式显示 -
-p:显示进程信息 -
-l:仅显示监听端口 -
-t:TCP协议 -
-u:UDP协议
3. ping - 网络连通性测试
# 测试IP连通性
ping 192.168.1.1
# 测试域名解析
ping www.baidu.com
# 限制ping包数量
ping -c 4 192.168.1.1
# 指定数据包大小
ping -s 1024 192.168.1.1
原理:发送ICMP Echo Request,等待ICMP Echo Reply
4. arp - 地址解析协议
# 查看ARP缓存表
arp -an
# 删除ARP条目
arp -d 192.168.1.100
# 添加静态ARP条目
arp -s 192.168.1.100 00:11:22:33:44:55
作用:IP地址 ↔ MAC地址映射
5. 抓包分析工具
5.1 Wireshark(图形化)
过滤规则语法:
# IP地址过滤
ip.src == 192.168.1.100
ip.dst == 192.168.1.200
ip.addr == 192.168.1.100
# 端口过滤
tcp.port == 80
udp.port == 53
tcp.srcport == 8080
tcp.dstport == 8080
# 协议过滤
tcp
udp
icmp
http
# 组合过滤
ip.src == 192.168.1.100 and tcp.port == 8080
ip.addr == 192.168.1.100 or ip.addr == 192.168.1.200
# 简写
tcp host 192.168.1.100
5.2 tcpdump(命令行)
# 基本抓包
tcpdump -n
# 指定网卡
tcpdump -i eth0
tcpdump -i lo # 本地回环
# 过滤IP
tcpdump -n src 192.168.1.100
tcpdump -n dst 192.168.1.200
tcpdump -n host 192.168.1.100
# 过滤端口
tcpdump -n port 80
tcpdump -n src port 8080
tcpdump -n dst port 8080
# 过滤协议
tcpdump -n tcp
tcpdump -n udp
tcpdump -n icmp
# 显示详细内容
tcpdump -n -X # 十六进制+ASCII
tcpdump -n -XX # 更详细的十六进制
tcpdump -n -A # ASCII格式
tcpdump -n -v # 详细信息
tcpdump -n -vv # 更详细信息
# 组合过滤
tcpdump -n 'src 192.168.1.100 and dst port 80'
tcpdump -n 'tcp port 8080 or udp port 53'
# 保存到文件
tcpdump -n -w capture.pcap
tcpdump -n -r capture.pcap # 读取文件
# 高级示例
sudo tcpdump -n -i eth0 -xx src or dst www.taobao.com -AXX -vv | less
二、TCP连接管理
1. 三次握手(建立连接)
客户端 服务器
| |
|--- SYN=1, seq=x ---------------->|
| (connect()调用) |
| |
|<--- SYN=1, ACK=1, seq=y, ack=x+1-|
| (listen()准备,accept()等待)|
| |
|--- ACK=1, seq=x+1, ack=y+1 ---->|
| |
连接建立 连接建立
代码体现:
-
客户端:
connect()触发第一次SYN -
服务器:
listen()准备接受连接,accept()等待完成握手
2. 四次挥手(断开连接)
客户端 服务器
| |
|--- FIN=1, seq=u ---------------->| # 第1次:主动关闭
| (close()调用) |
| |
|<--- ACK=1, seq=v, ack=u+1 ------| # 第2次:确认
| (半关闭状态) |
| |
|<--- FIN=1, ACK=1, seq=w, ack=u+1-| # 第3次:被动关闭
| |
|--- ACK=1, seq=u+1, ack=w+1 ---->| # 第4次:确认
| |
连接关闭 连接关闭
代码体现 :任何一方调用 close() 都会触发挥手过程
3. 抓包验证
# 验证三次握手
tcpdump -n -i lo tcp port 9999
# 应该看到:
# S - SYN(第一次)
# S. - SYN+ACK(第二次)
# . - ACK(第三次)
三、TCP编程基础
服务器端流程
// 1. 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 2. 设置地址重用
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
// 3. 绑定地址
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8888);
serv_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// 4. 监听
listen(sockfd, 128);
// 5. 接受连接
struct sockaddr_in cli_addr;
socklen_t cli_len = sizeof(cli_addr);
int connfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
// 6. 通信
char buffer[1024];
recv(connfd, buffer, sizeof(buffer), 0);
send(connfd, buffer, strlen(buffer), 0);
// 7. 关闭
close(connfd);
close(sockfd);
客户端流程
// 1. 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 2. 连接服务器
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8888);
serv_addr.sin_addr.s_addr = inet_addr("192.168.1.100");
connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// 3. 通信
send(sockfd, "Hello", 5, 0);
recv(sockfd, buffer, sizeof(buffer), 0);
// 4. 关闭
close(sockfd);
四、实用命令总结
| 功能 | 命令 | 说明 |
|---|---|---|
| 端口测试 | telnet IP 端口 |
测试TCP端口 |
| 连接查看 | `netstat -anp | grep 端口` |
| 抓包分析 | tcpdump -n port 端口 |
命令行抓包 |
| 图形抓包 | wireshark |
图形化分析 |
| 连通测试 | ping IP |
ICMP连通性 |
| 路由跟踪 | traceroute IP |
路由路径 |
| 域名解析 | nslookup 域名 |
DNS查询 |
| 网络配置 | ifconfig 或 ip addr |
查看网络接口 |
五、注意事项
-
权限问题:tcpdump和netstat查看详细信息需要sudo权限
-
生产环境:谨慎使用网络测试工具,避免影响正常业务
-
防火墙:测试时注意防火墙设置,可能导致连接失败
-
协议版本:注意IPv4和IPv6的区别
-
性能影响:抓包会影响网络性能,测试环境使用