Alex 蕭簫 發自 凹非寺
量子位 | 公眾號 QbitAI
也是沒想到,“
ping
”這麼個計算機術語,竟然在英雄聯盟MSI話題下被討論上了熱搜。
無論在微博還是知乎,不少“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的程式碼,但這些都不是最初的版本了。
Muuss在自己的主頁上提供了ping最初的原始碼,然而我們點進去後就會發現,網頁跳轉了好幾次,最終似乎也無法下載:
事實上,我們還能看到Muuss的主頁,本身就已經不尋常了——
2000年時,Muuss不幸因車禍去世,當時他才剛過完自己的42歲生日:
還好在Web Archive上儲存了那個時候的網頁,我們得以看見ping的
第一版原始碼
。
這份程式碼檔名是
ping.shar
,一個非常有年代感的字尾,如今已經基本沒有人使用這個副檔名了。
它是一個41KB大小的檔案,從編輯器中來看,大約有1600行左右的程式碼:
那麼,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中,又加入了更多的功能。
△Linux系統上的ping。c
如今我們看到的各個系統中自帶的ping工具,早已經不是最初那個ping。shar程式了,其功能和用法都要豐富得多。
那麼,如今的ping放到計算機上來說,究竟是一個怎樣的工具呢?
ping的基本原理
許多計算機發燒友可能會說,自己ping用得賊6。
不過,大夥兒知道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+IP地址
(網址或域名也可以)
,這裡先以百度為例。
然後,即可檢視
每個
資料包,從本電腦對百度的網路伺服器傳送資料,到接收到伺服器反饋資料的延遲時間。
由於macOS傳送的每個IP資料包預設大小是64個位元組,所以返回的資料包大小也是64個位元組。
而這裡的延遲時間,就是
ping值
。
除了輸入百度等網址,想要測兩臺主機之間的ping值也沒問題,在一臺上輸入另一臺的IP地址即可:
所以,在玩網路遊戲的時候,如果ping值過高就會感覺操作延遲。
這個延遲的後果還挺嚴重的——
例如,在打王者排位的關鍵時刻,如果網路連線
(可能是自己的無線網,也可能是附近的伺服器)
卡頓,明明自己已經操作了,但由於敵方的操作反饋時間更快,所以只能眼睜睜得看著自己的英雄掛掉。
說到這裡,量子位急忙上號診斷了一下自己的網路。
還好,王者榮耀的延遲低於70ms算正常。
對於LOL,玩家可開啟設定選單,點選“顯示”標籤,然後點選“切換FPS顯示”按鈕,檢視自己的ping值。
至於鎖ping
(人工延遲)
技術要如何實現,目前
拳頭遊戲
官方給出了一份技術說明:
從說明中來看,拳頭表示線上下場館比賽時加入了一個
人工延遲工具
調整ping值。
由於人工延遲工具的程式碼運算出現錯誤,導致線下ping值過高,目前已透過調節配置修復,但遊戲中顯示的ping值會因為這一配置調節出現問題。
具體人工延遲工具
(鎖ping)
的技術程式碼,目前拳頭遊戲並未公開。不過GitHub上也已經有人做過人工延遲工具,如下面這個
clumsy
開源模擬器,可以模擬延遲、丟包等bug。感興趣的小夥伴可以去看看:
One More Thing
在自己的主頁上,Muuse還po出了另一個與“ping”相關的小趣事。
早在
1933年
,美國兒童圖畫書作家Marjorie Flack就曾經出版過一個繪本:《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 · 頭條號簽約