屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

也是沒想到,“ping”這麼個計算機術語,竟然在英雄聯盟 MSI 話題下被討論上了熱搜。無論在微博還是知乎,不少“ping”相關話題的熱度已經過千萬甚至上億。從話題下的討論來看,不少網友甚至產生了對 ping 的研究熱情:

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

說起來,經常玩聯機遊戲的小夥伴,想必對 ping 都不陌生。誰還沒感受過幾次被 ping 值支配的恐懼呢?(手動狗頭)

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

△ 高 ping 戰士無所畏懼

ping 值越高,代表着打遊戲時的網絡延遲越高,表現到遊戲中,就是延遲低的比延遲高的人更快做出各種(擊殺、移動等)動作。

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

注意,這裡的 ping 值並不代表你的網速。

這麼說吧,如果你的數據包是一份快遞的話,網速越高代表卡車噸量越大,而 ping 值則代表了這輛卡車能跑得多快、路上有多堵。

越低的 ping 值,意味着你的網絡越暢通,但和它一次能搬運多少數據並沒有什麼關係。

但你知道,ping 最初是如何被發明出來的嗎?其實,這個如今在打遊戲、開會和測延遲中“無處不在”的計算機技術,當年竟然是被“隨手”寫出來的。故事還要從 80 年代的時候說起。

來自 1983 年的千行代碼

這個名叫 ping 的工具,最初是由一位叫 Michael John Muuss 的老哥搞出來的。

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

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 認為,這個工具的原理,就像是發射聲波並接收它的回波以計算往返時間一樣

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

△ 聲吶,圖源維基百科

剛好 Muuss 在大學的時候學過不少聲吶和雷達系統的建模,他很快寫了一個程序,並將之命名為 ping在聲吶中指代聲音脈衝、也就是信號的意思。隨後,Muuss 只用了一晚上,就將 ping 的程序寫了出來。

雖然寫出來的時候,他所在的實驗室已經將網絡問題解決了,但 Muuss 還是將它作為一個公有領域軟件(public domain software,使用時無需許可證)發布了出去。

很快加州大學伯克利分校的 Erick Engelke 發現了這份軟件,將它改寫了一版(遵循 GPL 開源協議),放入伯克利自己開發的 Unix 操作系統 BSD4.3 版本中。

隨後,計算機工程師 Tim Crawford 又基於 MIT 開源協議,寫了一個 ReactOS 版本的 ping 代碼。再之後,ping 被各個計算機大牛寫入各種操作系統如 macOS、Linux 和 Windows 中,又加入了更多的功能。

屢次讓拳頭翻車的 ping:作者因車禍英年早逝 千行源碼改變世界

△ Linux 系統上的 ping.c

如今我們看到的各個系統中自帶的 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:作者因車禍英年早逝 千行源碼改變世界

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

屢次讓拳頭翻車的 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 數據包就像一隻鴨子,它和其他數據包(更多鴨子)一起,在主機(小船)上度過了一段時期。

然後,這些數據包(鴨子)通過一個通道(橋)離開主機(船),進入互聯網(長江)。數據包(鴨子)在另一個主機(另一艘船)上經過短暫的時間后,又回到了原來的主機(船)上。所以,今天你的 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

[8] 拳頭技術博客公告:https://weibo.com/ ttarticle / p / show?id=2309404770219460790187

(0)
上一篇 2022-05-19 14:41
下一篇 2022-05-19 14:41

相关推荐