type: note
title: Linux:网络「连不上」三类判断(端口 / DNS / 不回话)+ RoCE-IB 与以太网
date: 2026-11-07
description: @从一句「连不上」分到哪一跳:curl 退出码 6/7/28 分别指向名字解析、端口监听、应用层回话;ss -lntp 查端口与占用者;getent 系统解析与 dig 直接问 DNS 两条路对照,读 status(NXDOMAIN 是有应答的失败);4xx/5xx 只出现在「连上了」之后;另讲 RoCE/IB/RDMA 与以太网的区别
tags: Linux, 网络排障, ss, curl, DNS, dig, getent, RoCE, IB, 试点
Linux:网络「连不上」三类判断 + RoCE/IB
> 📌 GitHub:https://github.com/AR-firefly
笔记区
核心观点
**1. 「连不上」不是一种病,是四种不同断点的统称**
要判断的是「断在哪一跳」,不是「服务坏了」:
| 现象指纹 | 断在哪一跳 | 典型原因 |
| -------- | ---------- | -------- |
| `(6) Could not resolve host`,`rc=6` | 名字跳:域名没变成 IP | DNS 层问题 |
| `(7) Failed to connect` / `Connection refused`,`rc=7` | 端口跳:没人在听 | 服务没起 / 端口没开 |
| `(28) timeout`,`rc=28` | 回话跳:门开了没人应 | 服务卡死 / 只 listen 不处理 |
| 2xx / 4xx / 5xx | 已经连上、服务回了 HTTP | 应用层自己的问题 |
**关键**:`4xx` / `5xx` 只可能出现在「**已经连上**」之后------服务根本没起时,`curl` 拿不到任何 HTTP 状态码,只有一个报错。
**2. 一条请求经过的跳数(不是层叠图)**
| 顺序 | 谁在做 | 做什么 | 失败时的指纹 |
| ---- | ------ | ------ | ------------ |
| ① 应用层 | `curl` | 写 HTTP 请求 | --- |
| ② 名字解析 | 系统的存根解析器(DNS) | 名字 → IP | `(6)` |
| ③ 传输层 | 内核 TCP | 三次握手、端口 | `(7)` / `(28)` |
| ④ 应用层 | 对面服务 | 回 HTTP 响应 | 状态码 |
客户端从应用层往下走,到对端再从链路层往上走;上下两处「应用层」是**两个不同进程**(curl 与对面服务)。`curl` 只是等结果,DNS 与握手都不是它自己做的。
**3. `curl` 退出码是「走到第几跳」的证据**
-
`0` 成功;`6` 解析不出主机名;`7` 连接失败(连接阶段被拒);`28` 超时(连上了但等不到回话)。
-
查法:`man 1 curl` 搜 `EXIT CODES`。
-
用户原话:「先 curl 看退出码,判断哪一层出问题了」。
**4. 端口探针:`ss` 读内核账本,不探测**
-
`ss -lnt 'sport = :8092'`:看本机 8092 有没有 `LISTEN`。
-
`-l` 只看 listening,`-t` 只看 TCP,`-n` 显示数字不解析名字;
-
`sport` = **本机端口**(source),`dport` = **对端端口**(destination)------方向别反;
-
过滤表达式里等号和冒号是格式的一部分:`sport = :8092`,写成 `sport =:8092` 会报 `does not look like a port`。
-
`ss -lntp 'sport = :8092'`:多一个 `-p`,`Process` 列出现 `users:(("python3",pid=16885,fd=3))`------进程名、PID、文件描述符。
-
**判据**:有 `LISTEN` 行 = 门开着;只有表头 = 没人听。`Recv-Q` 在监听行上的含义是等 accept 的队列(了解,`man 8 ss`)。
**5. 端口通的两种「通」**
-
门开着 + 服务回话:`LISTEN` 有,`curl -i` 拿到 `HTTP/1.0 200 OK` 和响应头 → 正常。
-
门开着 + 服务不回话:`LISTEN` 有,`curl` 却 `28` 超时 → **服务不回话**,最容易和「端口没开」混。判据看 `rc`:`7` 是没人听,`28` 是有人听但不应。
**6. DNS 两条路:系统解析 vs 直接问 DNS**
| 路线 | 命令 | 覆盖什么 |
| ---- | ---- | -------- |
| 系统解析 | `getent hosts 名字` | 按 nsswitch 顺序:先 `/etc/hosts`,再问 DNS |
| 直接问 DNS | `dig 名字` | 只问 DNS 服务器,**完全不看 hosts** |
-
`getent` 的用法是 `getent <数据库> <名字>`:第一个词选**查哪张表**(`hosts` / `passwd` / `group`......)。写成 `getent nosuch.invalid` 会报 `Unknown database`------那是把名字当成了数据库名。
-
`getent` 退出码:`0` 查到、`2` 键查不到、`1` 参数缺失或数据库名错、`3` 该库不支持枚举(`man 1 getent`)。
-
`dig` 第一个参数就是**名字**,可跟类型(`A` / `AAAA`);`@服务器` 指定问谁。IP 不是输入,是返回结果。
-
两条路结果对比能定位:`getent` 有而 `dig` 无 → 名字在 `/etc/hosts` 里。
**7. `dig` 输出只看四处**
| 看哪里 | 回答什么 |
| ------ | -------- |
| `;; ->>HEADER<<- ... status:` | 服务器**怎么答的** |
| `;; ANSWER: N` / ANSWER 段 | 给了几个 IP |
| `;; SERVER:` | 谁答的(与 `/etc/resolv.conf` 的 `nameserver` 对照) |
| `;; Query time:` | 服务器**回没回**(几毫秒 = 回了) |
`status` 主要四值:`NOERROR`(成功,可能没答案)、`NXDOMAIN`(名字不存在)、`SERVFAIL`(服务器答不上来)、`REFUSED`(拒答)。
**8. `NXDOMAIN` = 有应答的失败**
`NXDOMAIN` = Non-eXistent Domain:DNS 服务器**明确回答「没有这个域名」**。它和「没应答」(超时 / `no servers could be reached`)是两回事------一个说明名字真不存在,一个说明问都没问到。
**9. DNS 不通的主干排查顺序**
-
名字本身在不在:`NXDOMAIN` + `ANSWER: 0`;
-
本地文件/顺序参不参与:`getent` 与 `dig` 结果是否一致(`/etc/hosts`、`nsswitch.conf`);
-
问哪台、那台通不通:`/etc/resolv.conf` 的 `nameserver`(本机是 `10.255.255.254`,WSL 自动生成);
-
服务器自己答不答:`SERVFAIL` / `REFUSED`;
-
到 53 端口的网络通不通;单标签名字还要留意 `search` 域干扰。
**10. RDMA / IB / RoCE 与以太网**
-
**RDMA** = Remote Direct Memory Access:网卡直接读写(对端)内存,绕过对方 CPU 和内核协议栈的搬运。词根:Remote + Direct + Memory + Access。
-
**IB(InfiniBand)**:一套**专用网络**(不是以太网),自己的链路层、交换机、网卡;原生支持 RDMA;**无损**------靠链路级 credit 流控,缓冲满就让发送方先别发,不丢包;由 **SM(子网管理器)** 集中管理。代价:贵、封闭、要专门运维,大集群用得多。
-
**RoCE** = RDMA over Converged Ethernet:把 RDMA 跑到**融合以太网**上,复用现有以太网生态。但以太网默认有损,要用 **PFC(优先级流控)+ ECN** 配成无损,否则丢包会拖崩性能。`RoCEv1` 只在二层内走,`RoCEv2` 能跨三层(走 IP/UDP)。代价:交换机、VLAN、PFC/ECN 都得按规范配,复杂。
| 维度 | 以太网 TCP/IP | IB | RoCE |
| ---- | ------------- | -- | ---- |
| 链路层 | 以太网 | 自有 | 以太网 |
| 无损 | 有损,靠 TCP 重传 | 原生无损(credit) | 配好才无损(PFC/ECN) |
| RDMA | 没有(走内核) | 原生支持 | 支持 |
| 跨三层 | 是 | 有自己一套路由 | RoCEv2 是 |
| 成本 / 运维 | 低 / 通用 | 高 / 专用 | 中 / 配对复杂 |
| 典型场景 | 普通业务 | HPC、大规模 AI 集群 | AI 集群、云厂商 |
- 本机边界:笔记本没有 PCIe 插槽装 RDMA 网卡,WSL2 不支持 PCIe 直通------**没有命令能摸到 RDMA,这段是纯概念**。
关键方法/流程
**从一句「连不上」到定位(总流程)**
| 步 | 做什么 | 判据 |
| -- | ------ | ---- |
| 0 | 记下目标(IP:端口 / 域名)、`curl` 报错、退出码 | --- |
| 1 | 看报错指纹定跳 | `6` 名字 / `7` 端口 / `28` 回话 / 2xx-5xx 应用层 |
| 2 | DNS 跳:`getent hosts` → 不行再 `dig`,对照能解析的域名 | 系统解析不认识 + `NXDOMAIN` = 名字不存在;`SERVFAIL`/超时 = 服务器环 |
| 3 | 端口跳:`ss -lnt 'sport = :端口'` | 空表 = 没人听;有 `LISTEN` 再看 `-p` 是谁 |
| 4 | 回话跳:看服务是否回应用层 | `curl -i` 拿状态行+响应头;`28` = 只 listen 不处理 |
**端口不通的修复动作(今天做过的一半)**
-
没人听 → 把服务起来(今天用 `python3 -m http.server 8092 --bind 127.0.0.1 &` 占住端口),再 `curl -i` 验证 200;
-
有人听但不回话 → 查服务自己的进程状态/日志(为什么只 listen 不处理),再重启或改配置。
**「通但慢」分两层(面试延伸,S4 再展开)**
| 现象 | 常见原因 | 看哪里 |
| ---- | -------- | ------ |
| 整页慢、服务端指标高 | 应用处理不过来(连接/线程池满、慢查询、GC) | 服务日志、响应时间、进程 |
| 整页慢、服务端正常 | 链路:带宽满、丢包重传、RTT 高 | `ping` / `mtr`、带宽 |
| 只有部分资源慢 | 页面引用的 CDN/第三方超时 | 浏览器 F12 的 Network 面板 |
| 首次慢、之后快 | DNS 慢 / 缓存未命中 | 解析耗时、缓存配置 |
实战记录
**记录 1:8092 端口没人听 → 起服务 → 通了**
```
$ curl -sS -m 3 http://127.0.0.1:8092/
curl: (7) Failed to connect to 127.0.0.1 port 8092 after 2 ms: Could not connect to server
echo ?
7
$ ss -lnt 'sport = :8092'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
(只有表头)
$ python3 -m http.server 8092 --bind 127.0.0.1 &
1 16885
Serving HTTP on 127.0.0.1 port 8092 ...
$ ss -lntp 'sport = :8092'
LISTEN 0 5 127.0.0.1:8092 0.0.0.0:* users:(("python3",pid=16885,fd=3))
$ curl -i 127.0.0.1:8092
HTTP/1.0 200 OK
```
**记录 2:三个目标一眼分三类(第 3 段综合现场)**
```
$ curl 127.0.0.1:8090 → 返回 HTML(正常)
$ curl -m 3 127.0.0.1:8091
curl: (28) Operation timed out after 3002 milliseconds with 0 bytes received
$ curl -m 3 127.0.0.1:8093
curl: (7) Failed to connect to 127.0.0.1 port 8093 after 0 ms: Could not connect to server
$ curl -m 3 nosuch.invalid
curl: (6) Could not resolve host: nosuch.invalid
```
配合 `ss -lntp 'sport = :8091'` 看到 `LISTEN ... users:(("python3",pid=17428,fd=3))`------8091 是「门开着但不回话」;8093 是 `ss` 只有表头,没人听。
**记录 3:dig 读 DNS 服务器怎么答**
```
$ dig nosuch.invalid
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45174
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; Query time: 32 msec
;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP)
```
`status: NXDOMAIN` + `ANSWER: 0` + 有 `SERVER` 且 `Query time: 32 msec` → 服务器**回了**,只是说没有这名字。对照 `getent hosts www.baidu.com` 出 IP、`rc=0`。
线索区(学完后合上材料,自问自答)
**Q: 只给一句「连不上」,第一件事做什么?为什么?**
A: 先 `curl` 一次拿报错文本 + 退出码定跳:6 名字、7 端口、28 回话;不知道断在哪跳,后面的命令都是乱枪。
**Q: `curl` 的 6 / 7 / 28 各代表断在哪?**
A: 6 = 名字没解析成 IP;7 = 连接阶段被拒(没人 listen);28 = 连上了但等不到回应。4xx/5xx 不同,那是连上之后应用层回的。
**Q: 端口开着但不回话,和端口没开,怎么分清?**
A: `ss -lntp 'sport = :端口'`:没有 `LISTEN` = 没开(curl 是 `7`);有 `LISTEN` 但 `curl` 是 `28` = 开着但没人回话。
**Q: `sport` 和 `dport` 分别筛什么?**
A: `sport` 筛本机端口(Local Address:Port),`dport` 筛对端端口(Peer Address:Port);查监听服务用 `sport`。
**Q: `getent hosts` 和 `dig` 差在哪?**
A: `getent` 走系统解析(先 `/etc/hosts` 再 DNS),`dig` 只问 DNS、不看 hosts;一个查「这台机器认不认识」,一个查「DNS 服务器怎么答」。
**Q: `NXDOMAIN` 是什么意思?它和超时有什么不同?**
A: 名字不存在------服务器**有应答**但明确说没有这个域名;超时是**根本没应答**,问都没问到。
**Q: 端口开着但不回话,下一步修什么?**
A: 不是网络问题,是服务自己:看它的进程状态和日志(为什么只 listen 不处理),再重启或改配置。
**Q: IB 和 RoCE 都支持 RDMA,差在哪?**
A: IB 是专用网络,原生无损(credit 流控)、要 SM 管;RoCE 借以太网,便宜通用但要把以太网配成无损(PFC/ECN),配置复杂。取舍:成本/通用性 vs 无损省心。
总结(50字以内,用自己的话概括今天学到了什么)
连不上先看 curl 报错定跳:6 名字、7 端口、28 回话;ss 看端口,getent/dig 查 DNS;RDMA 走 IB 或 RoCE。
复习卡片
| 概念 | 必学/了解 | 一句话 | 场景 |
| ---- | --------- | ------ | ---- |
| curl 退出码 6/7/28 | 必学 | 6 名字、7 端口、28 回话,是断在第几跳的指纹 | 任何「连不上」第一步 |
| `4xx` / `5xx` | 必学 | 只出现在**连上之后**,属于应用层问题,不是「连不上」 | 区分网络问题与服务问题 |
| `ss -lntp` | 必学 | 读内核 socket 表:有 `LISTEN` = 门开,`-p` 看谁占 | 查端口、查占用 |
| `sport` / `dport` | 必学 | sport 本机端口、dport 对端端口 | 过滤表达式 |
| `curl -i` / `-I` | 必学 | `-i` 带头+正文,`-I` 只发 HEAD 拿响应头 | 确认应用层回话 |
| `getent hosts` | 必学 | 系统解析查名字(先 hosts 再 DNS);rc 0 有 / 2 没有 / 1 参数错 | 判本机认不认识名字 |
| `dig` | 必学 | 直接问 DNS 服务器,不看 hosts;`@` 指定问谁 | 看 DNS 怎么答 |
| `dig` 的 status | 必学 | NOERROR / NXDOMAIN / SERVFAIL / REFUSED | 判 DNS 失败类型 |
| `NXDOMAIN` | 必学 | Non-eXistent Domain:有应答的失败------名字不存在 | 区分「不存在」与「没答」 |
| `/etc/resolv.conf` | 必学 | 系统问哪台 DNS 服务器(`nameserver`) | DNS 排查第 3 步 |
| LISTEN / `users:(...)` | 必学 | 监听行读法:进程名、PID、fd | 查端口被谁占 |
| RDMA | 必学 | 网卡直接读写对端内存,绕过 CPU(Remote+Direct+Memory+Access) | 智算网络名词 |
| IB | 必学 | 专用网络:原生无损(credit)、SM 管、原生 RDMA | 大规模 AI/HPC 集群 |
| RoCE | 必学 | RDMA over 融合以太网;要 PFC/ECN 配无损;v2 可跨三层 | AI 集群、云厂商 |
| `-m` / `-s` / `-S` | 了解 | `curl` 选项:超时秒数 / 静默 / 仍报错 | `man 1 curl` |
| `--bind`、`http.server` | 了解 | 只听回环 / Python 自带简易服务 | `python3 -m http.server --help` |
| PFC / ECN | 了解 | 把以太网配成无损的两个手段 | 查 Microsoft Learn / NVIDIA 文档 |
| SM 子网管理器 | 了解 | IB 的集中管理组件 | 查 NVIDIA UFM 文档 |
| `search` 域 | 了解 | 单标签名字可能被拼上搜索域 | `man 5 resolv.conf` |
流程附加段
旧知识回收
| 概念 | 一句话 | 出处 |
| ---- | ------ | ---- |
| `sport` / `dport` 方向 | 一开始把「筛端口」说成笼统的筛选,纠正为 sport 本机、dport 对端 | 复习 10-24 当天 |
| `sudo` 与 `-p` 的边界 | 看**别人**(含 root)的进程要权限;看**自己**的进程不需要------`9001` 不加 sudo 也看得到 | 复习时追问 |
| `getent` 参数顺序 | 第一个词是**数据库名**(`hosts`/`passwd`/`group`),第二个才是名字;写反报 `Unknown database` | 今天踩到 |
| `dig` 参数 | 第一个就是名字;把 `hosts` 一起带上去会被当成另一个名字查 | 今天踩到 |
| 退出码读法 | `echo $?` 拿程序结果码;`0` 成功、非 0 带原因 | 点 1 |
| 「连不上」不产生 HTTP 码 | 服务没起时 `curl` 拿不到 4xx/5xx,只有报错 | 第 3 问修正 |
今日产出验收
| 产出条 | 证据 | 结果 |
| ------ | ---- | ---- |
| 四个目标独立分类 | 8090 `200 OK`;8091 `LISTEN`+`28`;8093 空表+`7`;域名 `NXDOMAIN`+`ANSWER: 0` | 过 |
| 每个目标证据链 | 报错/退出码 ↔ 哪一跳 ↔ 下一步,四类都对得上 | 过 |
| 说清「只报连不上第一件事」 | 先 curl 定跳(修正了「看 4xx/5xx」的旧想法) | 过 |
| 复习(10-24 链路) | 自己查出 9001 的 python3 + PID + fd | 过 |
| RoCE/IB 概念 | 复述:RDMA 定义、IB 专用/无损/原生支持、RoCE 借以太网+配无损 | 过 |