netstat基本使用
netstat
netstat十一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们主要利用的是上述功能中的第一个,即显示TCP连接及其状态信息。毕竟,要获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route和ifconfig命令。
netstat命令常用的选项包括:
- -n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。
- -a,显示结果中也包含监听socket(man 手册中指 all)。
- -t,显示TCP连接。
- -u,显示UDP连接。
- -r,显示路由信息。
- -i,显示网卡接口的数据流量。
- -c,每隔1s输出一次。
- -o,显示socket定时器(比如保活定时器)的信息。
- -p,显示socket所属的进程的PID和名字。
下面我们裕兴websrv服务器,并执行telnet命令对它发起一个连接请求:
$ ./websrv 127.0.0.1 13579 &
$ telnet 127.0.0.1 13579
然后执行命令netstat -nat | grep 127.0.0.1:13579查看连接状态,结果如下:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:13579 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:13579 127.0.0.1:48220 ESTABLISHED
tcp 0 0 127.0.0.1:48220 127.0.0.1:13579 ESTABLISHED
由以上结果可见,netstat的每行输出都包含如下6个字段(默认情况):
- Proto,协议名。
- Recv-Q,socket内核接受缓冲区中尚未被应用程序读取的数据量。
- Send-Q,未被对方确认的数据包。
- Local Address,本端的IP地址和端口号。
- Foreign Address,对方的IP地址和端口号。
- State,socket的状态。对于无状态协议,比如UDP协议,这一字段将显示为空。而对面向连接的协议而言,netstat支持的State包括ESTABLISHED、SYN_SENT、SYN_RCVD、FIN_WEIT1、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN。它们的含义和图 3-8 中的同名状态一致。
上面的输出中,第1行表示本地socket地址127.0.0.1:13579处于LISTEN状态,并等待任何远端socket(用0.0.0.0:*表示)对它发起连接。第2行表示服务器和远端地址127.0.0.1:48220建立了一个连接。第3行只是从客户端的角度重复第2行信息表示的这个连接,因为我们是在同一台机器上运行服务器程序(websrv)和客户端程序(telnet)的。
在服务器程序开发中,我们一定要确保每个连接在任一时刻都处于万门期望的状态。因此我们应该习惯于使用netstat命令。