LINUX网络性能之管理工具之netstat用法

2010-04-16  安顺 

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。在计算机上执行netstat后,其输出结果如下所示:
引用

-----------------------------------------------------------------
[root@lee /root]#netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Types State I-Node Path
Unix 5 [ ] DGRAM 460 /dev/log
Unix 0 [ ] STREAM CONNECTED 173 @00000014
Unix 0 [ ] DGRAM 662
Unix 0 [ ] DGRAM 631
Unix 0 [ ] DGRAM 544
Unix 0 [ ] DGRAM 484
Unix 0 [ ] DGRAM 470
[root@lee /root]#
-----------------------------------------------------------------

从整体上看,netstat的输出结果可以分为两个部分:第一部分:是Active Internet connections,称为有源TCP连接,在上面的输出结果中,这一部分没有内容,表示暂时还没有TCP连接。第二部分:是Active UNIX domain sockets,称为有源Unix域套接口。输出结果显示的是Unix域套接口的连接情况:
roto显示连接使用的协议
•RefCnt表示连接到本套接口上的进程号。
•Types显示套接口的类型。
•State显示套接口当前的状态。
ath表示连接到套接口的其它进程使用的路径名。
可以用netstat -a来查看所有套接字的状态,这在您调试网络程序的时候是非常有用的。netstat -r将显示路由表的内容,一般还要同时指定"-n"选项,这样可以得到数字格式的地址,也可显示默认路由器的IP地址。使用netstat -i则将显示所有的网络接口信息。使用netstat还可以获得当前的网络状态以及网络的拓扑结构,这在实际中是非常有用的。
tcpdump
tcpdump命令用于监视TCP/IP连接并直接读取数据链路层的数据包头。您可以指定哪些数据包被监视、哪些控制要显示格式。例如我们要监视所有Ethernet上来往的通信,执行下述命令:
Shell代码  
tcpdump -i eth0  
tcpdump -i eth0

即使是在一个相对平静的网络上,也有很多的通信,所以我们可能只需要得到我们感兴趣的那些数据包的信息。在一般情况下,TCP/IP栈只为本地主机接收入站的数据包绑定同时忽略网络上的其它计算机编址(除非您使用的是一台路由器)。当运行tcpdump命令时,它会将TCP/IP栈设置为 promiscuous模式。该模式可接收所有的数据包并使其有效显示。如果我们关心的只是我们本地主机的通信情况,一种方法是使用“-p”参数禁止 promiscuous模式,还有一种方法就是指定主机名:
Shell代码  
tcpdump -i eth0 host hostname  
tcpdump -i eth0 host hostname

此时,系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
Shell代码  
tcpdump -i eth0 src host hostname  
tcpdump -i eth0 src host hostname

下面的命令可以监视所有送到主机hostname的数据包:
Shell代码  
tcpdump -i eth0 dst host hostname  
tcpdump -i eth0 dst host hostname

我们还可以监视通过指定网关的数据包:
Shell代码  
tcpdump -i eth0 gateway Gatewayname  
tcpdump -i eth0 gateway Gatewayname

如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
Shell代码  
tcpdump -i eth0 host hostname and port 80  
tcpdump -i eth0 host hostname and port 80

该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址。端口80是系统默认的HTTP服务端口号。如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。


常用用法
这里用sudo因为当前帐号无权使用tcpdump,这里仅以一个tcp的例子来说明:sudo /usr/sbin/tcpdump tcp port 80 and host 172.23.1.69 -ieth1 -n
每一行中间都有这个包所携带的标志:
S=SYN,发起连接标志
P=PUSH,传送数据标志
F=FIN,关闭连接标志
ack    表示确认包
RST=RESET,异常关闭连接
. 表示没有任何标志
常用参数:
Tcp/udp/arp等:指定协议类型。
(src/dst)Host:指定源端或者目的端ip。
(src/dst)port:指定源端或者目的端
-i:指定网卡。
-n:显示ip,而不是主机名。
-c:指定抓多少个包后退出。
-A:以ASCII方式显示包内容,这个选项对文本格式的协议包非常有用。
-s:指定抓包显示一行的宽度,-s0表示显示完整的包,经常和-A一起用。
-x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册。
上图示例的过程详解
第一行:17:40:10这个时间,从172.17.66.27(client)的临时端口49376向172.23.1.66(server)的9500监听端口发起连接,client初始包序号为1350828479,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为1460(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。
第二行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加1,1350828480,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号为258050143,mss也是1460。
第三行:client再次确认,三次握手完成。
第四行:client发请求包,包长度91字节。
第五行:server响应ack。
第六行:server回包,包长度21字节。
第七行:client响应ack。
第八行:client发起关闭连接请求。
第九行:server响应ack,并且也发送FIN标志关闭。
第十行:客户端响应ack,关闭连接的四次握手完成。
通过这个来理解tcp协议也挺好的,连接关闭过程,字节流顺序控制,拥塞控制,tcp状态转换等。不过这里就不详述了。
531°/5301 人阅读/1 条评论 发表评论

刘俊  2010-04-16

比较难懂


登录 后发表评论