复习——网络测试工具

网络测试工具

一、常用网络测试工具详解

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查询
网络配置 ifconfigip addr 查看网络接口

五、注意事项

  1. 权限问题:tcpdump和netstat查看详细信息需要sudo权限

  2. 生产环境:谨慎使用网络测试工具,避免影响正常业务

  3. 防火墙:测试时注意防火墙设置,可能导致连接失败

  4. 协议版本:注意IPv4和IPv6的区别

  5. 性能影响:抓包会影响网络性能,测试环境使用

相关推荐
万法若空1 分钟前
C/C++基本类型表示范围
c语言·开发语言·c++
Lust Dusk2 分钟前
postman工具介绍(附下载教程)
测试工具·安全·web安全·postman
yijianace4 分钟前
Python爬虫实战:BooksToScrape 多线程爬取与图片下载
开发语言·爬虫·python
Mr -老鬼8 分钟前
EasyClick 入门指南:HTTP 网络请求与 API 对接实战
网络·网络协议·http·自动化·#easyclick
tedcloud12310 分钟前
Supermemory部署教程:打造Agent记忆与RAG环境
服务器·人工智能·学习·自动化·powerpoint
凡人叶枫11 分钟前
Effective C++ 条款15:在资源管理类中提供对原始资源的访问
linux·开发语言·c++·stm32·单片机
swordbob11 分钟前
Spring Boot 2.0 改 CGLIB 后,接口实现是否有影响
java·开发语言·spring
AI人工智能+电脑小能手16 分钟前
【大白话说Java面试题 第106题】【并发篇】第6题:synchronized 锁的锁对象可以是什么?
java·开发语言·面试
c2385616 分钟前
Vim 高阶实操技巧篇
linux·编辑器·vim
质造者16 分钟前
Python 本地 RAG 实战 | Ollama+ChromaDB 实现 PDF 离线智能问答
开发语言·python·pdf·大模型·rag