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

Alex 蕭簫 發自 凹非寺

量子位 | 公眾號 QbitAI

也是沒想到,“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:作者因車禍英年早逝,千行源碼改變世界

事實上,我們還能看到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值如何?

屢次讓拳頭翻車的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

— 完 —

量子位 QbitAI · 頭條號簽約

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 4088 字。

轉載請註明: 屢次讓拳頭翻車的ping:作者因車禍英年早逝,千行源碼改變世界 - 楠木軒