屢次讓拳頭翻車的ping:作者因車禍英年早逝,千行源碼改變世界
只用一晚上就寫出來了
Alex 蕭簫 發(fā)自 凹非寺
量子位 | 公眾號 QbitAI
也是沒想到,“ping”這么個計算機(jī)術(shù)語,竟然在英雄聯(lián)盟MSI話題下被討論上了熱搜。
無論在微博還是知乎,不少“ping”相關(guān)話題的熱度已經(jīng)過千萬甚至上億。
從話題下的討論來看,不少網(wǎng)友甚至產(chǎn)生了對ping的研究熱情:
說起來,經(jīng)常玩聯(lián)機(jī)游戲的小伙伴,想必對ping都不陌生。
誰還沒感受過幾次被ping值支配的恐懼呢?(手動狗頭)
△高ping戰(zhàn)士無所畏懼
ping值越高,代表著打游戲時的網(wǎng)絡(luò)延遲越高,表現(xiàn)到游戲中,就是延遲低的比延遲高的人更快做出各種(擊殺、移動等)動作。
注意,這里的ping值并不代表你的網(wǎng)速。
這么說吧,如果你的數(shù)據(jù)包是一份快遞的話,網(wǎng)速越高代表卡車噸量越大,而ping值則代表了這輛卡車能跑得多快、路上有多堵。
越低的ping值,意味著你的網(wǎng)絡(luò)越暢通,但和它一次能搬運多少數(shù)據(jù)并沒有什么關(guān)系。
但你知道,ping最初是如何被發(fā)明出來的嗎?
其實,這個如今在打游戲、開會和測延遲中“無處不在”的計算機(jī)技術(shù),當(dāng)年竟然是被“隨手”寫出來的。
故事還要從80年代的時候說起。
來自1983年的千行代碼
這個名叫ping的工具,最初是由一位叫Michael John Muuss的老哥搞出來的。
Muuss出生于1958年,從約翰·霍普金斯大學(xué)畢業(yè)后,在美國陸軍一個名叫“阿伯丁試驗場”的兵器試驗中心做研究,主要與計算機(jī)網(wǎng)絡(luò)和幾何建模等方向有關(guān)。
例如,光線追蹤在80年代剛火起來那會兒,Muuss老哥就已經(jīng)在潛心研究相應(yīng)的技術(shù)了。
期間他做了不少相關(guān)成果,但反而是“隨手發(fā)明”出來的ping,如今成了最著名的網(wǎng)絡(luò)工具之一。
ping應(yīng)用廣泛到什么程度?
從最初的Unix系統(tǒng),到如今的Windows、macOS和Linux,ping雖然歷經(jīng)好幾個版本,但一直在各個操作系統(tǒng)上被廣泛使用。
如今我們在GitHub上隨手一搜,能看到不少實現(xiàn)ping的代碼,但這些都不是最初的版本了。
Muuss在自己的主頁上提供了ping最初的源代碼,然而我們點進(jìn)去后就會發(fā)現(xiàn),網(wǎng)頁跳轉(zhuǎn)了好幾次,最終似乎也無法下載:
事實上,我們還能看到Muuss的主頁,本身就已經(jīng)不尋常了——
2000年時,Muuss不幸因車禍去世,當(dāng)時他才剛過完自己的42歲生日:
還好在Web Archive上保存了那個時候的網(wǎng)頁,我們得以看見ping的第一版源代碼。
這份代碼文件名是ping.shar,一個非常有年代感的后綴,如今已經(jīng)基本沒有人使用這個文件擴(kuò)展名了。
它是一個41KB大小的文件,從編輯器中來看,大約有1600行左右的代碼:
那么,ping究竟是怎么誕生的,又是如何被普及開來的?
ping是如何被普及的?
最初編寫這份代碼的時候,Muuss完全沒想過它后來會這么火。
畢竟最初的ping,只是一個用來排查實驗室網(wǎng)絡(luò)異常的測試工具。
事情源于1983年12月的一天,Muuss在阿伯丁試驗場的彈道研究實驗室(BRL)中做實驗時,突然發(fā)現(xiàn)實驗室的IP網(wǎng)絡(luò)出現(xiàn)了異常情況。
這時候,他回憶起幾個月前,自己曾參與過一次DARPA在挪威舉辦的研討會,會上一位名叫Dave Mills的博士,提到過用ICMP數(shù)據(jù)包測試延遲的方法。
Muuss認(rèn)為,這個工具的原理,就像是發(fā)射聲波并接收它的回波以計算往返時間一樣。
△聲吶,圖源維基百科
剛好Muuss在大學(xué)的時候?qū)W過不少聲吶和雷達(dá)系統(tǒng)的建模,他很快寫了一個程序,并將之命名為ping,在聲吶中指代聲音脈沖、也就是信號的意思。
隨后,Muuss只用了一晚上,就將ping的程序?qū)懥顺鰜怼?/p>
雖然寫出來的時候,他所在的實驗室已經(jīng)將網(wǎng)絡(luò)問題解決了,但Muuss還是將它作為一個公有領(lǐng)域軟件(public domain software,使用時無需許可證)發(fā)布了出去。
很快加州大學(xué)伯克利分校的Erick Engelke發(fā)現(xiàn)了這份軟件,將它改寫了一版(遵循GPL開源協(xié)議),放入伯克利自己開發(fā)的Unix操作系統(tǒng)BSD4.3版本中。
隨后,計算機(jī)工程師Tim Crawford又基于MIT開源協(xié)議,寫了一個ReactOS版本的ping代碼。
再之后,ping被各個計算機(jī)大牛寫入各種操作系統(tǒng)如macOS、Linux和Windows中,又加入了更多的功能。
△Linux系統(tǒng)上的ping.c
如今我們看到的各個系統(tǒng)中自帶的ping工具,早已經(jīng)不是最初那個ping.shar程序了,其功能和用法都要豐富得多。
那么,如今的ping放到計算機(jī)上來說,究竟是一個怎樣的工具呢?
ping的基本原理
許多計算機(jī)發(fā)燒友可能會說,自己ping用得賊6。
不過,大伙兒知道ping是如何工作的嗎?
知其然,不妨也了解一下背后的所以然:
ping,是網(wǎng)絡(luò)結(jié)構(gòu)里應(yīng)用層的一個網(wǎng)絡(luò)管理命令,是判斷兩臺主機(jī)或路由節(jié)點之間網(wǎng)絡(luò)是否暢通的重要手段。
簡單來說:如果兩臺主機(jī)“ping”得通,說明它們之間可以建立連接。
一個小知識:公網(wǎng)(因特網(wǎng))IP地址具有唯一性。
這就像你在世界范圍(公網(wǎng))內(nèi)的一棟樓(主機(jī)or路由節(jié)點等)里工作,這棟樓的地址(IP地址)相對世界來說是唯一的,不過樓里面的其他門牌號(內(nèi)網(wǎng)IP地址)則不一定是唯一的。
利用這一特性,我們就能用ping測試兩臺主機(jī)或路由節(jié)點中的網(wǎng)絡(luò)連通性。
具體來說,就是使用ping命令,先給目標(biāo)IP地址發(fā)送一個遵循ICMP協(xié)議的數(shù)據(jù)包(echo request)。
然后可以根據(jù)返回數(shù)據(jù)包的情況(丟包、速度等),檢查主機(jī)或路由節(jié)點之間的網(wǎng)絡(luò)狀態(tài)。
Emm…ICMP協(xié)議又是什么?
它的全稱是:Internet Control Message Protocol,即因特網(wǎng)控制報文協(xié)議,ICMP報文封裝在IP包里。
所謂“控制”,即在IP主機(jī)、路由節(jié)點之間傳遞控制消息,來反映數(shù)據(jù)包是否成功到達(dá)目標(biāo)端,以及反映網(wǎng)絡(luò)狀況等。
在IP通信中,當(dāng)IP包成功到達(dá)目標(biāo)地址并返回時,會收到ping應(yīng)答;而當(dāng)IP包因為某原因,未能成功到達(dá)目標(biāo)地址、或未能成功從目標(biāo)地址返回時,ICMP返回的數(shù)據(jù)包中將含有具體原因,如:網(wǎng)絡(luò)不可達(dá)、端口不可達(dá)等。
怎樣ping起來
下面介紹一下ping的基本操作。
ping命令在各個常見的操作系統(tǒng)中通用,這里以macOS為例:
從Finder中找到“終端”。
輸入ping+IP地址(網(wǎng)址或域名也可以),這里先以百度為例。
然后,即可查看每個數(shù)據(jù)包,從本電腦對百度的網(wǎng)絡(luò)服務(wù)器發(fā)送數(shù)據(jù),到接收到服務(wù)器反饋數(shù)據(jù)的延遲時間。
由于macOS發(fā)送的每個IP數(shù)據(jù)包默認(rèn)大小是64個字節(jié),所以返回的數(shù)據(jù)包大小也是64個字節(jié)。
而這里的延遲時間,就是ping值。
除了輸入百度等網(wǎng)址,想要測兩臺主機(jī)之間的ping值也沒問題,在一臺上輸入另一臺的IP地址即可:
所以,在玩網(wǎng)絡(luò)游戲的時候,如果ping值過高就會感覺操作延遲。
這個延遲的后果還挺嚴(yán)重的——
例如,在打王者排位的關(guān)鍵時刻,如果網(wǎng)絡(luò)連接(可能是自己的無線網(wǎng),也可能是附近的服務(wù)器)卡頓,明明自己已經(jīng)操作了,但由于敵方的操作反饋時間更快,所以只能眼睜睜得看著自己的英雄掛掉。
說到這里,量子位急忙上號診斷了一下自己的網(wǎng)絡(luò)。
還好,王者榮耀的延遲低于70ms算正常。
對于LOL,玩家可打開設(shè)置菜單,點擊“顯示”標(biāo)簽,然后點擊“切換FPS顯示”按鈕,查看自己的ping值。
至于鎖ping(人工延遲)技術(shù)要如何實現(xiàn),目前拳頭游戲官方給出了一份技術(shù)說明:
從說明中來看,拳頭表示在線下場館比賽時加入了一個人工延遲工具調(diào)整ping值。
由于人工延遲工具的代碼運算出現(xiàn)錯誤,導(dǎo)致線下ping值過高,目前已通過調(diào)節(jié)配置修復(fù),但游戲中顯示的ping值會因為這一配置調(diào)節(jié)出現(xiàn)問題。
具體人工延遲工具(鎖ping)的技術(shù)代碼,目前拳頭游戲并未公開。不過GitHub上也已經(jīng)有人做過人工延遲工具,如下面這個clumsy開源模擬器,可以模擬延遲、丟包等bug。感興趣的小伙伴可以去看看:
One More Thing
在自己的主頁上,Muuss還po出了另一個與“ping”相關(guān)的小趣事。
早在1933年,美國兒童圖畫書作家Marjorie Flack就曾經(jīng)出版過一個繪本:《ping的故事》。
在這里,ping是故事主角小鴨子的名字:
小鴨子ping和伙伴還有主人一起生活在一條船上,每天最后一只回家的小鴨子要被打屁股。一天傍晚,ping貪玩落在了最后,為了不挨打,它沒有回家,由此在長江中開啟了一段奇妙冒險,最終平安回到主人的船上。
這看似是一本尋常的兒童讀物,但多年后,有讀者發(fā)現(xiàn),小鴨子ping的故事與計算機(jī)中的ping數(shù)據(jù)包竟有異曲同工之妙!
一個ping數(shù)據(jù)包就像一只鴨子,它和其他數(shù)據(jù)包(更多鴨子)一起,在主機(jī)(小船)上度過了一段時期。
然后,這些數(shù)據(jù)包(鴨子)通過一個通道(橋)離開主機(jī)(船),進(jìn)入互聯(lián)網(wǎng)(長江)。
數(shù)據(jù)包(鴨子)在另一個主機(jī)(另一艘船)上經(jīng)過短暫的時間后,又回到了原來的主機(jī)(船)上。
所以,今天你的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]拳頭技術(shù)博客公告:https://weibo.com/ttarticle/p/show?id=2309404770219460790187