概述

最近在定位网络问题的时候,先是ping了一下目标ip,发现ping不通,然后就以为网络是不通的了。确实,一般情况下 我们肯定就认为网络不通了,但是,有个兄弟跟我说服务是可以调用的,然后我就试了一下,通过curl的方式来调用相关 的接口,奇迹出现了,居然可以调的通,于是乎开始了各种网络相关知识的搜索,为防止遗忘,特别记录了一下。

详解

TCP/IP网络分层

计算机网络分层存在两种模型,一种是标准的OSI七层模型,一种是当前计算机网络中普遍使用的TCP/IP四层网络 分层协议。两种协议的划分以及对应关系如下:

上图我们可以看到传输层的协议是TCP、UDP,两种协议的区别是是否面向连接;而网络层或者说网际层的协议则有 IP、ICMP、ARP、RARP协议,这里说IP协议其实是不准确的,应该说是IP协议族。回归到我们今天的正题,curl和 ping的区分,ping应用的全称叫做Packet InterNet Groper(分组网间探测),该协议主要是用于主机或者 路由器之间的连通性,应用层直接使用网际层的ICMP协议,中间并没有使用传输层的UDP或者TCP的协议。ICMP的全称 为Internet Control Message Protocol(网际控制报文协议)

我们平时使用curl的时候一般都是用来调用http的接口来获取数据,这里需要说明的是curl支持http、https、ftp 等众多的协议,其在请求数据的时候,是会经过中间的传输层,并不是向Ping应用那样直接跳过了传输层。

仿真实验

为了更好的理解curl和ping的区分,还是有必要通过packet tracer来仿真演示一下这两个请求的过程的,具体如下:

小结

大多数排查网络故障都是从ping开始的,不过ping默认使用的协议是ICMP的协议,这要求源节点和目标节点之间的所有的 中间节点都支持ICMP转发的协议,如果中间的某一个节点通过防火墙禁用了ICMP的协议,那么这就会导致节点之间看起来 好像是不通的样子。而curl则是使用的TCP的协议,因此当ping的不通的时候,我们仍然是有可能curl通的。当 遇到之中情况的时候,可以使用traceroute 目标Ip的方式来查看连路中哪一个节点出现了问题。

这里稍微提一下traceroute的原理:通过不断的增加ICMP报文的TTL依次将报文发送出去,最终找到目标机器,这样 每次TTL为0的时候都会返回给发送发对应网络节点的路由信息。不过值得注意的是linux和windows的tracerouter协议 的实现稍有不通,linux是有使用了传输层,而windows没有使用。