点赞后看,养成习惯
喜欢的话 可以点个关注哟
你们的点赞支持对博主们来说很重要哦 !!!
我们知道,在复杂的互联网环境下,网络卡顿的问题时有发生,那么在此情况下,如何快速定位网络故障?快速判断是网速问题还是设备问题呢?别着急,今天教你两招,解决以下问题?
如果你发现访问网页的时候有点卡卡的,断断续续很不流畅。你想看看端对端的往返延迟,以及丢包的概率,你可以用什么?Ping
发出几个包之后,却没有回包,那我们接下去该如何排除故障呢?Traceroute
如果你发现 访问网页的时候有点卡卡的,断断续续很不流畅。你想看看端对端的往返延迟,以及丢包的概率,你可以用什么?
回答这个问题之前,我们先来看看IP协议本身存在着弊端。
IP提供了不可靠和无连接的数据报交互,不可靠是说IP协议就是个甩手掌柜,它把IP数据包发送出去之后,根本不管对方收不收得到,要不要回包,总是把包发出去就是它唯一做的事情了
所以,在不进行任何检查的情况下,我们很难排查出到底是哪里出了问题。
而对于我们来说,最开始选择的检查方式就可以是ping,来测试网络连通性。
接下来举个例子,我们可以使用ping这个小程序,比如在小明windows命令行cmd下输入ping 2.2.2.2
那Ping命令下究竟发生了什么呢?
2.1、Ping程序组织好自己的ICMP报文,其中:
Identifier用于区分不同的Ping程序
Sequence Number用于区分一个Ping程序消息序列号
Type = 8 ,表示这是一个 Echo Request
然后调用IP进程发出ICMP报文,此时TTL = 64,
路由器A接受到此IP报文,做TTL-1操作得到TTL = 63 ,查询路由表,发给下一跳路由器B。
一句以上同样的过程,经过26跳路由器的中继,最终到达小美的IP报文 TTL = 64 - 26 = 38
2.2、小美电脑把ICMP消息转交给ICMP进程,ICMP进程只是把Type 修改为 0,然后调用IP进程发出,此时 TTL = 64
路由器Z接收到此IP报文,做TTL - 1 操作得到TTL = 63,查询路由表,发给下一跳路由器Y
依据以上同样的过程,经过26跳路由器的中继,最终到达小明的IP报文 TTL =64 -26 =38,转发给小明Ping程序
2.3、依据ID与序列号匹配,比如发出的ID=1,序列号为1234,接受的回应ID =1 ,序列号 = 1234,那么这一对消息完全匹配,匹配成功,关掉定时器,得到往返的延迟RTT值,获得TTL剩余值为38,打印一个消息到屏幕上,告知小明Ping的结果。
一般会发出5个Ping消息,最终会生成一个RTT的平均值、最小值、最大值,丢包个数、丢包的概率,打印在程序的后方
3.1、 TTL是什么?
TTL是 Time To Live 的英文缩写,用于表示IP报文的生存寿命, 类似游戏里的几条命或者几滴血,每经过一台路由器就减去一条命,如果没有命了,就意味着 Game Over,路由器就会丢弃它
那难道路由器就这么丢弃了,当做什么都没有发生吗。这也太不靠谱了吧。当然不是!
至少还要告诉IP报文的主人,TTL Expired这个消息告诉源主机, 你家的那个跑腿的ping协议,因为没有血了,被我扔出窗外了,告诉你一声。小明的Ping程序接收到这个消息,会打印到屏幕上,小明就获知这个不幸的消息。
3,2 、TTL为什么要减一操作?
避免因为环路给路由器造成 无穷负担
真实的网络环境下一班路由器之间都有多条线相连,可能会出现 A ->B -> C -> A ->B -> C,这样子的话三台路由器就形成了一个三角形的环,IP报文会在这里无休止地转圈圈。
为了不给环路中的路由器造成无休止的负担, 每经过一跳路由器,减去一条命,一个IP报文最多有255条命,那么经过255跳之后,命没了扔掉就好, 这可以减轻路由器的负担。你可以无理取闹,但是不能一直无理取闹。
3.3、TTL Expried消息如何通知相关进程?
出错消息到达小明电脑的时候,他该如何通知对应的进程告呢?
要知道,一台电脑上,同时运行的进程或许有成百上千个,这个ICMP出错消息要怎么找呢?
实际上在ICMP消息体里,至少有28个字节的原始IP报文字段,所谓原始IP报文就是小明发出的Ping报文。
而这28个字节里面可以恰恰容纳 IP + ICMP头,而在TCMP头里恰恰有ID字段,比如ID =1 ,小明的电脑就会准确定位这个Ping程序,于是将出错消息果断转交给Ping程序处理。
3.4、超时时间(Timeout)
一旦Ping报文发出之后,总不能一直傻傻地等吧,需要启动一个定时器,默认的超时时间的2s,这个值对绝大多数的场合来说是足够了。如果在2s以内,不能收到回复,则直接超时处理。Ping程序会告诉小明:超时了。
小明也可以修改超时时间短一些,可以更快知道结果
如果你这么久还没有回复我,那我就不等你消息了,傲娇!!!
3.5、探测路径最大传输单元
就像如果你要运输100吨货物,你可能会把100吨的货物分成十份,每十吨放进一个集装箱运输一样。
为了保证可靠传输、传输效率的综合考虑,链路层一般会对发送的帧尺度有一个限制。比如以太网标准最大传输单元位1500字节,在家用的接入网,加入了PPPoE拨号,郑佳乐8个字节的头部,这样势必是的IP报文从1500字节减少到1492字节。
互联网上的物理路径,由于各种原因,加上各种隧道头、协议头、留给IP报文的空间小于1500字节,为了获知个人电脑和服务器之间的最大传输单元(对于IP报文来说),需要使用Ping程序来发现
如 Ping -f -l 1500 8.8.8.8
参数 -f 表示,如果IP报文大小超出路由器的发送接口的最大传输单元,则不允许任何路由器分片
参数 -l 1500,ICMP消息体的长度,不包括IP头、ICMP头的长度
这条命令会产生一个长度大于1500的IP报文,这个值大于一般物理接口的MTU,由于不允许分片,最终会被丢弃。
最终根据二分法,不断尝试,如果最终发现 Ping -f -l 1464 8.8.8.8能够得到服务器的回应,那么就意味着ICMP消息体是1464,加上20字节的IP头,再加上8字节的ICMP头,一共是1492字节。
这意味着小明电脑和服务器的最大传输单元MTU是1492,至于为什么1492而不是1500,是因为有8字节的PPPoE协议头
3.6、Ping不同的情况分析
主机不可达,TTL到0了
网络不可达, 阻塞了,太卡了,堵车了,就丢包了
端口不可达, 你要到达的端口没有开启
协议不可达, ACL,访问控制列表,不允许你这个IP给我发送数据
需要分片
源路由错误
未知的目的网络
未知的目的主机
当使用Ping命令,发出几个包之后,却没有回包,那我们接下去该如何排除故障呢?
我们可以使用Traceroute工具,这个工具可以追踪网络路径,谁的网络路径呢?是IP包的,追踪的是IP包双向路径,IP包从小明发出到达小美,这是出方向;IP包从小美返回小明,这是入方向的;只要有一个方向的IP包不能通行,用户机会感觉网络出现问题了。
Traceroute会把小明,小美之间所经过的每一跳路由器都打印出来,同时还会打印小明到每一跳路由器的最大、最小、平均延迟,这样就画出了了一张中继设备的连接图,哪有出现问题就一目了然了
那么Traceroute究竟是如何工作的呢?
1、TTL = 1
Traceroute使用UDP协议来传输探测回声,目的端口号一般位于32768-65535之间,假设这里使用的是65000,IP头里会有一个小技巧,将TTL设置为1,这样子当这个IP包到达第一跳路由器,做TTL - 1 操作,TTL会变为0,路由器就要使用ICMP发出错误消息:TTL Expired,同时还会截取回声IP包至少28个字节放在ICMP消息里。
为什么要截取28个字节,有什么用呢?
其中包含20字节的IP头、8字节的UDP头,这样小明ICMP进程就会根据UDP端口号来定位是哪个进程的报错消息,揉揉眼睛一看,原来是Traceroute的报错消息啊,然后就转交给它来处理
Traceroute将第一跳路由器打印输出,这一步一共发送三个探测包,最终会得到往返延迟的最大、最小、平均延迟,并打印输出
以此类推
N、TTL = N
TTL = 2 ,到达第二跳,TTL 也变为 0 ,也发报错消息,小明就会知道第二跳的IP地址。
依照以上类似方法,TTL一直变化为3、4、5…N,小明就会知道第三跳、第四跳…第N跳的IP地址,并将它们一一打印出来
第N+1步:TTL = N + 1
最终IP报文到达了小美的电脑,IP进程发现这是本地的IP地址,于是依据UDP报文中的目的端口号65000,去尝试发现进程,结果没有发现有进程和端口号65000绑定,于是通知小明一个出错消息,即端口不可达
小明接收到这个消息,则可以放心地认为,回声探测已经达到了终点,把最后一跳路由器的IP打印出来,整个过程结束
当我们在网络连接方面出现问题的时候,首先我们用Ping某个IP地址测试网络连通性,如果Ping命令成功返回4次成功的RRT,则大概率网络通信无问题,网络连接可能网速或者网络不稳定。
如果Ping命令发现没有成功ping通,则接着采用Traceroute协议进行查看,精准定位到到底是那一台路由器,那一段的网段出现问题。
这是一个从整体到局部,从一个大范围缩小到某台路由器的排查网络故障过程。
以上文章,作为自己的学习笔记,仅供参考
本文完,感谢你的阅读!!!
最后,如果本文对你有所帮助,希望可以点个赞支持一下。你们的鼓励将会是博主原创的动力。