免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8973 | 回复: 6
打印 上一主题 下一主题

有高手知道netstat实现原理吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-12 13:17 |只看该作者 |倒序浏览
RT\r\n有源码的就更好了

论坛徽章:
0
2 [报告]
发表于 2009-06-12 13:41 |只看该作者
用了/proc文件系统    \r\n以下摘录于网上:\r\n用strace netstat -n 2>tempfile来看netstat\r\n以下是它的输出:\r\nexecve(\"/bin/netstat\", [\"netstat\", \"-n\"], [/* 22 vars */]) = 0\r\nbrk(0)                                  = 0x8057114\r\nopen(\"/etc/ld.so.preload\", O_RDONLY)    = -1 ENOENT (No such file or \r\ndirectory)\r\nopen(\"/etc/ld.so.cache\", O_RDONLY)      = 3\r\nfstat(3, {st_mode=S_IFREG|0644, st_size=21364, ...}) = 0\r\nmmap(0, 21364, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40013000\r\nclose(3)                                = 0\r\nopen(\"/lib/libc.so.6\", O_RDONLY)        = 3\r\nfstat(3, {st_mode=S_IFREG|0755, st_size=4118299, ...}) = 0\r\nread(3, \"\\177ELF\\1\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0\\3\\0\\1\\0\\0\\0\\250\\202\"..., 4096) \r\n= 4096\r\nmmap(0, 993500, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40019000\r\nmprotect(0x40104000, 30940, PROT_NONE)  = 0\r\nmmap(0x40104000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, \r\n0xea000) = 0x40104000\r\nmmap(0x40108000, 14556, PROT_READ|PROT_WRITE, \r\nMAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40108000\r\nclose(3)                                = 0\r\nmprotect(0x40019000, 962560, PROT_READ|PROT_WRITE) = 0\r\nmprotect(0x40019000, 962560, PROT_READ|PROT_EXEC) = 0\r\nmunmap(0x40013000, 21364)               = 0\r\npersonality(0 /* PER_??? */)            = 0\r\ngetpid()                                = 3513\r\nbrk(0)                                  = 0x8057114\r\nbrk(0x80572b4)                          = 0x80572b4\r\nbrk(0x8058000)                          = 0x8058000\r\nopen(\"/usr/share/locale/locale.alias\", O_RDONLY) = 3\r\nfstat(3, {st_mode=S_IFREG|0644, st_size=2174, ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40013000\r\nread(3, \"# Locale name alias data base.\\n#\"..., 4096) = 2174\r\nread(3, \"\", 4096)                       = 0\r\nclose(3)                                = 0\r\nmunmap(0x40013000, 4096)                = 0\r\nopen(\"/usr/share/i18n/locale.alias\", O_RDONLY) = -1 ENOENT (No such file or \r\ndirectory)\r\nopen(\"/usr/share/locale/en_US/LC_MESSAGES/net-tools.mo\", O_RDONLY) = -1 \r\nENOENT (No such file or directory)\r\nopen(\"/usr/share/locale/en/LC_MESSAGES/net-tools.mo\", O_RDONLY) = -1 ENOENT \r\n(No such file or directory)\r\nfstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(4, 3), ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40013000\r\nioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0\r\nwrite(1, \"Active Internet connections (w/o\"..., 42) = 42\r\nwrite(1, \"Proto Recv-Q Send-Q Local Addres\"..., 80) = 80\r\nopen(\"/proc/net/tcp\", O_RDONLY)         = 3\r\nfstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40014000\r\nread(3, \"  sl  local_address rem_address \"..., 1024) = 768\r\nwrite(1, \"tcp        0      0 10.5.9.104:1\"..., 81) = 81\r\nread(3, \"\", 1024)                       = 0\r\nclose(3)                                = 0\r\nmunmap(0x40014000, 4096)                = 0\r\nopen(\"/proc/net/udp\", O_RDONLY)         = 3\r\nfstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40014000\r\nread(3, \"  sl  local_address rem_address \"..., 1024) = 512\r\nread(3, \"\", 1024)                       = 0\r\nclose(3)                                = 0\r\nmunmap(0x40014000, 4096)                = 0\r\nopen(\"/proc/net/raw\", O_RDONLY)         = 3\r\nfstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40014000\r\nread(3, \"  sl  local_address rem_address \"..., 1024) = 384\r\nread(3, \"\", 1024)                       = 0\r\nclose(3)                                = 0\r\nmunmap(0x40014000, 4096)                = 0\r\nwrite(1, \"Active UNIX domain sockets (w/o \"..., 41) = 41\r\nwrite(1, \"Proto RefCnt Flags       Type   \"..., 62) = 62\r\nopen(\"/proc/net/unix\", O_RDONLY)        = 3\r\nfstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0\r\nmmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = \r\n0x40014000\r\nread(3, \"Num       RefCount Protocol Flag\"..., 1024) = 861\r\nwrite(1, \"unix  0      [ ]         STREAM \"..., 67) = 67\r\nwrite(1, \"unix  7      [ ]         DGRAM  \"..., 66) = 66\r\nwrite(1, \"unix  0      [ ]         STREAM \"..., 67) = 67\r\nwrite(1, \"unix  0      [ ]         STREAM \"..., 67) = 67\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nwrite(1, \"unix  0      [ ]         DGRAM  \"..., 58) = 58\r\nread(3, \"\", 1024)                       = 0\r\nclose(3)                                = 0\r\nmunmap(0x40014000, 4096)                = 0\r\nopen(\"/proc/net/ipx\", O_RDONLY)         = -1 ENOENT (No such file or \r\ndirectory)\r\nopen(\"/proc/net/ax25\", O_RDONLY)        = -1 ENOENT (No such file or \r\ndirectory)\r\nopen(\"/proc/net/nr\", O_RDONLY)          = -1 ENOENT (No such file or \r\ndirectory)\r\nmunmap(0x40013000, 4096)                = 0\r\n_exit(0)                                = ?

论坛徽章:
0
3 [报告]
发表于 2009-06-12 14:12 |只看该作者
这一段其实我看到过,但好像是在linux上面的。\r\n在aix下面好像是没有/proc/net这个目录的。

论坛徽章:
0
4 [报告]
发表于 2009-06-12 14:23 |只看该作者
1.接口可用性,地址,和统计(-i / -in)\r\n首先,应检验所有配置的网络接口的状态,使用 netstat -i 命令,如下例所示。\r\n\r\nInterface en0 的状态是 up,而 interface en1 的状态是 down。默认情况下,netstat 命令尝试解析 IP 地址为主机名。要显示 IP 地址,可附加使用 n 标记,这样就可以使用 netstat 命令查看网络接口的 MAC 地址 和 IP 地址。\r\n\r\n$ netstat -i\r\nName Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll\r\nen2 1500 link#2 0.14.5e.d1.ca.42 149031825 0 153444553 4 0\r\nen2 1500 10 Db01_priv 149031825 0 153444553 4 0\r\nen4 1500 link#3 0.9.6b.ee.b1.94 2885570517 0 2009158514 2 0\r\nen4 1500 19.200.1 Db01 2885570517 0 2009158514 2 0\r\nen4 1500 19.200.1 Db01_vip 2885570517 0 2009158514 2 0\r\nlo0 16896 link#1 21657455 0 21671653 0 0\r\nlo0 16896 127 loopback 21657455 0 21671653 0 0\r\nlo0 16896 ::1 21657455 0 21671653 0 0\r\n$ \r\n$ netstat -in\r\nName Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll\r\nen2 1500 link#2 0.14.5e.d1.ca.42 149059563 0 153486342 4 0\r\nen2 1500 10 10.0.0.1 149059563 0 153486342 4 0\r\nen4 1500 link#3 0.9.6b.ee.b1.94 2887600487 0 2010279016 2 0\r\nen4 1500 19.200.1 19.200.1.32 2887600487 0 2010279016 2 0\r\nen4 1500 19.200.1 19.200.1.34 2887600487 0 2010279016 2 0\r\nlo0 16896 link#1 21658567 0 21672766 0 0\r\nlo0 16896 127 127.0.0.1 21658567 0 21672766 0 0\r\nlo0 16896 ::1 21658567 0 21672766 0 0\r\n\r\nMTU :可在网络上发送的最大数据包的大小,称为 最大传输单元(MTU)。同一物理或逻辑(VLAN)网络中的所有设备,应使用同一个 MTU 大小。\r\n\r\n如果 Ierrs 和 Oerrs 的值不为 0,检验网络接口和线缆,或提高相关 buffer (缓存)的大小。在以太网中,collision 字段不被支持,应一直显示为 0。\r\n- 如果 netstat -i 命令显示结果中,Oerrs 列大于 1% Opkts,那么发送给此网卡的 queue size (xmt_que_size) 应该增加。使用:# lsattr -El adapter 命令来检查。\r\n- 如果Ierrs列比Ipkts的1%大,那么,执行netstat -m命令来检查内存是否不够。\r\n\r\n2.路由表\r\n系统上每一次配置一个网络接口,就往本地路由表中添加一个到相应子网的路由。若要系统与位于非直接附加网络上的远程主机进行通讯,必须在路由表中包括到那个子网的特定路由、或一条默认路由。确信指定的网关是活动的,并驻留于直连的网络上。系统的路由表可使用 netstat -rn 命令显示\r\n\r\n$ netstat -rn\r\nRouting tables\r\nDestination Gateway Flags Refs Use If Exp Groups\r\nRoute Tree for Protocol Family 2 (Internet):\r\ndefault 19.200.1.254 UG 134 457586479 en4 - - \r\n10.0.0.0 10.0.0.1 UHSb 0 0 en2 - - =>\r\n10/24 10.0.0.1 U 208 98923219 en2 - - \r\n10.0.0.1 127.0.0.1 UGHS 60 962561 lo0 - - \r\n10.0.0.255 10.0.0.1 UHSb 0 2628 en2 - - \r\n19.200.1.0 19.200.1.32 UHSb 0 0 en4 - - =>\r\n19.200.1/24 19.200.1.32 U 106 1555107887 en4 - - \r\n19.200.1.32 127.0.0.1 UGHS 3 2499628 lo0 - - \r\n19.200.1.34 127.0.0.1 UGHS 2 803714 lo0 - - \r\n19.200.1.255 19.200.1.32 UHSb 0 1048 en4 - - \r\n127/8 127.0.0.1 U 115 17372283 lo0 - - \r\nRoute Tree for Protocol Family 24 (Internet v6):\r\n::1 ::1 UH 0 32 lo0 - - \r\n$ netstat -Cn\r\nRouting tables\r\nDestination Gateway Flags Wt Policy If Cost Config_Cost\r\nRoute Tree for Protocol Family 2 (Internet):\r\ndefault 19.200.1.254 UG 1 - en4 0 0\r\n10.0.0.0 10.0.0.1 UHSb 1 - en2 0 0 =>\r\n10/24 10.0.0.1 U 1 - en2 0 0\r\n10.0.0.1 127.0.0.1 UGHS 1 RR lo0 0 0\r\n10.0.0.255 10.0.0.1 UHSb 1 - en2 0 0\r\n19.200.1.0 19.200.1.32 UHSb 1 - en4 0 0 =>\r\n19.200.1/24 19.200.1.32 U 1 - en4 0 0\r\n19.200.1.32 127.0.0.1 UGHS 1 RR lo0 0 0\r\n19.200.1.34 127.0.0.1 UGHS 1 - lo0 0 0\r\n19.200.1.255 19.200.1.32 UHSb 1 - en4 0 0\r\n127/8 127.0.0.1 U 1 - lo0 0 0\r\nRoute Tree for Protocol Family 24 (Internet v6):\r\n::1 ::1 UH 1 - lo0 0 0\r\n$ \r\n\r\n3.内存缓存\r\nnetstat -m\r\n\r\n4.设备驱动统计\r\nnetstat -v\r\n\r\n5.协议统计\r\nnetstat -s\r\n\r\n6.socket\r\nnetstat -a

论坛徽章:
0
5 [报告]
发表于 2009-06-12 14:26 |只看该作者
显示网络当前连接、接口、路由表信息:\r\n/bin/netstat [-n][{-A -a }]|{-r -C -i -I Interface}] [-f AddressFamily][-p Protocol][Interval][System]\r\n显示网络内容和统计数据:\r\n/bin/netstat [-m |-s|-ss|-u|-v|[-f AddressFamily][-p Protocol][Interval][System]\r\n显示数据包统计信息:/bin/netstat -D\r\n显示网络缓存状况信息:/bin/netstat -c\r\n显示数据链路状况:/bin/netstat -P\r\n清楚统计信息:/bin/netstat [-Zc|Zi|Zm|Zs]\r\n参数含义就是如下:\r\n-A 显示与任何网络协议连接相关的地址信息。\r\n-a 显示所有的网络socket 连接状况,如果没有此参数,则不显示服务器进程使用的网络socket \r\n-c 显示网络缓存的情况。网络缓存是内存中的一块区域,用来临时存放将要发送或者已经接收的数据。网络缓存在网络发送\r\n就收数据的时候哦动态调整。\r\n-C 显示路由表,包括用户初始设定的路有价值和当前的路有价值(操作系统根据路有价值选择合适的路由收发数据)。通过route命令的-hopcount 参数可以设定路有价值,Dead Gateway Detection 功能可能修改此价值。如果此路由不通,这个路由价值将变的很高(越高越不会选择此路由)。\r\n-D 显示有多少数据包接收、发送丢弃。如果输出中有N/A显示,则表明此状态不可用,例如NFS/RPC状态,如果所有从RPC接收的数据包同样经由NFS,在NFS/RPC汇总显示中的累加和为0,实际显示为N/A。如果NFS没有发送数据包,或者发送的数据包都丢掉了,则单独发送项为N/A,而累加有一定的数值\r\n-f (Address Family)显示在地址类中设定的地址类的状态数据。有以下几种地址类:\r\ninter     这是AF_INET 地址类 (普通的ip连接)\r\ninet6      AF_INET6地址类    (ipv6连接)\r\nns       AF_NS地址类\r\nunix       AF_unix地址类\r\n-i  显示所有配置的网络接口的状态信息,但其中不会显示以太网发生数据包碰撞的数据。\r\n-I (Interface )显示特定的网络接口的状态信息,但其中不会显示以太网发生数据包碰撞的数据。\r\n-m  显示路由相关的状态信息。\r\n-n  以数值的方式显示网络地址,当没有使用此参数的时候,netstat命令会将数值方式的网络地址翻译成域名显示。\r\n-p (Protocol)显示特定协议的状态信息。可以使用协议的别名,他们保存在/etc/protocols文件中。如果没有任何显示,则表明没有关于此协议的统计信息。如果显示unknown ,则表明此协议没有路由可连通。\r\n-P 显示Data Link Provider Interface (DLPI)数据链路接口信息。\r\n-r  显示路由表,与-s 参数配合,会显示路由状态信息。\r\n-s 显示每种协议的状态信息。\r\n-ss 显示不是0的协议状态信息。\r\n-u 显示域socket 信息\r\n-v 显示基于CDLI的通信卡的信息,netstat实际执行了 entstat,tokstat,fddistat命令已获得数据。\r\n-Zc 清除网络缓存状态信息。\r\n-Zi 清除接口状态信息。\r\n-Zm 清除网络内存分配状态信息。\r\n-Zs 清除协议状态信息,如果指定 协议,需要配合-p 参数,例如:\r\n#netstat -Zs -p tcp \r\n执行netstat 不带任何参数,将显示活动的socket的信息,包括:本地和对端网络地址\r\n发送和接收队列的大小\r\n协议\r\n协议的当前状态

论坛徽章:
0
6 [报告]
发表于 2009-06-12 21:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2009-06-13 12:56 |只看该作者
说实话。看不懂。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP