1. 程式人生 > >一道面試題了解計算機網路

一道面試題了解計算機網路

本文是我在公司做的計算機網路知識的分享,特整理成文章供以後學習。本文內容大部分來自網上,並非完全原創,參考連結已經放到文章結尾處。


今天分享的主題是計算機網路。

我們先從一個經典的面試題開始講起。 當我們輸入URL,按下回車發生了什麼?例如https://www.baidu.com

這是一個網址,瀏覽器的第一步是就是把網址解析成URL。這裡我們講第一個概念。

網址指因特網上網站的地址。將一些資訊儲存在網站上,所有開放資源都有一個相應的介面,以便其他使用者訪詢而獲取資訊資料,這樣的地址叫做網站地址。如果要從一臺計算機訪問網上另一臺計算機,就必須知道對方的網址。這裡所說的網址實際上指兩個內涵,即IP和域名。 通用網址、域名、網站地址的三者是不同的概念,最基礎的是域名。註冊一個通用網址,你必須先要註冊你的域名,提交給註冊服務機構,這樣通用網址就可以指向你提供的網站地址。

解析URL

網站地址是用將通向網站的地址用所屬網際網路型別(如最常見的www(全球資訊網)等)訪問協議+域名的形式表達出來。

url是統一資源定位符,對可以從網際網路上得到的資源的位置和訪問方法的一種簡潔的表示,是網際網路上標準資源的地址。網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它。

URL地址的格式為協議://使用者名稱:密碼@子域名.域名.頂級域名:埠號/目錄/檔名.檔案字尾?引數=值#標誌

我們從URL的地址就可以知道要傳輸的資料的協議型別,埠號,目標檔案等。但是目前瀏覽器的位址列中的地址還不是URL,因為我們通過www.baidu.com

這樣的字串獲取到目標的IP。這時候我們需要DNS解析了。

DNS解析

不知道大家有沒有做過自己的網站。我第一次做網站的時候,在萬網註冊了一個域名www.gaoyakang.tk,並給了我一個DNS伺服器的地址。 但是這時候我並不能釋出我的網站程式碼,萬網的幫助中心說了我需要一個伺服器來發佈網站。 於是我到阿里雲上買了一個伺服器,把我網站的原始碼放在了上面。這時候阿里雲提示我要做一個DNS解析,因為現在伺服器指向的是阿里預設的域名。於是我按照提示,在我的伺服器上填上了我域名和DNS伺服器值,然後輸入我的域名之後就可以訪問到網站了。

我們反過來看剛才那一個步驟,瀏覽器對於這個網址首先要去瀏覽器的快取中查詢對應的IP地址,如果沒有再去本機系統的Hosts檔案中查詢對應的IP地址,如果沒有就去路由器中查詢,如果還是沒有就去DNS伺服器中去找到這個域名對應的IP地址。經過這一系列的步驟我們拿到了最終的IP地址。

IP協議

IP地址對應的是IP協議,我們講第二個概念。

IP協議是將多個包交換網路連線起來,它在源地址和目的地址之間傳送一種稱之為資料包的東西,它還提供對資料大小的重新組裝功能,以適應不同網路對包大小的要求。 IP不提供可靠的傳輸服務,它不提供端到端的或(路由)結點到(路由)結點的確認,對資料沒有差錯控制,它只使用報頭的校驗碼,它不提供重發和流量控制。如果出錯可以通過ICMP報告,ICMP在IP模組中實現。

IP報文.jpg

IP協議的報文如圖所示。在TCP/IP報文中IP報文是包住TCP報文的

IP資料報分配

標識、標誌、分偏移這三個欄位幫助標識由IPv4主機發送的資料報,這三個欄位對實現分片很重要。因為大多數資料鏈路層不支援過長的IP資料報,所以要把IP資料報分片,分片之後的資料報每一片都是一個獨立的ipv4資料報。

傳送主機每次傳送資料報都講一個“內部計數器”加1,然後將數值複製“標識”欄位中。

ARP地址解析

現在我們有了IP地址,我們知道我需要請求的資源在什麼地方了,但是資料並不會直接根據IP就能直接到伺服器。IP地址類似於收貨地址,只有收貨地址我們當然收不到快遞了。我們需要知道去到這個地址應該走什麼樣的路線。那麼這時候起作用的就是ARP協議了。

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取實體地址的一個TCP/IP協議主機傳送資訊時將包含目標IP地址的ARP請求廣播到網路上的所有主機,並接收返回訊息,以此確定目標的實體地址

傳送ARP請求,我們需要有一個目標IP地址,同時還需要知道用於傳送ARP廣播的介面的Mac地址。每個網路裝置都有一個MAC地址,用來唯一標識一臺裝置。APR解析的工作過程大致如下:

  • 首先查詢ARP快取,如果快取命中,我們返回結果:目標IP = MAC

    如果快取沒有命中,就進行如下操作:

  • 檢視路由表,看看目標IP地址是不是在本地路由表中的某個子網內。是的話,使用跟那個子網相連的介面,否則使用與預設閘道器相連的介面。

  • 查詢選擇的網路介面的MAC地址

  • 我們傳送一個二層ARP請求:

在TCP/IP協議報文中,MAC地址是在Ethenet幀頭裡面的。

現在我們有了DNS伺服器或者預設閘道器的IP地址,我們可以繼續DNS請求了:

  • 使用53埠向DNS伺服器傳送UDP請求包,如果響應包太大,會使用TCP協議

  • 如果本地/ISP DNS伺服器沒有找到結果,它會發送一個遞迴查詢請求,一層一層向高層DNS伺服器做查詢,直到查詢到起始授權機構,如果找到會把結果返回。

使用套接字

當瀏覽器得到了目標伺服器的IP地址,以及URL中給出來埠號(http協議預設埠號是80, https預設埠號是443),它會呼叫系統庫函式 socket ,請求一個TCP流套接字,對應的引數是 AF_INETSOCK_STREAM

  • 這個請求首先被交給傳輸層,在傳輸層請求被封裝成TCP segment。目標埠會被加入頭部,源埠會在系統核心的動態埠範圍內選取(Linux下是ip_local_port_range)

  • TCP segment被送往網路層,網路層會在其中再加入一個IP頭部,裡面包含了目標伺服器的IP地址以及本機的IP地址,把它封裝成一個TCP packet。

  • 這個TCP packet接下來會進入鏈路層,鏈路層會在封包中加入frame頭部,裡面包含了本地內建網絡卡的MAC地址以及閘道器(本地路由器)的MAC地址。像前面說的一樣,如果核心不知道閘道器的MAC地址,它必須進行ARP廣播來查詢其地址。

  到了現在,TCP封包已經準備好了,可以進行傳輸了。

資料包傳輸

通常情況下,封包會從本地計算機出發,經過本地網路,再通過調變解調器(modem)把數字訊號轉換成模擬訊號,使其適於在電話線路,有線電視光纜和無線電話線路上傳輸。在傳輸線路的另一端,是另外一個調變解調器,它把模擬訊號轉換回數字訊號,交由下一個 網路節點 處理。

最終封包會到達管理本地子網的路由器。在那裡出發,它會繼續經過自治區域的邊界路由器和其他自治區域,最終到達目標伺服器。一路上經過的這些路由器會從IP資料報頭部裡提取出目標地址,並將封包正確地路由到下一個目的地。IP資料報頭部TTL域的值每經過一個路由器就減1,如果封包的TTL變為0,或者路由器由於網路擁堵等原因封包佇列滿了,那麼這個包會被路由器丟棄。

上面的傳送和接受過程在TCP連線期間會發生很多次。

建立TCP連線

在TCP連線之前我們先看一下TCP報文的格式:

TCP報文.jpg

TCP首部一些重要欄位:
序號(ISN):用於標識每個報文段,使目的主機可確認已收到指定報文段中的資料。當源主機用於多個報文段傳送一個報文時,即使這些報文到達目的主機的順序不一樣,序列號也可以使目的主機按順序排列它們。

同步(SYN):僅在三次握手建立 TCP 連線時有效。當 SYN = 1 而 ACK = 0 時,表明這是一個連線請求報文段,對方若同意建立連線,則應在相應的報文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示這是一個連線請求或連線接受報文。

終止(FIN):用來釋放一個連線。當 FIN = 1 時,表明此報文段的傳送方的資料已經發送完畢,並要求釋放運輸連線。

資料包到達客戶端後需要建立連線。TCP連線過程就是著名的三次握手。

  • 客戶端選擇一個初始序列號(ISN),將設定了SYN位的封包傳送給伺服器端,表明自己要建立連線並設定了初始序列號

  • 伺服器端接受到SYN包

  • 伺服器端選擇它自己的初始序列號伺服器端設定SYN位,表明自己選擇了一個初始序列號伺服器端把 (客戶端ISN + 1) 複製到ACK域,並且設定ACK位,表明自己接收到了客戶端的第一個封包
  • 客戶端通過傳送下面一個封包來確認這次連線:自己的序列號+1接收端ACK+1設定ACK位

資料通過下面的方式傳輸:
當一方傳送了N個Bytes的資料之後,將自己的SEQ序列號也增加N另一方確認接收到這個資料包(或者一系列資料包)之後,它傳送一個ACK包,ACK的值設定為接收到的資料包的最後一個序列號

關閉連線的過程就是也很著名的四次握手:
要關閉連線的一方傳送一個FIN包另一方確認這個FIN包,並且傳送自己的FIN包要關閉的一方使用ACK包來確認接收到了FIN。

HTTP伺服器請求處理

HTTPD(HTTP Daemon)在伺服器端處理請求/相應。最常見的 HTTPD 有 Linux 上常用的 Apache 和 nginx,與 Windows 上的 IIS。

  • HTTPD接收請求
    • 伺服器把請求拆分為以下幾個引數:
      HTTP請求方法(GET, POST, HEAD, PUT 和 DELETE )。在訪問百度這種情況下,使用的是GET方法域名:baidu.com請求路徑/頁面:/ (我們沒有請求baidu.com下的指定的頁面,因此 / 是預設的路徑)
  • 伺服器驗證其上已經配置了baidu.com的虛擬主機
  • 伺服器驗證baidu.com接受GET方法
  • 伺服器驗證該使用者可以使用GET方法(根據IP地址,身份資訊等)
  • 如果伺服器安裝了 URL 重寫模組(例如 Apache 的 mod_rewrite 和 IIS 的 URL Rewrite),伺服器會嘗試匹配重寫規則,如果匹配上的話,伺服器會按照規則重寫這個請求
  • 伺服器根據請求資訊獲取相應的響應內容,這種情況下由於訪問路徑是 "/" ,會訪問首頁檔案。(你可以重寫這個規則,但是這個是最常用的)
  • 伺服器會使用指定的處理程式分析處理這個檔案,比如假設baidu使用Java,伺服器會使用Java解析index檔案,並捕獲輸出,把Java的輸出結果給請求者。

最終瀏覽器會把HTML文件的結果渲染到瀏覽器的介面上。


相關連結:
HTTP長連線、短連線究竟是什麼?
當我們輸入URL,按下回車發生了什麼?
在瀏覽器中輸入Google.com並且按下回車之後發生了什麼?
TCP和UDP報文分片的區別
TCP/IP協議、HTTP協議、SOCKET通訊詳解