ping命令背后都发生了什么?

ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。

ping 命令的TT:

图一的TTL = 62,图二的TTL为60

TTL(time to lice)生存时间,就是一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器(权威域名服务器)发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器(各地的缓存服务器,也叫递归域名服务器)中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值

windows 可以在注册表位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255。Windows系统设置后重启才生效。

在搞清楚这个问题之前首先要了解几个基本命令:

如:route arp ifconfig

1、route:查看路由表信息。就是看数据都会经过哪个网关?

一般多网段之间互相通信,希望建立一条优先路由,而不是通过默认网关(默认网关就是数据包不匹配任何设定的路由规则,最后流经的地址关口!网关按字面意思就是网络的关口,就相当于我们家里房子的门一样,如果外出就要经过房门,数据包也是一样。)时就可以配置网络路由。还是拿房子比喻,你现在不是要出门,而是卧室,卫生间,去卧室就要经过卧室的门,去卫生间也要经过卫生间的门,这里的卧室和卫生间的门就可以认为是去往某一网段的路由,而不是默认路由(即房子的门。)

看如下截图:

假如在这台机器上ping 10.56.14.242。比对路由表发现没有一条路由可以发送数据,于是只能走默认网关。于是问题来了。发现网关是10.50.10.254.不在同一个网段。究其原因。10.50是生产网段,需要通过一个物理的防火墙才可以和10.56网段通信。这也是生产必须的必须事项。就好比你访问京东,肯定是经过了一层物理防火墙。这样所有的数据访问痕迹才会被保留,危险的请求才可以被挡住。

因此会选择

0.0.0.0       10.50.10.0    0.0.0.0         UG    0     0    0  bond1 这个路由

这条路由规则,那么ping 包会从bond1 这张网卡发出去。

接下来就要判断目标IP是否在同一个子网了。

用ifconfig命令

前两条是自动生成的,因为是直连的网段,在每块网卡上每配置一个IP就会生成一条记录(一个网卡上可以配置多个IP)。表示去往这两个网段的数据包,直接由网卡接口eth0及eth1发送出去

这两条记录中的gateway并没有意义,Flags那一列中有G时才会使用Gateway。这两条路由并没有这样的标志,由于它们是本地的,匹配这些条目的数据包会直接通过Iface列中的网卡发送出去。

0.0.0.0       10.50.10.0    0.0.0.0         UG    0     0    0  bond1
表示去往所有目标地址数据包由网关10.50.10.0 通过网卡bond1来转发

意思是0.0.0.0代表的是匹配所有目标地址,但注意默认网关的描述the one used when there is not any more specific route available to a destination address,一般路由匹配要符合掩码最长匹配原则,而默认路由的掩码是最短的,它只有在没有其他匹配条目的时候才会被选择

路由掩码最长匹配原则是指IP网络中当路由表中有多条条目可以匹配目的ip时,一般就采用掩码最长的一条作为匹配项并确定下一跳。(也叫最长前缀匹配,是路由器在查找路由表进行选路的算法)

例如:

192.168.20.16/28 e0

192.168.0.0/16 s0

在要查找地址192.168.20.19时,不难发现上述两条都“匹配”,即这两条都包含要查找的目的地址。此时就应该根据最长掩码匹配原则,选择第一条进行匹配(更明确),所以数据包将通过e0发送出去。

2、arp 物理地址解析协议   ---  目的是实现IP地址到MAC地址的转换

ARP详细:http://blog.51cto.com/13570193/2083332

在计算机间通信的时候,计算机要知道目的计算机是谁(就像我们人交流一样,要知道对方是谁),这中间需要涉及到MAC地址,而MAC是真正的电脑的唯一标识符。

为什么需要ARP协议呢?因为在OSI七层模型中,对数据从上到下进行封装发送出去,然后对数据从下到上解包接收,但是上层(网络层)关心的IP地址,下层关心的是MAC地址,这个时候就需要映射IP和MAC。

网络包在物理层传输的时候依赖的mac 地址而不是上面的IP地址,也就是根据mac地址来决定把包发到哪里去。

arp协议就是查询某个IP地址的mac地址是多少,由于这种对应关系一般不太变化,所以每个os都有一份arp缓存(一般15分钟过期),也可以手工清理,下面是arp缓存的内容:

------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------------------

有了上面的基础知识打底,我们来思考一下 ping IP 到底发生了什么。

首先 OS 的协议栈需要把ping命令封成一个icmp包,要填上包头(包括src-IP、mac地址),那么OS先根据目标IP和本机的route规则计算使用哪个interface(网卡),确定了路由也就基本上知道发送包的src-ip和src-mac了。每条路由规则基本都包含目标IP范围、网关、MAC地址、网卡这样几个基本元素。

如果目标IP和本机使用的IP在同一子网

如果目标IP和本机IP是同一个子网(根据本机ifconfig上的每个网卡的netmask来判断是否是同一个子网——知识点:子网掩码的作用),并且本机arp缓存没有这条IP对应的mac记录,那么给整个子网的所有机器广播发送一个 arp查询,比如我ping 1.1.3.42,然后tcpdump抓包首先看到的是一个arp请求:

上面就是本机发送广播消息,10.56.14.242的mac地址是多少?很快10.56.14.242回复了自己的mac地址。 收到这个回复后,先缓存起来,下个ping包就不需要再次发arp广播了。 然后将这个mac地址填写到ping包的包头的目标Mac(icmp包),然后发出这个icmp request包,按照mac地址,正确到达目标机器,然后对方正确回复icmp reply(对方回复也要查路由规则,arp查发送方的mac,这样回包才能正确路由回来,略过)。

来看一次完整的ping 10.56.14.242,tcpdump抓包结果:

如果目标IP不是同一个子网

arp只是同一子网广播查询,如果目标IP不是同一子网的话就要经过本IP网关进行转发(知识点:网关的作用)。如果本机没有缓存网关mac(一般肯定缓存了),恰恰我的网关就没有缓存。ping了一次网关arp缓存才把10.50.10.254的Mac cache进去。那么先发送一次arp查询网关的mac,然后流程跟上面一样,只是这个icmp包发到网关上去了(mac地址填写的是网关的mac)。

从本机10.50.10.151 ping 10.56.14.242的过程,因为不是同一子网按照路由规则匹配,根据route表应该走默认个网关0.0.0.0,如下截图:

  ①首先目标IP 10.56.14.242符合红框里面的默认路由规则,不是同一子网。所以查找路由规则中的网关10.50.10.254的Mac地址。②arp cache中有(一般肯定缓存了),恰恰我的网关就没有缓存。ping了一次网关arp缓存才把10.50.10.254的Mac cache进去。       将  00:00:0c:07:ac:c8填入包中。那么这个icmp request包就发到10.50.10.254上了,虽然包头的mac是00:00:0c:07:ac:c8。但是IP是10.56.14.242.

看看目标IP 10.56.14.242. 真正的mac信息(跟ping包包头的Mac是不同的):

                                       

这个包根据mac地址路由到网关上。

网关接下来怎么办?

为了简化问题,假设两个网关直连

网关收到这个包后(因为mac地址是它的),打开一看IP地址是 10.56.14.242,不是自己的,于是继续查自己的route和arp缓存,发现10.56.14.242这个IP的网关是11.239.163.247,于是把包的目的mac地址改成11.239.163.247的mac继续发出去。

11.239.163.247这个网关收到包后,一看 11.239.161.60是自己同一子网的IP,于是该arp广播找mac就广播,cache有就拿cache的,然后这个包才最终到达目的11.239.161.60上。

整个过程中目标mac地址每一跳都在变,IP地址不变,每经过一次MAC变化可以简单理解成一跳。

实际上可能要经过多个网关多次跳跃才能真正到达目标机器。

目标机器收到这个icmp包后的回复过程一样,略过。

arp广播风暴和arp欺骗

广播风暴:如果一个子网非常大,机器非常多,每次arp查询都是广播的话,也容易因为N*N的问题导致广播风暴。

arp欺骗:同样如果一个子网中的某台机器冒充网关或者其他机器,当收到arp广播查询的时候总是把自己的mac冒充目标机器的mac发给你,然后你的包先走到他,再转发给真正的网关或者目标机器,所以在里面动点什么手脚,看看你发送的内容都还是很容易的。

讲完基础知识再来看开篇问题的答案

读完上面的基础知识相信现在我们已经能够回答 ping IP 后发生了什么。这些已经足够解决99%的程序员日常网络中网络为什么不通的问题了。但是前面的问题比这个要稍微复杂一点,还是依靠这些基础知识就能解决——这是基础知识的威力

猜你喜欢

转载自blog.csdn.net/MyySophia/article/details/81509804