不可不知的网络命令:netstat

不可不知的网络命令:netstat

发布:cxoy662019-06-29 15:57:54分类:科技信息

不可不知的网络命令:netstat

作者:编程珠玑/守望(本文来自作者投稿)

前言

在调试网络程序或者定位网络相关问题时,有一个命令不得不知,它就是netstat。

    netstat命令用于查看网络连接,路由表,网络接口统计数据, 虚拟连接等信息。

    netstat的选项很多,但是本文准备介绍一些netstat命令的实用技巧。

    

查看某个端口是否被占用

如果你遇到“Address already in use”的错误,那么你就需要好好看看是不是端口已经被占用了。

    -a(all)参数用于列出所有监听和非监听状态的连接。

    

$ netstat -a|grep 6379

tcp 0 0 *:6379 *:* LISTEN

tcp6 0 0 【::】:6379 【::】:* LISTEN

这里我们可以看到,有一个tcp连接使用了6379端口,并且当前处于LISTEN状态,这些状态信息对于分析网络连接问题非常有帮助,我们将会在后面的文章中看到它们大放异彩。

    

当然你也可以使用lsof命令中的方法来查看。

    

查找占用端口的进程

前面虽然知道已经有进程使用了6379端口,但是不知道是哪个进程,因此为了知道进程信息,需要使用-p(program)参数:

$ netstat -ap|grep 6379

tcp 00*: 6379*:* LISTEN 10011/redis- server

tcp6 00【::】: 6379【::】:* LISTEN 10011/redis- server

这个时候就可以看到是进程id为10011的redis-server进程占用了6379端口,至此要杀要剐就随你便了。

    

查看指定协议的连接

我们都知道,除了TCP之外还有UDP,如果我们想查看指定类型的连接呢?

$ netstat -at #-t,查看tcp连接

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 00192.168. 0. 103:42468113.96. 233.139:httpsESTABLISHED

tcp 00192.168. 0. 103:59326123.58. 182.252:httpsTIME_WAIT

tcp 00192.168. 0. 103:59328123.58. 182.252:httpsTIME_WAIT

(未显示完全)

以此种方式,可以看到所有的TCP连接,而对于UDP连接,只需要使用-u(UDP):

$ netstat -au

udp 00* :36305* :*

udp 00127.0. 1.1:domain* :*

udp 00* :bootpc* :*

udp 00* :ipp* :*

(未显示完全))

当然了,这两个参数也是可以一起用的。

    

除此之外,还可以使用-4或-6来指定查看ipv4还是ipv6的连接:

查看处于监听状态的连接

对于还没有建立完整连接的服务器来说,它启动后正常的状态是LISTEN状态,如果只想查看处于该状态的连接,则可以使用-l(LISTEN)参数:

$ netstat -l

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 00127.0. 1.1:domain* :*LISTEN

tcp 00localhost:5941* :*LISTEN

tcp 00localhost:ipp * :*LISTEN

tcp 00localhost:socks * :*LISTEN

tcp 00* :6379* :*LISTEN

(未显示完全)

这个时候记得不要带上-a参数,它会列出所有。

    

而你如果要查看其他状态的连接,只需要结合grep使用即可,例如,查看ESTABLISHED状态的连接:

$ netstat -anp |grep ESTAB

( Notall processes could be identified, non-owned process info

will notbe shown, you would have tobe root tosee it all.)

tcp 00192.168.0.103: 42468113.96.233.139: 443ESTABLISHED 2613/chrome

tcp 00192.168.0.103: 38024108.177.125.188: 443ESTABLISHED 2613/chrome

不解析主机,端口等信息

不知道你有没有发现,在执行前面的命令的时候,速度很慢,让你一度怀疑是不是自己电脑太卡了。

    实际上,你观察前面的输出结果就会发现,很多连接的主机名和端口对应的应用都解析出来了,例如:

123 .58.182.252:https

所以慢是因为它需要做解析,使用-n(numeric)参数就可以快速显示原始数字端口或地址了:

$ netstat -anp

一定要自己尝试一下奥!

你在定位网络相关问题的时候,总不想执行一次观察一次吧?能不能自动反复执行查看呢?当然可以啦!可以使用-c(continuous)参数:

$ netstat -npc

这样,它就会每隔一秒执行一次。

    

查看用户和连接的iNode

这条连接是哪个用户建立的呢?unix下一切皆文件,那么这个连接的iNode是多少呢?借助-e(extend)参数可以看到这些信息:

$ netstat -ent

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State User Inode

tcp 00192.168.0.103: 42468113.96.233.139: 443ESTABLISHED 1000134891

tcp 00192.168.0.103: 46556121.9.246.106: 443TIME_WAIT 00

可以看到在使用-e参数后,多了最后两列,分别是user和Inode。

    而使用id命令可以知道该user到底是谁:

$ id 1000

uid=1000(hyb) gid=1000(hyb) groups=1000(hyb),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

使用-o可以查看和连接相的定时器信息,

$ netstat -nto

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State Timer

tcp 00192.168.0.103: 42468113.96.233.139: 443ESTABLISHED keepalive ( 18.69/ 0/ 0)

tcp 11192.168.0.103: 43718113.96.233.139: 443LAST_ACK on( 19.97/ 7/ 0)

tcp 00192.168.0.103: 38024108.177.125.188: 443ESTABLISHED keepalive ( 34.76/ 0/ 0)

tcp 00192.168.0.103: 60362123.58.182.252: 443TIME_WAIT timewait ( 6.70/ 0/ 0)

tcp6 00127.0.0.1: 9614127.0.0.1: 59736ESTABLISHED off( 0.00/ 0/ 0)

最后的timer列相关字段含义如下:

  • keepalive keepalive的时间计时
  • on 重发的时间计时
  • off 没有时间计时
  • timewait 等待时间计时

关于定时器的含义,需要对TCP协议有较多理解,这里就不展开了。

    

查看数据包统计信息

各种协议的数据包的收发情况如何呢?连接数量如何呢是用-s(statistics)参数可以查看:

$ netstat -s

(仅显示了TCP协议的结果)

Tcp:

3067active connections openings

1passive connection openings

173failed connection attempts

587connection resets received

10connections established

657576segments received

456349segments send out

2700segments retransmited

16bad segments received.

1321resets sent

查看路由信息

使用-r(route)参数可以查看路由相关信息,例如:

$ netstat -r

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

default 192.168. 0. 10. 0. 0. 0UG 000wlp3s 0

link- local* 255.255. 0. 0U 000wlp3s 0

192.168. 0. 0* 255.255. 255.0U 000wlp3s 0

当然你也可以借助route命令完成这样简单的工作。

    

总结

netstat命令是我们定位网络相关问题的利器,如果你还不会使用,那么最好花几分钟学习一下。

    netstat更详细的字段解释可以参考其手册。

    

【本文作者】

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

欢迎使用手机扫描访问本站,还可以关注微信哦~