屡次让拳头翻车的 ping:作者因车祸英年早逝,千行源码改变世界
来源:本站原创 浏览:697次 时间:2022-06-03
从话题下的讨论来看,不少网友甚至产生了对 ping 的研究热情:
说起来,经常玩联机游戏的小伙伴,想必对 ping 都不陌生。谁还没感受过几次被 ping 值支配的恐惧呢?(手动狗头)
ping 值越高,代表着打游戏时的网络延迟越高,表现到游戏中,就是延迟低的比延迟高的人更快做出各种(击杀、移动等)动作。
注意,这里的 ping 值并不代表你的网速。
这么说吧,如果你的数据包是一份快递的话,网速越高代表卡车吨量越大,而 ping 值则代表了这辆卡车能跑得多快、路上有多堵。
越低的 ping 值,意味着你的网络越畅通,但和它一次能搬运多少数据并没有什么关系。
但你知道,ping 最初是如何被发明出来的吗?其实,这个如今在打游戏、开会和测延迟中“无处不在”的计算机技术,当年竟然是被“随手”写出来的。故事还要从 80 年代的时候说起。
来自 1983 年的千行代码
这个名叫 ping 的工具,最初是由一位叫 Michael John Muuss 的老哥搞出来的。
Muuss 出生于 1958 年,从约翰・霍普金斯大学毕业后,在美国陆军一个名叫“阿伯丁试验场”的兵器试验中心做研究,主要与计算机网络和几何建模等方向有关。
例如,光线追踪在 80 年代刚火起来那会儿,Muuse 老哥就已经在潜心研究相应的技术了。期间他做了不少相关成果,但反而是“随手发明”出来的 ping,如今成了最著名的网络工具之一。
ping 应用广泛到什么程度?从最初的 Unix 系统,到如今的 Windows、macOS 和 Linux,ping 虽然历经好几个版本,但一直在各个操作系统上被广泛使用。
如今我们在 GitHub 上随手一搜,能看到不少实现 ping 的代码,但这些都不是最初的版本了。
Muuss 在自己的主页上提供了 ping 最初的源代码,然而我们点进去后就会发现,网页跳转了好几次,最终似乎也无法下载:
事实上,我们还能看到 Muuss 的主页,本身就已经不寻常了 ——2000 年时,Muuss 不幸因车祸去世,当时他才刚过完自己的 42 岁生日:
还好在 Web Archive 上保存了那个时候的网页,我们得以看见 ping 的第一版源代码。
这份代码文件名是 ping.shar,一个非常有年代感的后缀,如今已经基本没有人使用这个文件扩展名了。它是一个 41KB 大小的文件,从编辑器中来看,大约有 1600 行左右的代码:
那么,ping 究竟是怎么诞生的,又是如何被普及开来的?
ping 是如何被普及的?
最初编写这份代码的时候,Muuss 完全没想过它后来会这么火。毕竟最初的 ping,只是一个用来排查实验室网络异常的测试工具。
事情源于 1983 年 12 月的一天,Muuss 在阿伯丁试验场的弹道研究实验室(BRL)中做实验时,突然发现实验室的 IP 网络出现了异常情况。
这时候,他回忆起几个月前,自己曾参与过一次 DARPA 在挪威举办的研讨会,会上一位名叫 Dave Mills 的博士,提到过用 ICMP 数据包测试延迟的方法。
Muuss 认为,这个工具的原理,就像是发射声波并接收它的回波以计算往返时间一样。
△ 声呐,图源维基百科
刚好 Muuss 在大学的时候学过不少声呐和雷达系统的建模,他很快写了一个程序,并将之命名为 ping,在声呐中指代声音脉冲、也就是信号的意思。随后,Muuss 只用了一晚上,就将 ping 的程序写了出来。
虽然写出来的时候,他所在的实验室已经将网络问题解决了,但 Muuss 还是将它作为一个公有领域软件(public domain software,使用时无需许可证)发布了出去。
很快加州大学伯克利分校的 Erick Engelke 发现了这份软件,将它改写了一版(遵循 GPL 开源协议),放入伯克利自己开发的 Unix 操作系统 BSD4.3 版本中。
随后,计算机工程师 Tim Crawford 又基于 MIT 开源协议,写了一个 ReactOS 版本的 ping 代码。再之后,ping 被各个计算机大牛写入各种操作系统如 macOS、Linux 和 Windows 中,又加入了更多的功能。
△ Linux 系统上的 ping.c
如今我们看到的各个系统中自带的 ping 工具,早已经不是最初那个 ping.shar 程序了,其功能和用法都要丰富得多。那么,如今的 ping 放到计算机上来说,究竟是一个怎样的工具呢?
ping 的基本原理
许多计算机发烧友可能会说,自己 ping 用得贼 6。不过,大伙儿知道 ping 是如何工作的吗?知其然,不妨也了解一下背后的所以然:ping,是网络结构里应用层的一个网络管理命令,是判断两台主机或路由节点之间网络是否畅通的重要手段。
简单来说:如果两台主机“ping”得通,说明它们之间可以建立连接。
一个小知识:公网(因特网)IP 地址具有唯一性。这就像你在世界范围(公网)内的一栋楼(主机 or 路由节点等)里工作,这栋楼的地址(IP 地址)相对世界来说是唯一的,不过楼里面的其他门牌号(内网 IP 地址)则不一定是唯一的。
利用这一特性,我们就能用 ping 测试两台主机或路由节点中的网络连通性。具体来说,就是使用 ping 命令,先给目标 IP 地址发送一个遵循 ICMP 协议的数据包(echo request)。然后可以根据返回数据包的情况(丢包、速度等),检查主机或路由节点之间的网络状态。
Emm…ICMP 协议又是什么?它的全称是:Internet Control Message Protocol,即因特网控制报文协议,ICMP 报文封装在 IP 包里。所谓“控制”,即在 IP 主机、路由节点之间传递控制消息,来反映数据包是否成功到达目标端,以及反映网络状况等。
在 IP 通信中,当 IP 包成功到达目标地址并返回时,会收到 ping 应答;而当 IP 包因为某原因,未能成功到达目标地址、或未能成功从目标地址返回时,ICMP 返回的数据包中将含有具体原因,如:网络不可达、端口不可达等。
怎样 ping 起来
下面介绍一下 ping 的基本操作。ping 命令在各个常见的操作系统中通用,这里以 macOS 为例:从 Finder 中找到“终端”。
输入 ping+IP 地址(网址或域名也可以),这里先以百度为例。然后,即可查看每个数据包,从本电脑对百度的网络服务器发送数据,到接收到服务器反馈数据的延迟时间。
由于 macOS 发送的每个 IP 数据包默认大小是 64 个字节,所以返回的数据包大小也是 64 个字节。
而这里的延迟时间,就是 ping 值。除了输入百度等网址,想要测两台主机之间的 ping 值也没问题,在一台上输入另一台的 IP 地址即可:
所以,在玩网络游戏的时候,如果 ping 值过高就会感觉操作延迟。这个延迟的后果还挺严重的 —— 例如,在打王者排位的关键时刻,如果网络连接(可能是自己的无线网,也可能是附近的服务器)卡顿,明明自己已经操作了,但由于敌方的操作反馈时间更快,所以只能眼睁睁得看着自己的英雄挂掉。
说到这里,量子位急忙上号诊断了一下自己的网络。
还好,王者荣耀的延迟低于 70ms 算正常。对于 LOL,玩家可打开设置菜单,点击“显示”标签,然后点击“切换 FPS 显示”按钮,查看自己的 ping 值。
至于锁 ping(人工延迟)技术要如何实现,目前拳头游戏官方给出了一份技术说明:
从说明中来看,拳头表示在线下场馆比赛时加入了一个人工延迟工具调整 ping 值。由于人工延迟工具的代码运算出现错误,导致线下 ping 值过高,目前已通过调节配置修复,但游戏中显示的 ping 值会因为这一配置调节出现问题。
具体人工延迟工具(锁 ping)的技术代码,目前拳头游戏并未公开。不过 GitHub 上也已经有人做过人工延迟工具,如下面这个 clumsy 开源模拟器,可以模拟延迟、丢包等 bug。感兴趣的小伙伴可以去看看:
One More Thing
在自己的主页上,Muuse 还 po 出了另一个与“ping”相关的小趣事。早在 1933 年,美国儿童图画书作家 Marjorie Flack 就曾经出版过一个绘本:《ping 的故事》。
在这里,ping 是故事主角小鸭子的名字:小鸭子 ping 和伙伴还有主人一起生活在一条船上,每天最后一只回家的小鸭子要被打屁股。一天傍晚,ping 贪玩落在了最后,为了不挨打,它没有回家,由此在长江中开启了一段奇妙冒险,最终平安回到主人的船上。
这看似是一本寻常的儿童读物,但多年后,有读者发现,小鸭子 ping 的故事与计算机中的 ping 数据包竟有异曲同工之妙!一个 ping 数据包就像一只鸭子,它和其他数据包(更多鸭子)一起,在主机(小船)上度过了一段时期。
然后,这些数据包(鸭子)通过一个通道(桥)离开主机(船),进入互联网(长江)。数据包(鸭子)在另一个主机(另一艘船)上经过短暂的时间后,又回到了原来的主机(船)上。所以,今天你的 ping 值如何?