ping、traceroute、netstat、host、nslookup

来源:互联网 发布:淘宝上买片关键词 编辑:程序博客网 时间:2024/06/02 02:30

ping

这个 ping 是很重要的指令,ping 主要透过ICMP 封包来进行整个网路的状况报告,当然啦,最重要的就是那个 ICMP type 0, 8 这两个类型,分别是要求回报与主动回报网路状态是否存在的特性。要特别注意的是, ping 还是需要透过IP 封包来传送 ICMP 封包的,而 IP 封包里面有个相当重要的 TTL (Time To Live) 属性,这是很重要的一个路由特性,详细的 IP 与 ICMP 表头资料请参考网路基础的详细介绍。

ping 最简单的功能就是传送 ICMP 封包去要求对方主机回应是否存在于网路环境中,上面的回应讯息当中,几个重要的项目是这样的:

  • 64 bytes:表示这次传送的 ICMP 封包大小为 64 bytes 这么大,这是预设值,在某些特殊场合中,例如要搜索整个网路内最大的 MTU 时,可以使用 -s 2000 之类的数值来取代;
  • icmp_seq=0:ICMP 所侦测进行的次数,第一次编号为 0 ;
  • ttl=243:TTL 与 IP 封包内的 TTL 是相同的,每经过一个带有 MAC的节点 (node) 时,例如 router, bridge 时, TTL 就会减少一,预设的 TTL 为 255 ,你可以透过 -t 150 之类的方法来重新设定预设 TTL 数值;
  • time=9.16 ms:回应时间,单位有 ms(0.001秒)及 us(0.000001秒),一般来说,越小的回应时间,表示两部主机之间的网路连线越良好!
如果你忘记加上 -c 3 这样的规定侦测次数,那就得要使用 [ctrl]-c 将他结束掉了!

如果想要了解区网内有多少部主机存活着,那么使用 ping -b broadcast 就能够知道了!而不必一部一部主机来侦测啊!方便~另外也特别注意一下,如果您的主机与待侦测主机并不在同一个网域内,那么 TTL 预设使用 255 ,如果是同一个网域内,那么 TTL 预设则使用 64 喔!看看上面的输出即可了解。

用 ping 追踪最大 MTU 数值

我们由前几章的网路基础里面谈到加大讯框 (frame) 时,对于网路效能是有帮助的,因为封包打包的次数会减少,加上如果整个传输的媒体都能够接受这个 frame 而不需要重新进行封包的拆解与重组的话,那么效能当然会更好,那个修改 frame 大小的参数就是MTU 啦!好了,现在我们知道网路卡的 MTU 可以透过 ifconfig 或者是 ip 等来达成,那么追踪整个网路传输的最大 MTU 时,又该如何查询?呵呵!最简单的方法当然是透过 ping 传送一个大封包,并且不许中继的路由器或 switch 将该封包重组,那就能够处理啦!没错!可以这样的:

不过,你需要知道的是,由于IP 封包表头 (不含 options) 就已经占用了 20 bytes ,再加上 ICMP 的表头有 8 bytes ,所以当然你在使用 -s size 的时候,那个封包的大小就得要先扣除 (20+8=28) 的大小了。因此如果要使用 MTU 为 1500 时,就得要下达‘ ping -s 1472 -M do xx.yy.zz.ip ’才行啊!另外,由于本地端的网路卡 MTU 也会影响到侦测,所以如果想要侦测整个传输媒体的 MTU 数值,那么每个可以调整的主机就得要先使用 ifcofig 或 ip 先将 MTU 调大,然后再去进行侦测,否则就会出现像上面提供的案例一样,可能会出现‘Message too long, mtu=1500’之类的字样喔!至于如果侦测完毕后,想要调整最佳化的 MTU ,那么请参考前一章节的内容来调整啰! ^_^

不过这个 MTU 不要随便调整啊!除非真的有问题。通常调整 MTU 的时间是在这个时候:

  • 因为全部的主机群都是在内部的区网,例如丛集架构 (cluster) 的环境下,由于内部的网路节点都是我们可以控制的,因此可以透过修改 MTU 来增进网路效能;
  • 因为作业系统预设的 MTU 与您的网域不符,导致某些网站可以顺利连线,某些网站则无法连线。以 Windows 作业系统作为连线分享的主机时,在 Client 端挺容易发生这个问题;
如果是要连上 Internet 的主机,注意不要随便调整 MTU ,因为我们无法知道 Internet 上面的每部机器能够支援的 MTU 到多大,因为......不是我们能够管的到的嘛! ^_^

另外,其实每种连线方式都有不同的 MTU 值,常见的各种介面的 MTU 值分别为∶

网路上也有免费帮忙查询 MTU 与传输相关资料的网站,例如底下这个网站:

  • http://forums.speedguide.net:8117/
连接上这个网站之前,请先取消您浏览器上的代理伺服器 (Proxy) 的设定,才能显示出正确的讯息。如果在 Windows 的系统上面想要修改 MTU 值的话,那就得要修改 Windows 的登录档,在 Windows 上面对于 MTU 的侦测与修改的详细作法可以参考微软的官方网站:
  • http://www.microsoft.com/taiwan/msclub/member/TIPS/Spring_2001/tip1to3/tip1to3_2.htm

traceroute
我们前面谈到的指令大多数都是针对主机的网路参数设定所需要的,而 ping 是两部主机之间的回声与否判断,那么有没有指令可以追踪两部主机之间通过的各个节点 (node) 通讯状况的好坏呢?举例来说,如果我们连线到 yahoo 的速度比平常慢,你觉得是 (1)自己的网路环境有问题?(2)还是外部的 Internet 有问题?如果是 (1) 的话,我们当然需要检查自己的网路环境啊,看看是否又有谁中毒了?但如果是 Internet 的问题呢?那只有‘等等等’啊!判断是 (1) 还是 (2) 就得要使用 traceroute 这个指令啦!

这个 traceroute 挺有意思的,这个指令会针对欲连接的目的地之所有 router 进行 ICMP 的逾时等待,例如上面的例子当中,由鸟哥的主机连接到 Yahoo 时,他会经过 12 个节点,traceroute 会主动的对这12 个节点做 ICMP 的回声等待,并侦测回覆的时间,每个节点会侦测三次。所以像上头显示的结果,发现每个节点其实回覆的时间大约在 200 ms 以内,算是还可以的 Internet 环境了。而且由上面的资讯来看,可以看出在 61.58.33.133 这个节点后的传输延迟较久,至于之前的 9 个节点则有不错的表现。透过这种解析,可以让您了解到这条连线是那个环节出了问题喔。

另外,如果在预设的 5 秒钟之内 traceroute 听不到节点的回声,那么荧幕上就会跑出一个‘ * ’的符号,告知该节点无法有顺利的回应。由于我们的 traceroute 用的是 ICMP 封包,有些防火墙或者主机可能会将 ICMP可通过的权力拿掉,因此就会造成等不到回声的状态!另外,有些 gateway 本来就不支援 traceroute 的功能,因此也会产生那个‘ * ’的状况。所以分析时得要注意一下呐!


netstat
如果你觉得你的某个网路服务明明就启动了,但是就是无法造成连线的话,那么应该怎么办?首先你应该要查询一下自己的网路介面所监听的埠口 (port) 来看看是否真的有启动,因为有时候荧幕上面显示的 [OK] 并不一定是 OK 啊! ^_^

netstat 的输出主要分为两大部分,分别是 TCP/IP 的网路介面部分,以及传统的 Unix socket 部分。还记得我们在基础篇里面曾经谈到档案的类型吗?那个 socket 与 FIFO 档案还记得吧?那就是在 Unix 介面用来做为程式资料交流的介面了,也就是上头表格内看到的 Active Unix domain sockets的内容啰~

通常鸟哥都是建议加上‘ -n ’这个参数的,因为可以避过主机名称与服务名称的反查,直接以 IP 及埠口号码 (port number) 来显示,显示的速度上会快很多!至于在输出的讯息当中,我们先来谈一谈关于网路连线状态的输出部分,他主要是分为底下几个大项:

  • Proto:该连线的封包协定,主要为 TCP/UDP 等封包;
  • Recv-Q:非由使用者程式连接所复制而来的总 bytes 数;
  • Send-Q:由远端主机所传送而来,但不具有 ACK 标志的总 bytes 数,意指主动连线 SYN 或其他标志的封包所占的 bytes 数;
  • Local Address:本地端的位址,可以是 IP (-n 参数存在时),也可以是完整的主机名称。如上表我们看到的 IP 格式有两种,一种是 IPv4 的标准,亦即是四组十进位的数字后面加上冒号‘:’后,接着 port number 。一种是 IPv6 ,前面的 IP 加上很多冒号‘:’的格式。我们可以由这个显示的资料看出这个服务是开放在哪一个介面,例如上表当中, port 22 是开放在 0.0.0.0 ,亦即是所有介面都可以连到 port 22 ,至于 port 53 则仅开放在本机的 127.0.0.1 这个介面而已,所以是不对外部介面开放的意思。
  • Foreign Address:远端的主机 IP 与 port number
  • stat:状态列,主要的状态含有:
    • ESTABLISED:已建立连线的状态;
    • SYN_SENT:发出主动连线 (SYN 标志) 的连线封包;
    • SYN_RECV:接收到一个要求连线的主动连线封包;
    • FIN_WAIT1:该插槽服务(socket)已中断,该连线正在断线当中;
    • FIN_WAIT2:该连线已挂断,但正在等待对方主机回应断线确认的封包;
    • TIME_WAIT:该连线已挂断,但 socket 还在网路上等待结束;
    • LISTEN:通常用在服务的监听 port !可使用‘ -l ’参数查阅。
基本上,我们常常谈到的 netstat 的功能,就是在观察网路的连线状态了,而网路连线状态中,又以观察‘我目前开了多少的 port 在等待用户端的连线’以及‘目前我的网路连线状态中,有多少连线已建立或产生问题’最常见。那你如何了解与观察呢?通常鸟哥是这样处理的:

你可以在上面的范例当中发现,我的网路连线仅有对外开放 port 25 以及 port 22 而已 (因为针对 0.0.0.0 开放),至于 port 53 则仅针对内部的 127.0.0.1 来开放,所以是不对 Internet 开放这个服务的喔!而其中 port 22,25 都是使用 TCP 封包,至于 port 53 则是开放在 UDP 封包的状态!再仔细的看,每一行输出的最右边,你可以发现鸟哥的主机 port 22 是由 sshd 这支程式所启动的,并且他的 PID 是 1924 ,看到这边,聪明的您应该知道,‘那我如何关闭这个 port ’吧?使用 kill 或 killall 即可啊! ^_^

看到上头的特殊字体吧?那代表目前已经建立连线的一条网路连线,他是由远端主机 192.168.1.210启动一个大于 1024 的埠口向本地端主机 192.168.1.100 的 port 22 进行连线的一条连线,你必须要想起来的是:‘Client 端是随机取一个大于 1024 以上的 port 进行连线’,此外‘只有 root 可以启动小于 1023 以下的 port ’,那就看的懂上头那条连线啰!如果这条连线你想要砍掉他的话,看到最右边的 30417/sshd 了没? kill 会用吧! ^_^

至于传统的 Unix socket 的资料,记得使用 man netstat 查阅一下吧!这个 Unix socket 通常是用在一些仅在本机上运作的程式所开启的插槽介面档,例如 X Window 不都是在本机上运作而已吗?那何必启动网路的 port 呢?当然可以使用 Unix socket啰,另外,例如 Postfix 这一类的网路伺服器,由于很多动作都是在本机上头来完成的,所以以会占用很多的 Unix socket 喔!


host
这个指令可以用来查出某个主机名称的 IP 喔!举例来说,我们想要知道 tw.yahoo.com 的 IP 时,可以这样做:

瞧!IP 是 202.43.195.52 啊!很简单就可以查询到 IP 了!那么这个 IP 是向谁查询的呢?其实就是写在/etc/resolv.conf那个档案内的 DNS 主机啦!如果不想要使用该档案内的主机来查询,也可以这样做:

会告诉我们所使用来查询的主机是哪一部呐!这样就够清楚了吧?至于更详细的 host 用法,我们会在DNS 主机 那个章节再来好好聊一聊吧!



nslookup
这玩意儿的用途与 host 基本上是一样的,就是用来作为 IP 与主机名称对应的检查,同样是使用 /etc/resolv.conf这个档案来作为 DNS 伺服器的来源选择。

如何,看起来与 host 差不多吧!不过,这个 nslookup 还可以由 IP 找出主机名称喔!例如那个范例二,他的主机名称是: dns.hinet.net 哩!目前大家都建议使用 dig 这个指令来取代 nslookup ,我们会在DNS 伺服器 那时再来好好谈一谈吧!

原创粉丝点击