• Linux相关网络知识


    网络参数设置命令
    所有时刻如果你想要做好自己的网络参数设置,包括IP参数、路由参数和无线网络等,就得要了解下面这些相关的命令才行。其中Route及ip这两条命令是比较重要的。当然,比较早期的用法,我们都是使用ifconfig的。
    ? ifconfig:查询、设置网卡和IP网段等相关参数。
    ? ifup、ifdown:这两个文件是Script,通过更简单的方式来启动网络接口。
    ? Route:查询、设置路由表(Route table)。
    ? ip:复合式的命令,能直接修改上述命令提到的功能。
    ifconfig、ifup、ifdown
    这 3个命令的用途都是启动网络接口,不过,ifup和ifdown仅就 /etc/sysconfig/network- scripts内的ifcfg-ethx(x为数字)进行启动或关闭的操作,并不能直接修改网络参数,除非手动调整ifcfg-ethx文件才行。至于 ifconfig则能直接手动给予某个接口IP或调整其网络参数。下面我们就分别来谈一谈。
    1. ifconfig
    ifconfig主要是能手动启动、观察和修改网络接口的相关参数,能修改的参数非常多,包括IP参数及MTU等都能修改,他的语法如下:
    [root@linux ~]# ifconfig {interface} {up|down}
    一 般来说,直接输入ifconfig就会列出目前已被启动的卡,不论这个卡是否有设置IP,都会被显示出来。而如果是输入ifconfig eth0,则会显示出这个接口的相关数据,而不管该接口是否启动。所以,如果你想要知道某个网卡的Hardware Address,直接输入“ifconfig"网络接口代号"”即可。至于上述代码中出现的各项数据是这样的(数据排列由上而下、由左而右)。
    ? eth0:网卡的代号,也有lo这个loopback。
    ? HWaddr:网卡的硬件地址,习惯称为MAC。
    ? inet addr:IPv4的IP地址,后续的Bcase、Mask分别代表的是Broadcast和Netmask。
    ? inet6 addr:是IPv6的版本的IP,我们没有使用,所以略过。
    ? RX:那一行代表的是网络由启动到目前为止的数据包接收情况,packets代表数据包数、errors代表数据包发生错误的数量、dropped代表数据包由于有问题而遭丢弃的数量等。
    ? TX:和RX相反,为网络由启动到目前为止的传送情况。
    ? collisions:代表数据包碰撞的情况,如果发生太多次,表示你的网络状况不太好。
    ? txqueuelen:代表用来传输数据的缓冲区的储存长度。
    ? RX Bytes、TX Bytes:总传送、接收的字节总量。
    ? Interrupt、Memory:网卡硬件的数据,IRQ岔断和内存地址。
    通过观察上述的资料,大致上能了解到你的网络情况,尤其是RX、TX内的error数量,及是否发生严重的collision情况,都是需要注意的。
    范例二:暂时修改网络接口
    [root@linux ~]# ifconfig eth0 192.168.100.100
    # 如果不加所有其他参数,则系统会依照该 IP 所在的 class 范围,
    # 自动地计算出 netmask 及 network, broadcast 等 IP 参数
    [root@linux ~]# ifconfig eth0 192.168.100.100 netmask 255.255.255.128 \
    > mtu 8000
    # 设置网络接口,同时设置 MTU 的数值
    [root@linux ~]# ifconfig eth0 MTU 9000
    # 仅修改该接口的 MTU 数值,其他的保持不动
    [root@linux ~]# ifconfig eth0:0 192.168.50.50
    # 仔细看那个接口, eth0:0 。那就是在该网络接口上,再仿真一个网络接口,
    # 亦即是在一个网卡上面设置多个 IP 的意思啦
    [root@linux ~]# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2
    inet addr:192.168.10.100 Bcast:192.168.10.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:3669 errors:0 dropped:0 overruns:0 frame:0
    TX packets:2892 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:667547 (651.9 KiB) TX bytes:584799 (571.0 KiB)
    Interrupt:209 Memory:fb000000-0
    eth0:0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2
    inet addr:192.168.200.2 Bcast:192.168.200.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    Interrupt:209 Memory:fb000000-0
    # 仔细看,是否和硬件有关的信息都相同。没错。因为是同一个网卡。
    [root@linux ~]# ifconfig eth0:0 down
    # 关掉 eth0:0 这个接口。如果想要启动 eth1 ,并且不设置所有网络参数
    # ifconfig eth1 up 就能实现
    [root@linux ~]# /etc/init.d/network restart
    # 刚刚设置的数据全部失效,会以 ifcfg-ethx 的设置为主
    使 用ifconfig能暂时用手动来设置或修改某个适配卡的相关功能,并且也能通过eth0:0这种虚拟的网络接口来设置一张网卡上面的多个IP。手动的方 式是比较简单。而且设置错误也没有关系,因为我们能利用 /etc/init.d/network restart来重新启动整个网络接口,那么之前手动的设置数据会全部失效。另外,要启动某个网络接口,但又不让他具有IP参数时,直接给他 ifconfig eth0 up即可。这个操作经常在无线网卡当中进行,因为我们需要启动无线网卡让他去检测AP存在和否。
    2. ifup、ifdown
    实时地手动修改一些网络接口参数,能利用ifconfig来实现,如果是要直接以设置文件,亦即是在 /etc/sysconfig/network-scripts里面的ifcfg-ethx等文件的设置参数来启动的话,那就得要通过ifdown或ifup来实现了。
    [root@linux ~]# ifup {interface}
    [root@linux ~]# ifdown {interface}
    [root@linux ~]# ifup eth0
    ifup 和ifdown真是太简单了。这两个程式其实是script而已,他会直接到 /etc/ sysconfig/network-scripts目录下搜索对应的设置文件,例如ifup eth0,他会找出ifcfg-eth0这个文件的内容,然后加以设置。关于ifcfg-eth0的设置请参考前一章连上Internet的说明。
    不 过,由于这两个程式主要是搜索设置文件(ifcfg-ethx)来进行启动和关闭的,所以在使用前请确定ifcfg-ethx是否真的存在于正确的目录 内,否则会启动失败。另外,如果以ifconfig eth0来设置或是修改了网络接口后,就无法再以ifdown eth0的方式来关闭了。因为ifdown会分析比较目前的网络参数和ifcfg-eth0是否相符,不符的话,就会放弃这次操作。因此,使用 ifconfig修改完毕后,应该要以ifconfig eth0 down才能够关闭该接口。
    路由修改route
    我们在网络基础的时候谈过关于路由的问题,两台主机之间一定要有路由才能够互通TCP/IP的协议,否则就无法进行联机。一般来说,只要有网络接口,该接口就会产生一个路由,例如,在鸟哥实验室内部的主机有一个eth0及lo,所以:
    [root@linux ~]# route [-nee]
    [root@linux ~]# route add [-net|-host] [网段或主机] netmask [mask] [gw|dev]
    [root@linux ~]# route del [-net|-host] [网段或主机] netmask [mask] [gw|dev]
    观察的参数:
    -n,不要使用通信协议或主机名称,直接使用 IP 或 Port Number;
    -ee,使用更周详的信息来显示;
    增加 (add) 和删除 (del) 路由的相关参数;
    -net,表示后面接的路由为一个网段;
    -host,表示后面接的为连接到单台主机的路由;
    Netmask,和网段有关,能设置 netmask 决定网段的大小;
    Gw,gateway 的简写,后续接的是 IP 的数值,和 dev 不同;
    Dev,如果只是要指定由哪一块网卡联机出去,则使用这个设置,后面接 eth0 等。
    范例一:单纯的观察路由状态
    [root@linux ~]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
    0.0.0.0 192.168.10.30 0.0.0.0 UG 0 0 0 eth0
    [root@linux ~]# route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
    169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
    default Server.cluster 0.0.0.0 UG 0 0 0 eth0
    在 上面的例子中仔细观察route和route -n的输出结果,你能发现有加-n参数的主要是显示出IP,至于使用route,显示的则是“主机名称”。也就是说,在默认的情况下,route会去找出 该IP的主机名称,如果未找到呢?就会显示得迟钝(有点慢),所以说,鸟哥通常都直接使用route-n了。由上面看起来,我们也知道default = 0.0.0.0/0.0.0.0,而上面的信息有哪些你需要知道的呢?
    ? Destination、Genmask:这两个术语就分别是Network和Netmask了。所以这两个东西就组合成为一个完整的网段了。
    ? Gateway:该网段是通过哪个Gateway连接出去的?如果显示0.0.0.0表示该路由是直接由本机传送,亦即能通过局域网的MAC直接传输;如果有显示IP的话,表示该路由需要经过路由器(网关)的帮忙才能够传送出去。
    ? Flags:总共有多个标记,代表的意义如下。
    Ø U(route is up):该路由是启动的。
    Ø H(target is a host):目标是一台主机(IP)而非网段。
    Ø G(use gateway):需要通过外部的主机来传递数据包。
    Ø R(reinstate route for dynamic routing):使用动态路由时,恢复路由信息的标记。
    Ø D(dynamically installed by daemon or redirect):已由服务器或转port功能设置为动态路由。
    Ø M(modified from routing daemon or redirect):路由已被修改了。
    Ø!(reject route):这个路由将不会被接受(用来阻止不安全的网段)。
    ? Iface:这个路由传递数据包的接口。
    此 外,观察一下上面的路由排列顺序,依序是由小网段(192.168.10.0/24是Class C),逐渐到大网段(169.254.0.0/16 是Class B),最后则是默认路由(0.0.0.0/0.0.0.0)。然后当我们要判断某个网络数据包应该怎么传送的时候,该数据包会经由这个路由的过程来判断。 例如,我上头仅有三个路由,若我有一个传往192.168.10.20的数据包要传递,那首先会找192.168.10.0/24这个网段的路由,找到 了,就直接由eth0传送出去。
    如果是传送到Yahoo的主机呢?Yahoo的主机IP是202.43.195.52,我通过判断不是 192.168.10.0/24,也不是169.254.0.0/16,结果到达0/0时,传出去了,通过eth0将数据包传给 192.168.10.30那台Gateway主机。所以说,路由是有顺序的。
    因此当你重复设置多个同样的路由时,例如,在你的主机上的两张网卡设置为相同网段的IP时,会出现什么情况?会出现如下的情况:
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
    也就是说,由于路由是依照顺序来排列和传送的,所以不论数据包是由哪个接口(eth0、eth1)所接收,都会由上述的eth0传送出去,所以,在一台主机上面设置两个相同网段的IP本身没有什么意义。多此一举。除非是类似虚拟主机(Xen、VMware等软件)所架设的多主机,才会有这个必要。
    范例二:路由的增加和删除
    [root@linux ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0
    # 上面这个操作能删除掉 169.254.0.0/16 这个网段
    # 请注意,在删除的时候,需要将路由表上面出现的信息都写入
    # 包括netmask、dev 等参数
    [root@linux ~]# route add -net 192.168.100.0 \
    > netmask 255.255.255.0 dev eth0
    # 通过 route add 来增加一个路由。请注意,这个路由必须能够和你互通
    # 例如,如果我下达下面的命令就会显示错误:
    # route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.200.254
    # 因为我的环境内仅有 192.168.10.100 这个 IP ,所以不能和 192.168.200.254
    # 这个网段直接使用 MAC 互通
    [root@linux ~]# route add default gw 192.168.10.30
    # 增加默认路由的方法。请注意,只要有一个默认路由就够了
    # 在这个地方如果你随便设置后,记得使用下面的命令重新设置你的网络
    # /etc/init.d/network restart
    如 果是要进行路由的删除和增加,那就能参考上面的例子了,其实,使用man route里面的信息就非常丰富了。仔细查阅一下。你只要记得,当出现“SIOCADDRT: Network is unreachable”这个错误时,肯定是由于gw后面接的IP无法直接和你的网段沟通(Gateway并不在你的网段内),所以,赶紧检查一下输入的 信息是否正确。
    ip
    这里的ip是个命令,不是那个TCP/IP的IP。这个ip命令的功能可多了。基 本上,他就是集合了ifconfig和route这两个命令了,不过ip能实现的功能却又多得多,真是个相当厉害的命令。如果你有兴趣的话,请自行vi /sbin/ifup,就知道整个ifup就是利用ip这个命令来实现的。好了,怎么使用呢?让我们来看看。
    [root@linux ~]# ip [option] [操作] [命令]
    参数:
    Option,设置的参数,主要有:
    -s,显示出该设备的统计数据(statistics),例如总接受数据包数等;
    操作,亦即是能针对哪些网络参数进行操作,包括有:
    Link,关于设备(device) 的相关设置,包括MTU、MAC 地址等等
    addr/address,关于额外的 IP 协议,例如多 IP 的实现等等;
    route,和路由有关的相关设置
    由上面的语法我们能知道,ip除了能设置一些基本的网络参数之外,还能够进行额外的IP协议,包括多IP的实现,真是太完美了。下面我们就分3个部分(link、addr、route)来介绍这个ip命令吧。
    1. 关于设备接口(device)的相关设置:ip link
    ip link能设置和设备(device)有关的相关设置,包括MTU及该网络接口的MAC等,当然也能启动(up)或关闭(down)某个网络接口了。整个语法是这样的:
    [root@linux ~]# ip [-s] link show mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
    3: sit0: mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
    [root@linux ~]# ip -s link show eth0
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
    RX: bytes packets errors dropped overrun mcast
    484011792 2247372 0 0 0 0
    TX: bytes packets errors dropped carrier collsns
    2914104290 2867753 0 0 0 0
    使 用ip link show能显示出整个设备接口的硬件相关信息,如上所示,包括网卡地址(MAC)、MTU等,比较有趣的应该是那个sit0的接口了,那个sit0的接口 是用在IPv4及IPv6的数据包转换上的,对于我们仅使用IPv4的网络是没有作用的。lo及sit0都是主机内部所自行设置的。而如果加上 -s的参数后,则这个网卡的相关统计信息就会被列出来,包括接收(RX)及传送(TX)的数据包数量等,周详的内容和ifconfig输出的结果是相同 的。
    范例二:启动、关闭和设置设备的相关信息
    [root@linux ~]# ip link set eth0 up
    # 启动 eth0 这个设备接口。
    [root@linux ~]# ip link set eth0 down
    # 就关闭啊。简单得要命
    [root@linux ~]# ip link set eth0 mtu 1000
    # 更改 MTU 的值,实现 1000 bytes,单位就是 bytes
    使用ifconfig也能更新网卡的MTU,没什么不相同的地方,不过,如果是要更改网卡代号、MAC地址的信息的话,那可就得使用ip了。不过,设置前得要先关闭该网卡,否则会不成功。如下所示:
    范例三:修改网卡代号、MAC 等参数
    [root@linux ~]# ip link set eth0 name vbird
    SIOCSIFNAME: Device or resource busy
    # 因为该设备目前是启动的,所以不能这样设置。你应该这样做:
    [root@linux ~]# ip link set eth0 down mtu 900 qdisc pfifo_fast qlen 1000
    link/ehter 00:40:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff
    # 怕了吧?连网卡代号都能改动。不过,玩玩后记得改回来
    # 因为我们的 ifcfg-eth0 还是使用原本的设备代号。避免有问题,要改回来
    [root@linux ~]# ip link set vbird name eth0
    在这个设备的硬件相关信息设置上面,包括MTU、MAC及传输的模式等,都能在这里设置。有趣的是那个address的项目后面接的可是硬件地址(MAC)而不是IP。非常容易搞错。切记切记。更多的硬件参数能使用man ip查阅一下和ip link有关的设置。
    2. 关于额外的IP相关设置:ip address
    如果说ip link是和OSI七层协议的第二层数据链路层有关的话,那么IP address(IP addr)就是和第三层网络层有关的参数了。主要是在设置和IP有关的各项参数,包括netmask、broadcast等。
    [root@linux ~]# ip address show mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::250:fcff:fe22:9acb/64 scope link
    valid_lft forever preferred_lft forever
    3: sit0: mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
    看到上面那个特别的字体吗?没错,那就是IP参数,也是ip address最主要的功能。下面我们进一步来新增虚拟的网络接口看看:
    范例二:新增一个接口,名称假设为 eth0:vbird
    [root@linux ~]# ip address add 192.168.50.50/24 broadcast + \
    > dev eth0 label eth0:vbird
    [root@linux ~]# ip address show eth0
    2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:40:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
    inet 192.168.50.50/24 brd 192.168.50.255 scope global eth0:vbird
    inet6 fe80::240:d0ff:fe13:c346/64 scope link
    valid_lft forever preferred_lft forever
    # 看到上面的特别字体了吧?多出了一行新的接口,且名称是 eth0:vbird
    # 至于那个 broadcast + 也能写成 broadcast 192.168.50.255
    [root@linux ~]# ifconfig
    eth0:vbir Link encap:Ethernet HWaddr 00:40:D0:13:C3:46
    inet addr:192.168.50.50 Bcast:192.168.50.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    Interrupt:5 Base address:0x3e00
    # 如果使用 ifconfig 就能够看到这个怪东西
    范例三:将刚才的接口删除
    [root@linux ~]# ip address del 192.168.50.50/24 dev eth0
    # 删除就比较简单
    3. 关于路由的相关设置:ip route
    这个项目当然就是路由的观察和设置了。事实上,ip route的功能几乎和route命令差不多,不过,他还能进行额外的参数设计,例如MTU的规划等,功能相当强大。
    [root@linux ~]# ip route show
    如上述代码所示,最简单的功能就是显示出目前的路由信息,其实跟route命令相同,只是需要注意几个小细节:
    ? proto:此路由的路由协议,主要有Redirect、Kernel、Boot、Static、Ra等,其中Kernel指的是直接由核心判断自动设置。
    ? scope:路由的范围,主要是link,即是和本设备有关的直接联机。
    再来看一下怎么进行路由的增加和删除吧。
    范例二:增加路由,主要是本机直接可沟通的网段
    [root@linux ~]# ip route add 192.168.5.0/24 dev eth0
    # 针对本机直接沟通的网段设置好路由,不必通过外部的路由器
    [root@linux ~]# ip route show
    192.168.5.0/24 dev eth0 scope link
    ……以下省略……
    范例三:增加能通往外部的路由,需通过 router
    [root@linux ~]# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0
    [root@linux ~]# ip route show
    192.168.5.0/24 dev eth0 scope link
    ……其他省略……
    192.168.10.0/24 via 192.168.5.100 dev eth0
    # 仔细看,因为我有 192.168.5.0/24 的路由存在 (我的网卡直接联系),
    # 所以才能将 192.168.10.0/24 的路由丢给 192.168.5.100
    # 那台主机来帮忙传递。和之前提到的 route 命令是相同的限制。
    范例四:增加默认路由
    [root@linux ~]# ip route add default via 192.168.1.2 dev eth0
    # 那个 192.168.1.2 就是我的默认路由器 (gateway) 的意思
    # 真的记得,只要一个默认路由就 OK 。
    范例五:删除路由
    [root@linux ~]# ip route del 192.168.10.0/24
    [root@linux ~]# ip route del 192.168.5.0/24
    事 实上,这个ip的命令实在是太博大精深了。刚接触Linux网络的朋友,可能会有点晕,没有关系。你先会使用ifconfig、ifup、ifdown和 route即可,等以后有了经验之后,再继续回来用ip吧。有兴趣的话,也能自行参考ethtool命令(man ethtool)。
    iwlist、iwconfig
    这两个命令需要你有无线网卡才能够进行使用。其用法如下:
    ? iwlist:利用无线网卡进行无线AP的检测和取得相关的数据。
    ? iwconfig:设置无线网卡的相关参数。
    5.1.5 dhClient
    如 果你是使用DHCP协议在局域网内取得IP的话,那么是否一定要去编辑ifcfg-eth0内的BOOTPROTO呢?有个更快速的做法,就是利用 dhClient这个命令。因为这个命令才是真正发送DHCP请求的。如果不考虑其他的参数,他的用法非常简单,使用下面的方法即可:
    [root@linux ~]# dhClient eth0
    非常简单吧。这样就能即时让我们的网卡以DHCP协议去尝试取得IP。不过在SuSE Distribution里面,他仅有dhcpcd这个程式,他和dhClient是相同的东西。
    ping
    这 个ping是非常重要的命令,ping主要通过ICMP数据包来进行整个网络的状况报告,当然,最重要的就是ICMP type 0、8这两个类型,分别是需求回报和主动回报网络状态是否存在的特性。要特别注意的是,ping需要通过IP数据包来传送ICMP数据包,而IP数据包里 有个相当重要的TTL(Time To Live)属性,这是个非常重要的路由特性,周详的IP和ICMP表头数据请参考网络基础的周详介绍。
    [root@linux ~]# ping [-bcstnM] IP
    参数:
    -b,后面接的是 broadcast 的 IP,用在你“需要对整个网段的主机进行 ping ”时;
    -c,后面接的是执行 ping 的次数,例如 -c 5 ;
    -n,不进行 IP 和主机名称的反查,直接使用 IP ;
    -s,发送出去的 ICMP 数据包大小,默认为 56(bytes),再加 8 bytes 的 ICMP 表头资料。
    -t,TTL 的数值,默认是 255,每经过一个节点就会少
    -M [do|dont] :主要在检测网络的 MTU 数值大小,两个常见的项目是:
    do,代表传送一个 DF (Don’t Fragment) 旗标,让数据包不能重新拆包和打包;
    dont,代表不要传送 DF 标记,表示数据包能在其他主机上拆包和打包。
    范例一:检测一下 168.95.1.1 这部 DNS 主机是否存在?
    [root@linux ~]# ping -c 3 168.95.1.1
    PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
    64 bytes from 168.95.1.1: icmp_seq=0 ttl=243 time=9.16 ms
    64 bytes from 168.95.1.1: icmp_seq=1 ttl=243 time=8.98 ms
    64 bytes from 168.95.1.1: icmp_seq=2 ttl=243 time=8.80 ms
    --- 168.95.1.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
    rtt min/avg/max/mdev = 8.807/8.986/9.163/0.164 ms, pipe 2
    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就会减少1,默认的TTL为255,你能通过 -t 150之类的方法来重新设置默认TTL数值。
    ? time=9.16 ms:响应时间,单位有ms(0.001秒)及µs(0.000001秒),一般来说,响应时间越小,表示两台主机之间的网络联机越良好。
    如果你忘记加上 -c 3这样的规定检测次数,那就得要使用 [ctrl]-c将他结束掉了。
    范例二:针对整个网段进行 ping 的追查
    [root@linux ~]# ping -c 3 -b 192.168.10.255
    WARNING: pinging broadcast address
    如 果想要了解网内有多少台主机存活着,那么使用ping -b broadcast就能够知道了。而不必一台一台主机来检测。另外要特别注意一下,如果你的主机和待检测主机并不在同一个网段内,那么TTL默认使用 255,如果是同一个网段内,那么TTL默认则使用64。看看上面的输出即可明白。
    我们在前几章的网络基础里面谈到加大帧(frame)时,对于 网络性能是有帮助的,因为数据包打包的次数会减少,加上如果整个传输的媒介都能够接受这个frame而不必重新进行数据包的拆解和重组的话,那么性能当然 会更好,修改frame大小的参数就是MTU。好了,目前我们知道网卡的MTU能通过ifconfig或是ip等来实现,那么追踪整个网络传输的最大 MTU时,又该怎么查询?最简单的方法当然是通过ping传送一个大数据包,并且不许中继的路由器或Switch将该数据包重组,这就能够处理了:
    范例三:找出最大的 MTU 数值
    [root@linux ~]# ping -c 2 -s 1000 -M do 192.168.10.10
    PING 192.168.10.10 (192.168.10.10) 1000(1028) bytes of data.
    1008 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.424 ms
    # 如果有响应,那就是能接受这个数据包,如果无响应,那就表示这个 MTU 太大了
    [root@linux ~]# ping -c 2 -s 8000 -M do 192.168.10.10
    PING 192.168.10.10 (192.168.10.10) 8000(8028) bytes of data.
    ping: local error: Message too long, mtu=1500
    # 这个错误信息是说,本地端的 MTU 才到 1500 而已,你要检测 8000 的 MTU
    # 根本就是无法实现的。那怎么是好?用前一小节介绍的 ip link 来进行 MTU 设置吧
    不 过,你需要知道的是,由于IP数据包表头(不含options)已占用了20Bytes,再加上ICMP的表头有8Bytes,所以当然你在使用 -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和你的网段不符,导致某些网站能顺利联机,某些网站则无法联机。以视窗系统操作系统作为联机分享的主机时,在Client端挺容易发生这个问题。
    如果是要连上Internet的主机,注意不要随便调整MTU,因为我们无法知道Internet上面的每台机器能够支持的MTU到多大,因为这些也不是我们能够管得到的。
    另外,其实每种联机方式都有不同的MTU值,常见的各种接口的MTU值如表5-1所示。
    表5-1 常见的各种接口的MTU值
    网络接口
    MTU
    Ethernet
    1500
    PPPoE
    1492
    Dial-up(Modem)
    576
    网络上也有免费帮忙查询MTU和传输相关数据的网站,例如下面这个网站:
    http://forums.speedguide.net:8117/
    连接上这个网站之前,请先取消你浏览器上的代理服务器(Proxy)的设置,才能显示出正确的信息。如果在视窗系统的系统上想要修改MTU值的话,那就得要修改视窗系统的日志文件,在视窗系统上面对于MTU的检测和修改的周详做法能参考微软的官方网站:
    http://www.microsoft.com/taiwan/msclub/member/TIPS/Spring_2001
    /tip1to3/tip1to3_2.htm
    traceroute
    我 们前面谈到的命令大多数都是针对主机的网络参数设置所需要的,而ping是两台主机之间的回应和否的判断,那么有没有命令能追踪两台主机之间通过的各个节 点(Node)通信状况的好坏呢?如果我们联机到yahoo的速度比平常慢,你觉得是自己的网络环境有问题,还是外部的Internet有问题?如果是前 者的话,我们当然需要检查自己的网络环境,看看究竟是谁中毒了?但如果是Internet的问题呢?那只有“等等等”了。判断是这个问题就得要使用 traceroute这个命令。
    [root@linux ~]# traceroute [-nwig] IP
    参数:
    -n,能不必进行主机的名称解析,只用 IP ,速度较快。
    -w,若对方主机在几秒钟内没有回声就宣告不治...默认是 5 秒。
    -i,用在比较复杂的环境,如果你的网络接口非常多非常复杂时,才会用到这个参数。
    例如,你有两条 ADSL 能连接到外部,那你的主机会有两个 ppp。
    你能使用 -i 来选择是 ppp0 还是 ppp1 啦。
    -g,和 -i 的参数相仿,只是 -g 后面接的是 gateway 的 IP 。
    范例一:
    [root@linux ~]# traceroute -n tw.yahoo.com
    traceroute to tw.yahoo-ap1.akadns.net (203.84.202.164), 30 hops max,
    38 byte packets
    1 61.59.121.1 42.174 ms 41.690 ms 41.058 ms
    2 139.175.172.2 40.962 ms 41.978 ms 40.973 ms
    3 192.72.122.130 40.983 ms 41.930 ms 41.003 ms
    4 139.175.58.210 42.956 ms 41.997 ms 42.337 ms
    5 139.175.58.153 47.591 ms 47.972 ms 48.748 ms
    6 139.175.56.30 48.193 ms 47.970 ms 47.986 ms
    7 139.175.57.94 47.959 ms 47.951 ms 47.985 ms
    8 139.175.56.138 48.363 ms 47.586 ms 47.995 ms
    9 139.175.58.42 49.256 ms 50.668 ms 47.490 ms
    10 61.58.33.133 201.882 ms 201.565 ms 200.973 ms
    11 61.58.33.50 199.910 ms 199.019 ms 198.961 ms
    12 203.84.200.226 202.391 ms 202.567 ms 209.283 ms
    这 个traceroute挺有意思的,这个命令会针对你想要连接的目的地的所有Router进行ICMP的超时等待,例如上面的例子当中,由鸟哥的主机连接 到Yahoo时,他会经过12个节点,traceroute会主动对这12个节点做ICMP的回应等待,并检测回复的时间,每个节点会检测三次。所以像上 面显示的结果,发现每个节点其实回复的时间大约在200 ms以内,算是Internet的环境还能了。而且由上面的信息来看,在61.58.33.133这个节点后的传输延迟较久,至于之前的9个节点则有不错 的表现。通过这种分析,能让你了解到这条联线是哪个环节出了问题。
    另外,如果在默认的5秒钟之内traceroute听不到节点的回应,那么屏幕 上就会出现一个“*”的符号,告知该节点无法有顺利的响应。由于我们的traceroute用的是ICMP数据包,有些防火墙或主机可能会将ICMP数据 包扔掉,因此就会造成等不到回应的状况。另外,有些Gateway本来就不支持traceroute的功能,因此也会产生“*”的状况,所以分析时要注意 一下。
    nslookup
    这条命令的用途和host基本上是相同的,就是用来作为IP和主机名称对应的检查,同样是使用 /etc/resolv.conf这个文件作为DNS服务器的来源选择。
    [root@linux ~]# nslookup [-query=[type]] [hostname|IP]
    参数:
    -query=type:查询的类型,除了传统的 IP 和主机名称对应外,DNS 更有非常多信息
    所以我们能查询非常多不同的信息,包括mx、cname 等
    例如: -query=mx 的查询方法。
    范例一:找出 www.google.com.tw 的 IP
    [root@linux ~]# nslookup www.google.com.tw
    Server: 168.95.1.1
    Address: 168.95.1.1#53
    Non-authoritative answer:
    www.google.com.tw canonical name = www.google.com.
    www.google.com canonical name = www.l.google.com.
    Name: www.l.google.com
    Address: 64.233.189.104
    范例二:找出 168.95.1.1 的主机名称
    [root@linux ~]# nslookup 168.95.1.1
    Server: 168.95.1.1
    Address: 168.95.1.1#53
    1.1.95.168.in-addr.arpa name = dns.hinet.net.
    怎么,看起来和host差不多吧。不过,这个nslookup还能通过IP找出主机名称。例如,那个范例二,他的主机名称是:dns.hinet.net。目前大家都建议使用dig这个命令来取代nslookup
    Telnet
    Telnet 是早期个人计算机连接到服务器主机上工作时最重要的一个软件了。他不仅能直接连接到服务器上,还能用来连接BBS呢。非常棒!不过,Telnet本身的数 据在传送的时候是使用明文(原始的数据,没有加密),所以数据在Internet上面跑的时候,会比较危险一点(就怕被别人监听)。更周详的内容我们会在 “远程联机服务器”章节里做介绍的。
    [root@linux ~]# Telnet [host|IP] [port]
    范例一:连接到成大梦之大地这个 BBS 站
    [root@linux ~]# Telnet bbs.dorm.ncku.edu.tw
    bbs.ccns.ncku.edu.tw ⊙
    ⊙ 140.116.250.3 [DreamBBS Ver.040223]
    欢迎光临。系统负载:0.16 0.16 0.16 [负载正常]
    ?─┼────┼─? ?? ┌┤梦之大地├────────────┐
    ?──┬──┬──??───┴┴───┬? │ │
    ?──┴──┴──? │ │ 梦之大地由 │
    ?────────? ?─? │ 【计算机网络爱好社‧CCNS】 │
    ?───┬───? ?──? │ 维护管理 │
    │ │ ?─? │ │
    ?───┴───? ?┴───────? └───────────┤By BenHe├┘
    ┌┤本站站长群├────────┐ ? ? ? ?
    │站长: billcho │ ?────┼────??─┼─?┼──┼?
    │系统: cat │ │ │ │ ││
    │站务: muwell ianwolf │ ??? │ │ ││
    │ renn999 GG │ ?? ?? │ │ │?
    │ │ ?? ?? │? │
    └───────────────┘ ?? ?─??─┴? ?───?
    参观用账号:guest,申请新账号:new。目前在线人数 [2183/5000] 人。
    请输入代号:
    如 上所示,我们能通过Telnet轻易地连接到BBS上面,而如果你的主机有开启Telnet服务的话,同样地利用Telnet IP并且输入账号和密码 之后,就能够登录主机了。另外,在Linux上的Telnet软件还提供了Kerberos的认证方式,有兴趣的话请自行参阅man Telnet的说明。
    除了连接到服务器及连接到BBS站之外,Telnet还能用来连接到某个port(服务)上。例如,我们能用Telnet连接到port 110,看看这个port是否正确启动了。
    范例二:检测本机端的port 110 是否正确启动?
    [root@linux ~]# Telnet localhost 110
    Trying 127.0.0.1...
    Telnet: connect to address 127.0.0.1: Connection refused
    # 如果出现这样的信息,代表这个 port 没有启动或是这个联机有问题
    # 因为你看到那个 refused
    [root@linux ~]# Telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is ’_]’.
    220 vbird.vbird.idv.tw ESMTP Postfix
    ehlo localhost
    250-linux.dm.tsai
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250 8BITMIME
    quit
    221 Bye
    Connection closed by foreign host.
    根 据输出的结果,我们就能够知道这个通信协议(Port Number提供的通信协议功能)是否已成功地启动了。而每个port所监听的服务都有其特别的命令,例如,上述的port 25就是本机接口提供的电子邮件服务,那个服务所支持的命令就如同上面使用的数据相同,不过其他的port就不见得支持这个ehlo命令,因为不同的 port有不同的程式嘛,当然支持的命令就不同了
    FTP
    常常会听到FTP这个服务。如果你想要下载Linux的光盘烧录映象文件时,能到FTP网站,他们都是FTP提供者啊。那我们要怎么去下载呢?当然就是通过FTP的客户端软件了。在Linux下面,我们能通过FTP这个软件,也能通过下一小节会提到的LFTP软件。
    [root@linux ~]# FTP [-p] [host|IP] [port]
    参数:
    -p :启动被动式模式 (passive、PASV);
    范例一:联机看看
    [root@linux ~]# FTP FTP.isu.edu.tw
    Connected to FTP.isu.edu.tw (140.127.177.17).
    220-欢迎光临义守大学文件服务器
    220-
    220-本站提供以下软件可供下载:
    220-********************************************************************
    220-/pub/BeOS/ BeOS 操作系统
    220-/pub/Linux/ Linux 操作系统
    ....(其他省略)....
    220-********************************************************************
    Name (FTP.isu.edu.tw:dmtsai): anonymous
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    FTP>
    FTP> help cd /pub dir get file mget file put file delete file mkdir dir lcd /home passive binary
    FTP其实是个非常麻烦的协议,因为他使用两个port分别进行命令和数据的通信,周详的内容我们会在后续的FTP 服务器内详谈,这里我们先简单介绍一下怎么使用FTP这个软件。首先当然需要登录了,所以在上面的代码中填入账号和密码。由于提供匿名登录,而匿名登录者 的账号就是anonymous,所以直接填写那个账号即可。如果是私人的FTP,可能需要提供一组完整的账号和密码。
    登录FTP主机后,就能够使 用FTP软件的功能进行上传和下载的操作,几个常用的FTP内命令如上述代码所示,不过,鸟哥建议你能连到大学的FTP网站后,使用help(或问号 ?)来查询可用的命令,然后尝试下载以测试使用一下这个命令吧。这样以后没有浏览器的时候,你也能直接连接下载FTP了。
    另外,如果由于某些原因,让你的FTP主机的port开在非正规的端口,那你就能利用下面的方式来连接到该台主机。
    [root@linux ~]# FTP hostname 318
    # 假设对方主机的 FTP 服务开启在 318 这个 port 。

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/jeasonrun/p/4212915.html
Copyright © 2020-2023  润新知