愛伊米

屢次讓拳頭翻車的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 · 頭條號簽約