屢次讓騰訊上熱搜的一個發明 作者英年早逝:留下千行源碼

也是沒想到,「ping」這麼個電腦術語,竟然在英雄聯盟MSI話題下被討論上了熱搜。

無論在微博還是知乎,不少「ping」相關話題的熱度已經過千萬甚至上億。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

從話題下的討論來看,不少網友甚至產生了對ping的研究熱情:

屢次讓騰訊上熱搜的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的程式碼,但這些都不是最初的版本了。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

Muuss在自己的主頁上提供了ping最初的源程式碼,然而我們點進去後就會發現,網頁跳轉了好幾次,最終似乎也無法下載:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

事實上,我們還能看到Muuss的主頁,本身就已經不尋常了——

2000年時,Muuss不幸因車禍去世,當時他才剛過完自己的42歲生日:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

還好在Web Archive上保存了那個時候的網頁,我們得以看見ping的第一版源程式碼。

這份程式碼文件名是ping.shar,一個非常有年代感的後綴,如今已經基本沒有人使用這個文件擴展名了。

它是一個41KB大小的文件,從編輯器中來看,大約有1600行左右的程式碼:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

那麼,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中,又加入了更多的功能。

如今我們看到的各個系統中自帶的ping工具,早已經不是最初那個ping.shar程式了,其功能和用法都要豐富得多。

那麼,如今的ping放到電腦上來說,究竟是一個怎樣的工具呢?

ping的基本原理

許多電腦發燒友可能會說,自己ping用得賊6。

不過,大伙兒知道ping是如何工作的嗎?

知其然,不妨也了解一下背後的所以然:

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 發明人英年早逝:留下千行源碼改變世界

輸入ping+IP地址(網址或域名也可以),這裡先以百度為例。

然後,即可查看每個數據包,從本電腦對百度的網路伺服器發送數據,到接收到伺服器回饋數據的延遲時間。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

由於macOS發送的每個IP數據包默認大小是64個位元組,所以返回的數據包大小也是64個位元組。

而這裡的延遲時間,就是ping值。

除了輸入百度等網址,想要測兩台主機之間的ping值也沒問題,在一台上輸入另一台的IP地址即可:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

所以,在玩網路遊戲的時候,如果ping值過高就會感覺操作延遲。

這個延遲的後果還挺嚴重的——

例如,在打王者排位的關鍵時刻,如果網路連接(可能是自己的無線網,也可能是附近的伺服器)卡頓,明明自己已經操作了,但由於敵方的操作回饋時間更快,所以只能眼睜睜得看著自己的英雄掛掉。

說到這裡,量子位急忙上號診斷了一下自己的網路。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

還好,王者榮耀的延遲低於70ms算正常。

對於LOL,玩家可打開設置菜單,點擊「顯示」標籤,然後點擊「切換FPS顯示」按鈕,查看自己的ping值。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

至於鎖ping(人工延遲)技術要如何實現,目前拳頭遊戲官方給出了一份技術說明:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

從說明中來看,拳頭表示在線下場館比賽時加入了一個人工延遲工具調整ping值。

由於人工延遲工具的程式碼運算出現錯誤,導致線下ping值過高,目前已通過調節配置修復,但遊戲中顯示的ping值會因為這一配置調節出現問題。

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

具體人工延遲工具(鎖ping)的技術程式碼,目前拳頭遊戲並未公開。不過GitHub上也已經有人做過人工延遲工具,如下面這個clumsy開源模擬器,可以模擬延遲、丟包等bug。感興趣的小夥伴可以去看看:

屢次讓騰訊上熱搜的ping 發明人英年早逝:留下千行源碼改變世界

One More Thing

在自己的主頁上,Muuse還po出了另一個與「ping」相關的小趣事。

早在1933年,美國兒童圖畫書作家Marjorie Flack就曾經出版過一個繪本:《ping的故事》。

在這裡,ping是故事主角小鴨子的名字:

小鴨子ping和夥伴還有主人一起生活在一條船上,每天最後一隻回家的小鴨子要被打屁股。一天傍晚,ping貪玩落在了最後,為了不挨打,它沒有回家,由此在長江中開啟了一段奇妙冒險,最終平安回到主人的船上。

這看似是一本尋常的兒童讀物,但多年後,有讀者發現,小鴨子ping的故事與電腦中的ping數據包竟有異曲同工之妙!

一個ping數據包就像一隻鴨子,它和其他數據包(更多鴨子)一起,在主機(小船)上度過了一段時期。

然後,這些數據包(鴨子)通過一個通道(橋)離開主機(船),進入互聯網(長江)。

數據包(鴨子)在另一個主機(另一艘船)上經過短暫的時間後,又回到了原來的主機(船)上。

所以,今天你的ping值如何?