ping 之后,计算机背后都做了些了什么

Python七号

共 2209字,需浏览 5分钟

 · 2021-08-25

因耗子叔推荐,最近在看《TCP IP 详解》,里面讲到了 ping,今天来聊聊 ping。如果觉得有收获,不妨随手一个关注,每天学点技术。

ping 我相信你一定用过,刚装完电脑,不能上网的时候,我们就会 ping 一下目标机器,如果 ping 不同,那就说明网络不可达,如果能 ping 通但还是无法上网,可能是网络配置问题。可是你是否想过 ping 之后,计算机背后都做了些了什么?你可以把它作为面试题来回答。

ping 的名字源于声纳定位操作。Ping 程序由 MikeMuuss 编写,目的是为了测试另一台主机是否可达。该程序发送一份 ICMP 回显请求报文给主机,并等待主机返回 ICMP 应答报文。

一般来说,如果不能 Ping 到某台主机,那么就不能 Telnet 或者 FTP 到那台主机。反过来,如果不能 Telnet 到某台主机,那么通常可以用 Ping 程序来确定问题出在哪里。Ping 程序还能测出到这台主机的往返时间,以表明该主机离我们有多远。

几年前我们还可以作出这样没有限定的断言,如果不能 Ping 到某台主机,那么就不能 Telnet 或 FTP 到那台主机。随着 Internet 安全意识的增强,出现了提供访问控制清单的路由器和防火墙(禁止 ping 的策略),那么像这样没有限定的断言就不再成立了。一台主机的可达性可能不只取决于 IP 层是否可达,还取决于使用何种协议以及端口号。Ping 程序的运行结果可能显示某台主机不可达,但我们可以用 Telnet 远程登录到该台主机的 25 号端口,比如邮件服务器。

前面提到,ping 使用的是 ICMP 协议,那要了解下什么是 ICMP,ICMP 是 Internet 控制报文协议,位于 TCP/IP 协议族的的网络层:

请注意,虽然 ICMP 和 IP 协议都在网络层,但是 ICMP 在传输时是被封装在 IP 报文内部的,原因也很简单,没有 IP 协议,怎么知道你要把报文传给谁呢,IP 协议就相当于一个信封。

也就是说:

不妨让大脑牢记一下这个图:

现在来看下 ICMP 报文的格式:

但是 ICMP 回显请求和回显应答报文,又多了一些标识符和序号两个固定字段:

标识符有什么用呢?Unix 系统在实现 ping 程序时是把 ICMP 报文中的标识符字段置成发送进程的 ID 号。这样即使在同一台主机上同时运行了多个 ping 程序实例,ping 程序也可以识别出返回的信息。

序号就很简单了,从 0 开始,每发送一次新的回显请求就加 1。ping 程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。

从上述 ping 的结果看,处理序号,还有 ttl 和 time,ttl 就是 time to live,指的是报文在网络中能够存活的限制,就是当报文在网络中转发时,每经过一个路由点,就把预先设定的这个 ttl 数值减 1,直到最后 ttl=1 时报文就被扔掉,不向下转发。

time 就是往返时间,ping 程序通过在 ICMP 报文数据中存放发送请求的时间值,当应答返回时,用当前时间减去存放在 ICMP 报文中的时间值,即是往返时间。

ping 的是域名,但 ping 输出的第一行包括目的主机的 IP 地址,说明在发送 ICMP 报文之前,还请求了 DNS 服务器。

ping 程序还可以查看访问目标地址时经过了哪些路由,加上 -R 选项就可以:

可以看到有经过了 9 个路由,不过,ping 最多显示 9 个路由 ip,因为多了放不下,man 下,看看对 -R 的解释,说的就是 ip 的头部最多放 9 个 ip,如果想查看路由,要用 traceroute 命令。

ping 程序是对两个 TCP/IP 系统连通性进行测试的基本工具。它只利用 ICMP 回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。ping 程序请求主机时,并不是主机上的某个用户进程来应答的,而是操作系统的内核,也就是说操作系统内核层面就实现了对 ping 程序的响应。

最后的话

总结一下,就是客户端 ping 之后,如果是域名会去查 DNS 服务器找到目标 ip 地址,然后构建 ICMP 报文,将自己的进程 id 写入标识符,将序号写入序号字段,发送时间写入数据字段,将目标 ip 写入 IP 报文首部,发送出去,等待返回。

由于 IP 只提供最好的数据报传输服务,但不保证一定成功送达,也就是说,出了问题,直接就把报文丢弃了,取决于网络状况。

服务器收到 ICMP 请求报文时,会做相应的回应,但是现在的一些安全策略可以禁用 ping,也就是虽然网络是连通的,但 ping 也没有得到响应。

因此,如果超过一定的时间,ping 客户端还没有收到返回的话,这个数据包就认为是丢了,显示超时。如果收到的话,就计算往返时间,然后回显 ttl、time 等信息。当按下 Ctrl C 时,计算统计信息并显示。

留言交流

如果对《TCP IP 详解》感兴趣,可以购买纸质书,也可以回复「TCPIP」获取电子书。

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报