人物|屡次让拳头翻车的 ping:作者因车祸英年早逝 千行源码改变世界
也是没想到,“ping”这么个计算机术语,竟然在英雄联盟 MSI 话题下被讨论上了热搜 。无论在微博还是知乎,不少“ping”相关话题的热度已经过千万甚至上亿 。从话题下的讨论来看,不少网友甚至产生了对 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 值如何?
参考链接:
[1]https://blog.paessler.com/a-brief-history-of-ping
[2]https://ftp.arl.army.mil/~mike/ping.html
[3]https://s.weibo.com/weibo?q=%23MSI%E7%8E%B0%E5%9C%BA%E5%AE%9E%E9%99%85ping%E5%80%BC%23
[4]https://github.com/iputils/iputils/blob/master/ping/ping.c
[5]https://en.wikipedia.org/wiki/Mike_Muuss
[6]https://ngabbs.com/read.php?tid=30095855&rand=196
[7]https://github.com/jagt/clumsy
【人物|屡次让拳头翻车的 ping:作者因车祸英年早逝 千行源码改变世界】[8] 拳头技术博客公告:https://weibo.com/ ttarticle / p / show?id=2309404770219460790187
推荐阅读
- 数字货币|半月谈:别让“NFT”成为炒作新宠
- 人物|马斯克称中国经济体量将两三倍于美国 将出现一些非常强大的公司
- 人物|马斯克批评拜登政党为“分裂和仇恨党” 将支持特朗普阵营
- 人物|马斯克身价一天掉了800亿 2022年已损失4000亿
- 人物|Twitter高管嘲讽马斯克:阿斯伯格症患者,收购只是为了赚钱
- 人物|推特高管称马斯克是智障 马斯克回怼:破坏言论自由
- 人物|盛赞微信“功能齐全”,马斯克要按照微信来改造推特?
- Intel|英特尔Arc Alchemist独显无法让PCIe 4.0通道达到饱和
- 人物|因不满重返办公室政策而离职的苹果机器学习主管加入Google
- 人物|继贝索斯之后,马斯克再次抨击拜登:只会读提词器