netstat 是一个用于检查网络配置和活动的有用工具。它实际上是几个工具的集合。我们将在以下章节中讨论它的每个功能。
当你使用–r标志调用 netstat 时,它会像我们使用 route 命令一样显示内核路由表。在 vstout 上,它会产生
# netstat -nr Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 127.0.0.1 * 255.255.255.255 UH 0 0 0 lo 172.16.1.0 * 255.255.255.0 U 0 0 0 eth0 172.16.2.0 172.16.1.1 255.255.255.0 UG 0 0 0 eth0 |
The–n选项使 netstat 将地址打印为点分十进制 IP 数字,而不是符号主机和网络名称。当你想要避免通过网络进行地址查找时(例如,到 DNS 或 NIS 服务器),此选项特别有用。
netstat 输出的第二列显示路由条目指向的网关。如果未使用网关,则会打印星号。第三列显示路由的“通用性”,即此路由的网络掩码。当给定一个 IP 地址以查找合适的路由时,内核会遍历每个路由表条目,将地址和 genmask 进行按位 AND 运算,然后将其与路由的目标进行比较。
第四列显示描述路由的以下标志:
路由使用网关。
要使用的接口已启动。
只能通过路由访问单个主机。例如,环回条目 127.0.0.1 就是这种情况。
此路由是动态创建的。如果表条目是由路由守护进程(如 gated)或由 ICMP 重定向消息生成的,则会设置此标志(请参阅第 2 章中的 2.5 节)。
如果表条目被 ICMP 重定向消息修改,则会设置此路由。
该路由是一个拒绝路由,数据报将被丢弃。
接下来的三列显示将应用于通过此路由建立的 TCP 连接的 MSS、Window 和 irtt。MSS 是最大段大小,是内核将构造的通过此路由传输的最大数据报的大小。Window 是系统将从远程主机在单个突发中接受的最大数据量。首字母缩略词irtt代表“初始往返时间”。TCP 协议通过重新传输已丢失的数据报来确保数据在主机之间可靠传递。TCP 协议会持续记录将数据报传递到远程端并接收到确认所需的时间,以便它知道在假定需要重新传输数据报之前需要等待多长时间;此过程称为往返时间。初始往返时间是 TCP 协议在首次建立连接时将使用的值。对于大多数网络类型,默认值是可以的,但对于某些慢速网络,特别是某些类型的业余无线电分组网络,该时间太短,会导致不必要的重新传输。irtt可以使用 route 命令设置该值。这些字段中的零值表示正在使用默认值。
最后,最后一个字段显示此路由将使用的网络接口。
当使用–i标志调用 netstat 时,它会显示当前配置的网络接口的统计信息。如果还给出了–a选项,它会打印内核中存在的所有接口,而不仅仅是当前已配置的接口。在 vstout 上,netstat 的输出将如下所示:
# netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags lo 0 0 3185 0 0 0 3185 0 0 0 BLRU eth0 1500 0 972633 17 20 120 628711 217 0 0 BRU |
TheMTU和Met字段显示该接口的当前 MTU 和 metric 值。RX和TX列显示已无错误地接收或传输了多少数据包 (RX-OK/TX-OK) 或已损坏的数据包 (RX-ERR/TX-ERR);丢弃了多少数据包 (RX-DRP/TX-DRP);以及由于溢出而丢失了多少数据包 (RX-OVR/TX-OVR).
最后一列显示为此接口设置的标志。这些字符是长标志名称的单字符版本,当你使用 ifconfig 显示接口配置时会打印这些标志。
已设置广播地址。
此接口是一个环回设备。
接收所有数据包(混杂模式)。
已为此接口关闭 ARP。
这是一个点对点连接。
接口正在运行。
接口已启动。
netstat 支持一组选项来显示活动或被动套接字。选项–t, –u, –w和–x显示活动的 TCP、UDP、RAW 或 Unix 套接字连接。如果你还提供–a标志,也将显示正在等待连接(即正在侦听)的套接字。此显示将为你提供系统上当前运行的所有服务器的列表。
在 vlager 上调用 netstat -ta 会产生以下输出:
$ netstat -ta Active Internet Connections Proto Recv-Q Send-Q Local Address Foreign Address (State) tcp 0 0 *:domain *:* LISTEN tcp 0 0 *:time *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp 0 0 vlager:smtp vstout:1040 ESTABLISHED tcp 0 0 *:telnet *:* LISTEN tcp 0 0 localhost:1046 vbardolino:telnet ESTABLISHED tcp 0 0 *:chargen *:* LISTEN tcp 0 0 *:daytime *:* LISTEN tcp 0 0 *:discard *:* LISTEN tcp 0 0 *:echo *:* LISTEN tcp 0 0 *:shell *:* LISTEN tcp 0 0 *:login *:* LISTEN |
此输出显示大多数服务器只是在等待传入连接。但是,第四行显示来自 vstout 的传入 SMTP 连接,第六行告诉你有一个到 vbardolino 的传出 telnet 连接。[1]
单独使用–a标志将显示所有系列的所有套接字。
[1] | 你可以从端口号判断连接是否是传出的。为调用主机显示的端口号始终是一个简单的整数。在被调用主机上,将使用一个众所周知的服务端口,netstat 为其使用符号名称,例如smtp,可以在/etc/services. |