“房东,我ping不通了”,相信在外打工租房的各位都有过这个经历吧。ping不通,一个简单的现象,其实蕴藏着很多的过程,今天我们就来谈谈,ping不通该怎么办。
在说这些之前,先介绍几个概念:
1、ping包
ping包走的是ICMP协议,什么是ICMP协议呢,Internet控制报文协议,字面意思不好理解,作用很简单,就是发送一些控制消息,来检测链路。
要了解一个协议,我们一般先看它是怎么封装的,查什么书籍都是假的,最好的办法就是自己去抓一个包看看,抓包的工具有很多种,我喜欢用wireshark(windows)和tcpdump(linux),抓包工具怎么用,自行去度娘
抓到的报文如下,一步步慢慢分析:
首先是以太头
我们知道,MAC地址是用来唯一标识网卡的,暂时理解为网卡门牌号吧。
DMAC:目的mac,也就是你的数据包要发给谁,
SMAC:源mac,你自己网卡的门牌号
type:数据包的类型
tips:小知识,这里插一句,如果是三层转发,DMAC一般是你网关的mac地址,如果是二层转发,DMAC则是目的端的MAC地址,这也是区分一个数据包是二层还是三层转发最好的方法
IP层,主要看几个吧
dscp:最大的用处就是区分报文优先级,我们都知道,协议报文需要高优先级
flags:分片的标志,下面的fragment offset是指分片的偏移量
protocol:协议类型,可以看到 我们的ping是通过icmp协议
icmp里面比较重要的2个 type和code,以此来决定这个icmp报文是干嘛的
这里的type 8 code 0,是icmp request,具体这些代表什么意思,我们可以去查RFC792
https://tools.ietf.org/html/rfc792
WHAT?什么是RFC,我只听过KFC,问题不大,自己去度娘
2、再来说第二个概念,ARP
ARP是什么,地址解析,所谓的地址解析就是根据IP地址来获取MAC地址,上面的报文你也看到了,你要ping别人,要知道别人的ip,别人的mac,发到网关的需要知道网关的mac,发到目的端的需要知道目的端的mac。
ARP的过程很简单,客户端先发一个arp请求,比如你知道了10.10.10.10这个ip,但是你不知道mac,你就需要发一个arp请求来获取。
好了 我们照例抓一个包,来看看arp是怎么工作的
arp的请求报文是一个广播报文,所以他的dmac就是ff:ff:ff:ff:ff:ff,你知道了对方的ip,但是不知道对方的mac,所以你的target mac就填00:00:00:00:00:00就行,看上图,这是一个arp请求报文,我想知道10.51.30.122的mac是多少。arp请求报文会在局域网广播,如果你不是10.51.30.122,那么你收到这个报文后,会直接丢弃不处理,如果你恰好是10.51.30.122这个ip,那么就会做一个arp应答。
我们再来看一个arp应答报文
10.51.30.122这个地址收到arp请求后,会发一个单播报文给我,告诉我它的mac,同时他也会记录我的mac和ip,在他那边会保存我的arp信息,同时我也保存了它的,下次我再找他,直接查arp表就可以了,不再需要再发一起ARP请求,当然,如果arp老化了,那么这样的流程还得再来一次咯
3、DNS
有些人喜欢ping百度,如果ping的是域名,那中间又多了一层处理,那就是域名解析,来来来,继续抓包
可以看到 我由于不知道百度的ip是多少,所以我先发给了114.114.114.114,域名解析服务器,他帮我解析以后再吧ip告诉我。
于是我重新封装报文,目的ip直接选择了216这个地址发送了icmp request
大功告成,ping也就通了
-------------------------------------------------------------分割线----------------------------------------------------------
搞毛???文章的标题不是ping不通吗,那你解释一堆ping通干什么,其实我们从原理里面反推一下,ping不通的理由到底有哪些嘛~ 每一个环节都检查一遍,那么问题不就迎刃而解了嘛~
来来来,我先来画个图,二层转发不过网关我就不画了,直接来一个三层转发图
这是一个简单的图,下面我来慢慢的一步步的写下步骤,假设我就去ping百度,一般现在看自己能不能上网不都是ping百度嘛~嘿嘿~
1、首先客户端要对百度的域名进行解析才能获取到IP地址,才能进一步封装自己的ping包,所以他首先发到域名服务器(假设我配置的是114.114.114.114),等域名服务器帮我解析好以后,给了我百度的ip地址,220.181.57.216,那么这里,我要去域名服务器,我是怎么去的呢,当然首先查看路由表
很明显,我没有直接去114.114.114.114的路由,所以我只能发给网关,也就是上图的192.168.0.1,由网关去处理(如果你不知道网关的mac,需要先发广播arp给网关,拿到网关的mac来维护arp表),之后网关把域名解析的结果返还给我,我就有了baidu的ip地址。
2、有了目的IP,客户端就准备封装报文,因为是三层转发,我不需要知道百度的mac地址,我只要知道网关的mac就行了,dmac=网关mac,dip=百度ip,直接发送ping包,由于网关的mac上面已经发送过一次arp请求了,所有网关的arp已经保存在客户端的arp表了
3、数据包到了网关,因为是到公网去,这里面的处理就不说了,用一条命令可以查看你的数据包经过了多少的跃点
4、百度收到了我的ping包以后,于是如法炮制的获取它的网关arp信息,再把封装好的icmp reply给我发了回来,等我的网关收到了这个reply以后,发现目的IP是我,通过路由直接转发给了我,这里整个过程就完成了。
tips:对于过来的数据包,网关会自行学习数据包的源mac信息,维护自己的mac表和arp表
好了,如果ping不通,那么你想想有哪些原因呢,一步步的去检查,一步步的去抓包分析,你就能找到原因,ping不通,不用找房东,自己把网线捋一捋,不就通了啊
原文地址:http://blog.51cto.com/14009921/2314248