网络诊断(下):netstat、ss、ip
netstat:网络连接统计(传统工具)
netstat(Network Statistics)显示网络连接、路由表、接口统计等信息。
# 显示所有连接(-a all)
netstat -a
# 显示 TCP 连接(-t tcp)
netstat -at
# 显示 UDP 连接(-u udp)
netstat -au
# 显示监听端口(-l listening)
netstat -tl
# 显示进程名(-p program,需要 sudo)
sudo netstat -tlp
# 显示数字地址(-n numeric,不解析域名)
netstat -tn
# 最常用组合:显示所有 TCP/UDP 监听端口和进程
sudo netstat -tunlp
netstat -tunlp 输出解读
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld
tcp6 0 0 :::80 :::* LISTEN 9012/nginx
tcp6 0 0 :::443 :::* LISTEN 9012/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 1000/dhclient
| 字段 | 含义 |
|---|---|
| Proto | 协议(tcp/tcp6/udp/udp6) |
| Recv-Q | 接收队列中未被读取的字节数 |
| Send-Q | 发送队列中未被确认的字节数 |
| Local Address | 本地地址和端口 |
| Foreign Address | 远程地址和端口 |
| State | 连接状态(LISTEN/ESTABLISHED/TIME_WAIT) |
| PID/Program | 进程 ID 和程序名 |
ss:netstat 的现代替代品
ss(Socket Statistics)是 netstat 的替代工具,更快更详细,直接从内核获取信息。
# 显示所有 TCP 连接
ss -t -a
# 显示所有 UDP 连接
ss -u -a
# 显示监听端口
ss -t -l
# 显示进程名(-p)
sudo ss -t -lp
# 显示数字地址(-n)
ss -t -n
# 最常用组合(对应 netstat -tunlp)
sudo ss -tunlp
# 显示连接统计摘要
ss -s
# 显示详细信息(含 TCP 内部参数)
ss -ti
ss 的优势
| 特性 | netstat | ss |
|---|---|---|
| 速度 | 慢(读取 /proc) | 快(直接从内核获取) |
| 信息详细度 | 基础 | 可显示 cwnd、rtt、ssthresh |
| 现代系统支持 | 逐渐弃用 | 默认安装,推荐 |
| 过滤能力 | 弱 | 强(支持状态过滤) |
# ss 过滤示例
ss -t state established # 只显示 ESTABLISHED 连接
ss -t state time-wait # 只显示 TIME_WAIT 连接
ss -t dst 192.168.1.1 # 只显示目标地址为 192.168.1.1 的连接
ss -t sport = :80 # 只显示本地端口 80 的连接
ip:现代网络配置工具
ip 是 ifconfig、route、arp 的现代替代品,功能更强大,输出更清晰。
ip addr:查看 IP 地址
# 查看所有接口的 IP 地址
ip addr
# 简写
ip a
# 查看特定接口
ip addr show eth0
ip link:查看网络接口状态
# 查看所有网络接口
ip link
# 查看特定接口
ip link show eth0
# 启用/禁用接口
sudo ip link set eth0 up
sudo ip link set eth0 down
ip route:查看路由表
# 查看路由表
ip route
# 简写
ip r
# 输出示例:
# default via 192.168.1.1 dev eth0 proto dhcp metric 100
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
| 字段 | 含义 |
|---|---|
| default | 默认路由(0.0.0.0/0) |
| via 192.168.1.1 | 下一跳网关 |
| dev eth0 | 出接口 |
| proto dhcp | 路由来源(DHCP 获取) |
| src 192.168.1.100 | 源地址 |
ip neigh:查看 ARP/邻居表
# 查看 ARP 表(替代 arp -a)
ip neigh
# 输出示例:
# 192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
综合排障场景
场景:服务无法访问
# 1. 确认服务是否在监听
sudo ss -tunlp | grep :80
# 或
sudo netstat -tunlp | grep :80
# 2. 确认本机 IP 地址
ip addr
# 3. 确认路由是否正确
ip route
# 4. 测试连通性
ping <目标IP>
# 5. 测试端口连通性
curl http://<目标IP>:80
# 或
nc -vz <目标IP> 80
本篇小结
netstat -tunlp:查看 TCP/UDP 监听端口和进程(传统工具,逐渐弃用)ss -tunlp:netstat 的现代替代,更快更详细,ss -ti显示 TCP 内部参数ss -s:连接统计摘要;ss -t state established:状态过滤ip addr(ip a):查看 IP 地址,替代ifconfigip link:查看网络接口状态,可启用/禁用接口ip route(ip r):查看路由表,替代routeip neigh:查看 ARP 表,替代arp -a
动手实践
查看本机所有监听端口:
sudo ss -tunlp # 对比 sudo netstat -tunlp,观察输出差异查看连接统计:
ss -s查看 TCP 内部参数:
ss -ti | head -20 # 观察 cwnd、rtt、ssthresh 等参数查看网络配置:
ip addr ip link ip route ip neigh过滤特定状态连接:
ss -t state time-wait | wc -l ss -t state established | wc -l思考:为什么
ss比netstat更快?ss直接从内核获取信息,而netstat读取/proc文件系统,这个区别在连接数很多时(如 10 万并发)会有什么影响?