专栏首页Python七号ping 之后,计算机背后都做了些了什么

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

因耗子叔推荐,最近在看《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」获取电子书。

本文分享自微信公众号 - Python七号(PythonSeven),作者:somenzz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 这些有趣的AI人脸特效背后,腾讯云都做了什么?

    我们知道在人脸特效里面用到了很多的 AI 技术,其实 AI 早已经走入我们的生活,给我们生活带来很多的变化,大家可以想一下在生活中遇到的使用AI的场景。

    腾小云
  • 云从科技 | 从初创企业上位AI“国家队”,看看背后都干了些什么?!

    东邪西毒南帝北丐们,各有各的招数:以假乱真的仿生人、跟邓亚萍旗鼓相当的乒乓机器人、还有云从科技御眼重明“关上灯也认识你”、人工智能医疗阅片……

    AiTechYun
  • 当高端超级计算机退役时,他们到底都干了些什么?

    ORNL的Coury Turczyn讲述了诸如Titan之类的高端超级计算机在退役后会发生什么的不为人知的故事。

    GPUS Lady
  • 潘石屹也要学编程了?Python之父:并非人人都需要了解计算机发生了什么

    21世纪是编程的时代,几乎人类所做的一切,但凡跟互联网沾点边,都可能涉及到计算机编程,后台的程序跑出的结果通过大大小小的屏幕呈现在我们面前,人们已经觉得这是理所...

    大数据文摘
  • Pingmesh| 一种大规模数据中心网络质量检测工具

    在我们内部产品中,一直有关于网络性能数据监控需求,我们之前是直接使用 ping 命令收集结果,每台服务器去 ping (N-1) 台,也就是 N^2 的复杂度,...

    用户1278550
  • 友情链接交换成功之后还需要些做什么?并不是你所想的高枕无忧了

    友链交换后并非高枕无忧了。那么交换友情链接后我们还需要做什么呢。接下来我就来给大家总结几点:

    大脸猫
  • 对于Ping的过程,你真的了解吗?

    对于ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是ping命令吧?一般我们用ping查看网络情况,主要是检查两个指标,第...

    周三不加班
  • 当你 ping 的时候,你知道背后发生了什么吗?

    对于 ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是 ping命令吧?一般我们用 ping查看网络情况,主要是检查两个指...

    挨踢小子部落阁
  • 逼格高又实用的 Linux 高级命令,开发运维都要懂

    小小科
  • 当你「ping 一下」的时候,你知道它背后的逻辑吗?

    我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。 那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?

    Bug开发工程师
  • 当你「ping 一下」的时候,你知道它背后的逻辑吗?

    我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。 那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?

    奎哥
  • 当你「ping 一下」的时候,你知道它背后的逻辑吗?

    我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。 那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?

    纯洁的微笑
  • 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天、实时音视频等)时,如果发现网络连接超时,第一时间想到的就是使用Ping命令Ping一下服务器看看通...

    JackJiang
  • GitHub 标星过万!腾讯技术官发布的“神仙文档”图解网络

    互联网世界中,网络协议的重要性不言而喻。很多人都知道,网络协议中的五层模型或者七层模型,这些在操作系统中,那都是“必考题”。上学的时候,无论是死记硬背,还是各种...

    烂猪皮
  • Java学习笔记_零基础系列(二)常用的DOS命令(续)

    del *.class 这个命令中的那个“.”不要特殊化,这个“.”其实就是一个普通的字母

    牛仔码农
  • 在Windows上用Java代码模仿破解WIFI密码【大牛经验】

    本文纯属技术探索,与真正的破解还有很大差距,请广大网友切勿利用本文内容做出任何危害网络安全的行为。若有违法行为,均与本人无关。

    Java帮帮
  • 运维是不是IT行业里技术含量最低的岗位?

    在互联网行业里,运维一直都是一个被人误解很深的岗位,以致于很多人都认为运维在IT行中的技术含量很低,但是今天我要为运维人“平反”。

    IT大咖说
  • redis cluster 的核心原理分析:gossip 通信、jedis smart 定位、主备切换

    gossip 的延迟在我们上一章节中迁移 slots 时(reshard),去做另外一个操作,会发现 configuration error,需要等待一会才能达...

    HUC思梦
  • 监控网络流量?支付宝安全控件“附赠”的可疑进程

    阿里巴巴支付宝的一个进程Alipaybsm.exe被怀疑监控网络流量,它会复制发送的数据到接收缓冲中。 在接下来的篇幅中,我要讲一个目前还没结束的故事。故事可...

    FB客服

扫码关注云+社区

领取腾讯云代金券