網易遊戲面試經驗(三)

前言

從我面試的經驗來看,網易這個公司是很會深究的一個公司,會努力在一個點上將面試者問倒的公司,因此對於網易遊戲的面經我不會傾向於簡單的羅列問題,而是對他們提出的問題從原理上進行深度的理解。正由於被他們問的很深,因此對於問的問題我有很深的印象,前面的兩篇博客分別是關於python的特性,關於python的部門尚未完,後續還會再寫一些面試題目的,今天要說的是一個網絡程序——traceroute,面試官當時讓我講述traceroute的原理,這個在以前我知道他使用ICMP結合TTL來實現的,實現也是至關巧妙,今天的博文參考TCP/IP詳解卷一,來完全的搞清楚這個程序。python

正文

在Windows下,相同的功能的實現命令爲:tracert,首先相當的感覺下traceroute命令的效果。我執行了兩次tracerout百度的命令,結果以下:

根據上面的執行結果包括對於程序的名字traceroute相信沒有接觸過這個命令的人也能夠大致猜出來這個命令的做用——路由跟蹤,即肯定IP數據包訪問目標所通過的路徑,固然這些路徑指的是路由器。對於執行結果的每一行來講,好比3 2ms 1ms 1ms 10.6.17.1表示從本機出發的第三跳路由器地址爲10.6.17.1,中間的三列時間顯示了RTT,即數據包到達此跳路由或主機再返回你的主機所須要的時間,單位是毫秒,爲何是三列呢?由於traceroute發送了三個獨立的數據包,統計出了每一個RTT,而國內不少博客在這裏存在誤區,認爲三列分別表明最小,平均和最大時間,有的時間欄沒有具體的數字,只是一個星號,這個可能有多種多樣的緣由,好比路由器禁止了ICMP數據包,traceroute程序自己就被用來發現網絡故障,若是從某跳開始全部的時間都成了星號,即超時,則網絡故障頗有可能就出如今了這一跳。從上面兩次執行結果能夠看到,traceroute命令執行的結果不是徹底相同的,這個也是很容易理解的,畢竟網絡是動態時時變化的。
Traceroute程序使用ICMP報文和IP首部中的TTL字段,TTL由發送端初始化,當路由器接收到一份IP數據包,若是TTL字段是0或者1,路由器將該數據包丟棄,並給源主機發一個ICMP「超時」信息。按照這個基本的相應過程,能夠猜測traceroute程序的完整過程,首先它發送一份TTL字段爲1的IP數據報給目的主機,處理這個數據報的第一個路由器將TTL值減1,而後丟棄該數據報,並給源主機發送一個ICMP報文,這個報文包含了路由器的IP地址,這樣就獲得了第一個路由器的地址,而後,traceroute發送一個TTL爲2的數據報來獲得第二個路由器的IP地址,繼續這個過程,直至這個數據報到達目的主機。按照這個原理咱們也能夠很好的解釋了上面tracert www.baidu.com的結果了,即全部顯示的13跳是從我到百度119.75.218.70這個服務器所通過的全部路由器的信息,並且因爲網絡是動態變化的,路徑也可能會發生變化,因此若是追蹤一樣的目的IP,發現不一樣的路徑當屬於正常狀況。
****
這裏必須加一條分割線,由於這個知識我相信不少人在很早以前就知道了,可是面試官的面試重點顯然不在上面的知識點,若是你回答了上述過程,面試官確定會接着問一個問題:目的主機在接收到TTL值爲1的IP數據報是不會丟失的吧,這樣也不會產生一個超時的ICMP數據報文了,那麼程序如何判斷是否已經到達目的主機了呢?
在Linux下,traceroute程序發送一個UDP數據報給目的主機,但它選擇一個不可能的值做爲UDP端口號(大於30000),使目的主機的任何一個應用程序都不可能使用該端口,所以,當該數據報達到目的主機的時候,目的主機會產生一個「端口不可達」錯誤的ICMP報文,這樣,traceroute程序要作的就是區分接收到的ICMP報文是超時仍是端口不可達,從而來區分是路由器仍是目的主機。
****
下面進行實驗驗證,仍然用上面的例子,用wireshark抓取數據報來驗證。因爲主機上有大量的數據報文,因此咱們根據本地IP地址和百度服務器的IP地址進行數據報過濾,按照個人例子過濾條件應該爲:ip.src==192.168.99.200&&ip.dst==119.75.218.70,首先總體看一個過濾以後的報文整體狀況,以下圖:

其中淺色背景的表示本機構造的ICMP數據報文,深色的表示超時ICMP報文,若是細心的人就會發現:所發送的數據報的數量要大於路徑上的路由器的數量,這個上文也提到過,每一跳都會發送三個報文,同時相應報文的數量少於構造報文數量,由於有些路由器禁止相應ICMP數據報,只提供轉發功能,全部本地發出的構造ICMP數據報源IP都是本地,目的IP都是百度的IP地址,全部相應的超時ICMP數據報的目的IP都是本地,源IP地址分爲爲路由器的IP地址,首先來看一個本機構造的ICMP數據報文:

在這個報文中,能夠注意他的TTL的值爲1,同時他填充的負載爲0,相同的報文會發送3次,接着再看這個報文的響應報文:

在這個響應報文中應該注意的點我都用紅色方框圈出來了。
關於最後肯定是否達到目的主機則和具體的操做系統有關係,在Windows下,我猜想他能夠經過正確的迴應ICMP數據報得出已經到達目的主機,而在Linux下面,則是經過上文所說的原理實現的,附圖以下:
面試

總結

關於traceroute的內容,若是在進行深究,還有不少不少,好比他能夠經過ICMP,TCP實現,在Windows下面達到目的主機以後會中止發送traceroute數據報,可是在Linux下,會持續發送30個TTL不一樣的數據報,每一個發送三個報文,在達到目的主機以前能夠發送ICMP,TCP等,可是在達到以後,開始發送UDP數據報,目的端口從大於30000的某個值開始,沒發送一個數據報則加一,這個從上面的截圖也能夠看出。
好公司在面試的時候都會揪住一個點問的很深很深,因此在本身的領域,將基礎知識必定要掌握的十分好。服務器

相關文章
相關標籤/搜索