ndd 是一个在 Solaris 和其他一些基于 Unix 的系统(如早期的 HP-UX)中用于检查和配置内核网络参数的命令,它的名字来源于 "Network Device Driver"(网络设备驱动程序)。

ndd 是一个用户级的工具,它允许你直接与内核中的网络驱动程序和 TCP/IP 协议栈进行交互,查看或修改它们的运行时配置。
ndd 的主要用途
ndd 主要用于两个方面:
- 查询网络参数:查看当前网络驱动程序或协议栈的各种配置值,这对于诊断网络问题、性能调优和了解系统网络状态非常有用。
- 修改网络参数:动态地更改这些参数,而无需重新编译内核或重启系统,这对于临时调整网络行为、解决特定问题或进行性能测试非常方便。
常见的用法和示例
ndd 的基本语法是:
# 查看驱动程序或模块的可用参数 ndd -h <driver_name> # 查看特定参数的当前值 ndd <driver_name> <parameter_name> # 设置特定参数的新值 ndd -set <driver_name> <parameter_name> <new_value>
示例 1:查看和修改 TCP/IP 协议栈参数
这是 ndd 最常见的用法,驱动程序名是 tcp 或 ip。

查看 TCP 协议栈的所有可配置参数:
ndd -h /dev/tcp
查看当前 TCP 的重传超时时间(单位:毫秒):
ndd /dev/tcp tcp_rexmit_interval
查看当前 TCP 的接收窗口大小:
ndd /dev/tcp tcp_recv_space
临时修改 TCP 的重传超时时间为 500 毫秒:

sudo ndd -set /dev/tcp tcp_rexmit_interval 500
注意:修改参数通常需要
root权限。
示例 2:查看和修改网络驱动程序参数
以常见的 bge (Broadcom Gigabit Ethernet) 驱动为例。
查看 bge 驱动的所有可配置参数:
ndd -h /dev/bge
查看 bge 网卡的最大传输单元:
ndd /dev/bge instance_mtu
查看 bge 网卡的接收环大小:
ndd /dev/bge bge_rx_ring_size
临时禁用网卡上的巨型帧支持:
sudo ndd -set /dev/bge bge_jumbo_capable 0
重要参数示例(以 TCP 为例)
以下是一些在 Solaris 系统调优中非常重要的 ndd 参数:
| 参数名 | 描述 | 默认值 | 调优建议 |
|---|---|---|---|
tcp_conn_req_max |
TCP 半连接队列的最大长度(用于处理 SYN Flood)。 | 1024 | 如果服务器收到大量连接请求,可能会耗尽队列,导致合法连接被拒绝,可以适当调高。 |
tcp_conn_req_max_q0 |
TCP 半连接队列的紧急长度。 | 4096 | 当半连接队列达到 tcp_conn_req_max 时,新的连接请求会进入这个更大的紧急队列。 |
tcp_rexmit_interval_initial |
初始重传超时时间(毫秒)。 | 200 | 对于高延迟网络,可以适当增加此值,避免过早重传。 |
tcp_xmit_hiwat |
TCP 发送缓冲区的高水位线。 | 8192 | 增加此值可以提高网络吞吐量,尤其是在处理大文件传输时。 |
tcp_recv_hiwat |
TCP 接收缓冲区的高水位线。 | 8192 | 增加此值可以提高接收性能,防止接收方因缓冲区满而停止接收数据。 |
tcp_time_wait_interval |
TIME_WAIT 状态的持续时间(毫秒)。 | 240000 | 减少此值可以更快地释放端口资源,但在高并发连接下可能增加端口耗尽的风险。 |
现代系统的替代品
在现代操作系统(如 Linux 和较新的 macOS/FreeBSD)中,ndd 命令已经不再使用或被取代,它们有更强大、更标准化的工具来完成同样的工作。
Linux 中的替代品:sysctl
在 Linux 中,所有内核参数都通过 /proc/sys 文件系统暴露,并由 sysctl 命令管理。
查看所有网络参数:
sysctl -a | grep net
查看当前 TCP 接收缓冲区大小:
sysctl net.core.rmem_max
临时修改 TCP 接收缓冲区大小:
sudo sysctl -w net.core.rmem_max=16777216
永久修改(写入配置文件):
将 net.core.rmem_max=16777216 添加到 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下的配置文件中,然后运行 sudo sysctl -p。
macOS 中的替代品:sysctl
macOS 使用和 Linux 类似的 sysctl 机制。
# 查看 sysctl net.inet.tcp.recvspace # 临时修改 sudo sysctl -w net.inet.tcp.recvspace=65536
| 特性 | ndd (Solaris/HP-UX) |
sysctl (Linux/macOS/FreeBSD) |
|---|---|---|
| 系统 | Solaris, HP-UX (较老) | Linux, macOS, FreeBSD, Windows |
| 作用 | 查询/修改内核网络参数 | 查询/修改内核所有参数(不限于网络) |
| 接口 | 专用命令 ndd |
/proc/sys 文件系统和 sysctl 命令 |
| 现代性 | 已过时,在新版本中可能被移除 | 当前标准,功能强大且广泛使用 |
如果你正在使用 Solaris 或 HP-UX 系统,ndd 是一个不可或缺的网络诊断和调优工具,但在现代的 Linux 或 macOS 环境中,你应该使用 sysctl 来完成相同的任务。
