网络运维中常用的诊断和调试技巧。
HTTP 状态码
HTTP 状态码用来表示请求是否成功,以及出现了什么错误。
状态码分类
| 范围 | 类型 | 说明 |
|---|---|---|
| 1xx (100-199) | 信息性 | 请求正在处理 |
| 2xx (200-299) | 成功 | 请求正常处理完毕 |
| 3xx (300-399) | 重定向 | 需要进一步操作 |
| 4xx (400-499) | 客户端错误 | 请求有问题或无法实现 |
| 5xx (500-599) | 服务器错误 | 服务器处理时出错 |
不常见的状态码
| 状态码 | 说明 | 备注 |
|---|---|---|
| 101 | 切换协议 | 服务器同意切换到请求的协议,常用于 WebSocket |
| 104 | 连接重置 | Nginx 定义,客户端取消了请求 |
| 429 | 请求过多 | 触发了频率限制 |
| 499 | 客户端关闭连接 | Nginx 定义,客户端在服务器响应前关闭了连接 |
104 连接重置示例
1 | ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')) |
常见场景:AWS NAT Gateway 会在 30 秒内关闭空闲连接,导致客户端收到 104 错误。
499 客户端关闭连接
这是 Nginx 自定义的状态码,表示客户端在服务器准备响应前就关闭了连接,通常发生在用户取消请求时。
TCP 端口连通性测试
需要测试远程服务器的某个端口(如 MySQL 的 3306)是否可访问。介绍几种常用的测试方法。
快速测试方法
使用 nc (推荐)
最简洁的方式:
1 | nc -zv 192.168.1.100 3306 |
输出:
1 | Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded! |
参数说明:
-z:扫描模式,不发送数据-v:显示详细信息
使用 telnet
传统方式:
1 | telnet 192.168.1.100 3306 |
成功时会显示:
1 | Trying 192.168.1.100... |
退出方式:按 Ctrl + ],然后输入 quit
批量测试端口
nc 批量扫描
1 | # 测试多个端口 |
扫描端口范围
1 | # 扫描 3000-3010 端口 |
高级测试方法
使用 nmap
功能最强大的扫描工具:
1 | # 扫描单个端口 |
输出示例:
1 | PORT STATE SERVICE |
使用 timeout 避免卡住
1 | # 3 秒超时 |
使用 /dev/tcp (内置方法)
不需要额外工具:
1 | # Bash 内置 TCP 测试 |
编写测试脚本
1 |
|
使用:
1 | chmod +x test-port.sh |
方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
nc |
简单快速 | 需要安装 | 日常测试 |
telnet |
通用性好 | 难以脚本化 | 交互式测试 |
nmap |
功能强大 | 较慢,需要安装 | 批量扫描 |
/dev/tcp |
无需工具 | 仅 Bash 支持 | 脚本中使用 |
timeout + /dev/tcp |
内置 + 超时控制 | 语法复杂 | 生产脚本 |
安装工具
CentOS/RHEL
1 | yum install nc nmap telnet |
Ubuntu/Debian
1 | apt-get install netcat nmap telnet |
macOS
1 | brew install netcat nmap telnet |
注意事项
telnet连接成功后需要手动退出,不适合脚本nc的-w参数可以设置超时时间nmap扫描大量端口可能触发防火墙告警/dev/tcp方法在某些受限环境下可能不可用- 使用
timeout命令避免无限等待