ping不通,找房东-----从一个ping包来解析网络转发原理

“房东,我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

时间: 2024-11-10 11:23:36

ping不通,找房东-----从一个ping包来解析网络转发原理的相关文章

Linux安装centos,网络net8模式ping不通www.baidu.com或者ping不通主机

1.Linux安装centos,网络net8模式ping不通www.baidu.com或者ping不通主机. 我使用的是net8模式.配置如下所示,保证可以ping通www.baidu.com或者ping通主机. 然后设置一下vmware的虚拟网络编辑器. 然后你的虚拟机选择nat8模式. 然后设置一下你的网络就可以了呢. 效果如下所示: 其中192.168.0.102是你的无线ip4地址或者主机网卡地址. 原文地址:https://www.cnblogs.com/biehongli/p/113

请听题:一个数据包如何在网络中传递?

传统的OSI参考模型和TCP/IP模型的关系和区别 TCP/IP模型 在网络上,一个协议对应于管理系统之间如何相互通信的规则 OSI模型和TCP/IP模型是现在网络中常用的协议 指定通信的规则为了保障客户的权益(在客户的现网中 会出现不同厂商的网络设备)目前应用的比较广泛的是TCP/IP模型 TCP/IP模型 应用层:APP层 腾讯QQ 微信 开发工程师 程序员DHCP协议 DNS协议等等传输层:TCP协议 UDP协议 防火墙设备 安全工程师TCP协议 UDP协议网络层:(三层)路由器或者三层交

防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机

现象:刚装的centos6.6,配置好网络却发现ping不通主机,主机却ping通虚拟机: 解决方法: 1.最简单的方法就是:关闭防火墙.但一直关闭防火墙也不是个办法,会遇到很多安全问题,建议下一个方案: 2.Windows的防火墙有个:ICMPv4-in这个规则,这个才是主要出问题的地方.只要找到这个开启,就不会被禁ping了: 打开方法: 1. 打开windo防火墙: 2. 选择高级设置: 3.入站规则: 4. 找到“公用”的“文件和打印共享(回显请求 – ICMPv4-In)”规则,右击启

100000个嵌入式学习者遇到的PING不通问题,我们使用这一个视频就解决了,牛!

在10多年的售后答疑历程中,我们每天都会遇到开发板.windows,ubuntu三者之间的PING通问题,常常中断手头中的工作去解决这类问题,甚至跟客户远程协助,颇耗时间与精力,在热心网友.答疑助手们的共同努力下,百问网论坛保存沉淀了大量的关于PING问题的解决文档,但它们都不够全,加上大多人都热衷于看视频而非文档,为此,我们特地录制本节视频,解决让初学者极其头疼的三者PING通问题. 你或许已经PING通了,但你可能不知道其中的原理,比如为什么那样接线?为什么电脑PING不通正在处于UBOOT

uip1.0 ping不通解决方案

最近移植uip1.0到stm32上,能udp收发数据,但是ping不通.感觉到很奇怪.以前移植的0.9都能ping通. 于是通过抓包分析.发现icmp echo reply返回的校验值为incorrect.如下图: ping request ping reply: 较uip 1.0和uip 0.9移植比较.在uip-conf.h里多了一个 #define CHECKSUM_BY_HARDWARE   //add by eric   当然是我自己罗. 也就是说由硬件来完成校验和计算.然后再看stm

两台主机之间单向Ping不通的问题

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px "Helvetica Ne

Intel万兆网卡背靠背连接ping不通那点事儿

对那些整天喊着"玩大的,玩狠的"口号的人来说,Intel万兆网卡背靠背连接ping不通那点事儿,根本就不算个事儿.所以,如果你正好是喜欢喊口号的朋友,就不要往下看了,因为我要讲述的,你可能不感兴趣,也很可能看不懂. 今天,是我加入I公司3个多月以来最有成就感的一天,因为打赢了一个硬仗.1个多月以前,我所在的项目小组给我分配了一个bug,  该bug可简单描述为:两张Intel 82599的万兆网卡,通过光纤背靠背连接后,彼此ping不通.从接受任务到今天,一共持续了33天,其间多次被各

linux虚拟机ping不通主机和外网(包括刚装系统遇到的一些问题)

自己ubuntu系统安装了一个virtualBox虚拟机,里面又装了一个ubuntu-server系统: 1.先设置一下字符集,因为一开始装系统的时候选择的是中文,但里面始终无法支持中文,那就算了,反正英文也看得过去 vi /etc/default/locale 用下面两段覆盖掉 LANG="en_US.UTF-8"LANGUAGE="en_CN:en" 退出保存,reboot重启下电脑: 2.apt-get update有时候会出错误,因为系统自带的sources

解决虚拟机或物理机ping不通网关故障的方法与思路

基本思路: 确定问题缩小范围.先外部后内部,利用排除法.类比法.替换法(隔离法)将故障范围逐渐缩小到某一点. 谨慎做出结论.下结论前先三思,想到所有可能存在问题的点,特别是与别人讨论和描述问题时更应该注意. 记录问题.做好文档备案工作,如记录故障现象.故障分析.故障原因.处理流程.处理结果.结论与经验等. 相对于虚拟机,物理机ping不通网关的故障更好排查一些,因为虚拟机在于物理交换机通信的过程中存在一个中间层,中间层可能为宿主主机上的标准交换机或者某个分布式交换机.但无论是标准交换机还是分布式