Linux Day32——网络,ROCE-IB与以太网


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 不通的主干排查顺序**

  1. 名字本身在不在:`NXDOMAIN` + `ANSWER: 0`;

  2. 本地文件/顺序参不参与:`getent` 与 `dig` 结果是否一致(`/etc/hosts`、`nsswitch.conf`);

  3. 问哪台、那台通不通:`/etc/resolv.conf` 的 `nameserver`(本机是 `10.255.255.254`,WSL 自动生成);

  4. 服务器自己答不答:`SERVFAIL` / `REFUSED`;

  5. 到 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 借以太网+配无损 | 过 |

相关推荐
不庸.1 小时前
WPScan 实战入门:从 Docker 靶场到弱密码爆破
运维·安全·web安全·docker·容器·安全性测试·wpscan
Decay__3 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Decay__11 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
java_logo13 小时前
Docker 部署 Dify:轻松搭建 LLM 应用开发平台
运维·docker·容器
方便面不加香菜14 小时前
Docker Container -- 综合实战案例详解
运维·docker·容器
LongRunning15 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
海洋之恒15 小时前
GitHub Actions 自动化:5 个真实运维提效案例
运维·自动化·github
迪康coolmu17 小时前
出差终端数据安全落地实战:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·经验分享·笔记·其他·安全·php
民乐团扒谱机18 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法