搞定計算機網路面試,看這篇就夠了(補充版)

SnailClimb發表於2018-08-21

相對與上一個版本的計算機網路面試知識總結,這個版本增加了 “TCP 協議如何保證可靠傳輸”包括超時重傳、停止等待協議、滑動視窗、流量控制、擁塞控制等內容並且對一些已有內容做了補充。

一 OSI與TCP/IP各層的結構與功能,都有哪些協議

五層協議的體系結構

學習計算機網路時我們一般採用折中的辦法,也就是中和 OSI 和 TCP/IP 的優點,採用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚。

五層協議的體系結構

結合網際網路的情況,自上而下地,非常簡要的介紹一下各層的作用。

1 應用層

應用層(application-layer)的任務是通過應用程式間的互動來完成特定網路應用。應用層協議定義的是應用程式(程式:主機中正在執行的程式)間的通訊和互動的規則。對於不同的網路應用需要不同的應用層協議。在網際網路中應用層協議很多,如域名系統 DNS,支援全球資訊網應用的 HTTP 協議,支援電子郵件的 SMTP 協議等等。我們把應用層互動的資料單元稱為報文。

域名系統

域名系統(Domain Name System縮寫 DNS,Domain Name被譯為域名)是因特網的一項核心服務,它作為可以將域名和IP地址相互對映的一個分散式資料庫,能夠使人更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串。(百度百科)例如:一個公司的 Web 網站可看作是它在網上的門戶,而域名就相當於其門牌地址,通常域名都使用該公司的名稱或簡稱。例如上面提到的微軟公司的域名,類似的還有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等。

HTTP協議

超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的 WWW(全球資訊網) 檔案都必須遵守這個標準。設計 HTTP 最初的目的是為了提供一種釋出和接收 HTML 頁面的方法。(百度百科)

2 運輸層

運輸層(transport layer)的主要任務就是負責向兩臺主機程式之間的通訊提供通用的資料傳輸服務。應用程式利用該服務傳送應用層報文。“通用的”是指並不針對某一個特定的網路應用,而是多種應用可以使用同一個運輸層服務。由於一臺主機可同時執行多個執行緒,因此運輸層有複用和分用的功能。所謂複用就是指多個應用層程式可同時使用下面運輸層的服務,分用和複用相反,是運輸層把收到的資訊分別交付上面應用層中的相應程式。

運輸層主要使用以下兩種協議

  1. 傳輸控制協議 TCP(Transmisson Control Protocol)–提供面向連線的,可靠的資料傳輸服務。
  2. 使用者資料協議 UDP(User Datagram Protocol)–提供無連線的,盡最大努力的資料傳輸服務(不保證資料傳輸的可靠性)。

UDP 的主要特點

  1. UDP 是無連線的;
  2. UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態(這裡面有許多引數);
  3. UDP 是面向報文的;
  4. UDP 沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如 直播,實時視訊會議等);
  5. UDP 支援一對一、一對多、多對一和多對多的互動通訊;
  6. UDP 的首部開銷小,只有8個位元組,比TCP的20個位元組的首部要短。

TCP 的主要特點

  1. TCP 是面向連線的。(就好像打電話一樣,通話前需要先撥號建立連線,通話結束後要掛機釋放連線);
  2. 每一條 TCP 連線只能有兩個端點,每一條TCP連線只能是點對點的(一對一);
  3. TCP 提供可靠交付的服務。通過TCP連線傳送的資料,無差錯、不丟失、不重複、並且按序到達;
  4. TCP 提供全雙工通訊。TCP 允許通訊雙方的應用程式在任何時候都能傳送資料。TCP 連線的兩端都設有傳送快取和接收快取,用來臨時存放雙方通訊的資料;
  5. 面向位元組流。TCP 中的“流”(Stream)指的是流入程式或從程式流出的位元組序列。“面向位元組流”的含義是:雖然應用程式和 TCP 的互動是一次一個資料塊(大小不等),但 TCP 把應用程式交下來的資料僅僅看成是一連串的無結構的位元組流。

3 網路層

網路層(network layer)負責為分組交換網上的不同主機提供通訊服務。 在傳送資料時,網路層把運輸層產生的報文段或使用者資料包封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網路層使用 IP 協議,因此分組也叫 IP 資料包 ,簡稱 資料包

這裡要注意:不要把運輸層的“使用者資料包 UDP ”和網路層的“ IP 資料包”弄混。另外,無論是哪一層的資料單元,都可籠統地用“分組”來表示。

網路層的另一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分株,能通過網路層中的路由器找到目的主機。

這裡強調指出,網路層中的“網路”二字已經不是我們通常談到的具體網路,而是指計算機網路體系結構模型中第三層的名稱.

網際網路是由大量的異構(heterogeneous)網路通過路由器(router)相互連線起來的。網際網路使用的網路層協議是無連線的網際協議(Intert Prococol)和許多路由選擇協議,因此網際網路的網路層也叫做網際層IP層

4 資料鏈路層

資料鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的資料傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。 在兩個相鄰節點之間傳送資料時,資料鏈路層將網路層交下來的 IP 資料包組裝程幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括資料和必要的控制資訊(如同步資訊,地址資訊,差錯控制等)。

在接收資料時,控制資訊使接收端能夠知道一個幀從哪個位元開始和到哪個位元結束。這樣,資料鏈路層在收到一個幀後,就可從中提出資料部分,上交給網路層。控制資訊還使接收端能夠檢測到所收到的幀中有誤差錯。如果發現差錯,資料鏈路層就簡單地丟棄這個出了差錯的幀,以避免繼續在網路中傳送下去白白浪費網路資源。如果需要改正資料在鏈路層傳輸時出現差錯(這就是說,資料鏈路層不僅要檢錯,而且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。

5 物理層

在物理層上所傳送的資料單位是位元。物理層(physical layer)的作用是實現相鄰計算機節點之間位元流的透明傳送,儘可能遮蔽掉具體傳輸介質和物理裝置的差異。 使其上面的資料鏈路層不必考慮網路的具體傳輸介質是什麼。“透明傳送位元流”表示經實際電路傳送後的位元流沒有發生變化,對傳送的位元流來說,這個電路好像是看不見的。

在網際網路使用的各種協中最重要和最著名的就是 TCP/IP 兩個協議。現在人們經常提到的TCP/IP並不一定單指TCP和IP這兩個具體的協議,而往往表示網際網路所使用的整個TCP/IP協議族。

總結一下

上面我們對計算機網路的五層體系結構有了初步的瞭解,下面附送一張七層體系結構圖總結一下。圖片來源:blog.csdn.net/yaopeng_200…

七層體系結構圖

二 TCP 三次握手和四次揮手(面試常客)

為了準確無誤地把資料送達目標處,TCP協議採用了三次握手策略。

漫畫圖解:

圖片來源:《圖解HTTP》

TCP三次握手

簡單示意圖:

TCP三次握手
  • 客戶端–傳送帶有 SYN 標誌的資料包–一次握手–服務端
  • 服務端–傳送帶有 SYN/ACK 標誌的資料包–二次握手–客戶端
  • 客戶端–傳送帶有帶有 ACK 標誌的資料包–三次握手–服務端

為什麼要三次握手

三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收是正常的。

第一次握手:Client 什麼都不能確認;Server 確認了對方傳送正常

第二次握手:Client 確認了:自己傳送、接收正常,對方傳送、接收正常;Server 確認了:自己接收正常,對方傳送正常

第三次握手:Client 確認了:自己傳送、接收正常,對方傳送、接收正常;Server 確認了:自己傳送、接收正常,對方傳送接收正常

所以三次握手就能確認雙發收發功能都正常,缺一不可。

為什麼要傳回 SYN

接收端傳回傳送端所傳送的 SYN 是為了告訴傳送端,我接收到的資訊確實就是你所傳送的訊號了。

傳了 SYN,為啥還要傳 ACK

雙方通訊無誤必須是兩者互相傳送資訊都無誤。傳了 SYN,證明傳送方到接收方的通道沒有問題,但是接收方到傳送方的通道還需要 ACK 訊號來進行驗證。

SYN 是 TCP/IP 建立連線時使用的握手訊號。在客戶機和伺服器之間建立正常的 TCP 網路連線時,客戶機首先發出一個 SYN 訊息,伺服器使用 SYN-ACK 應答表示接收到了這個訊息,最後客戶機再以 ACK(Acknowledgement[漢譯:確認字元 ,在資料通訊傳輸中,接收站發給傳送站的一種傳輸控制字元。它表示確認發來的資料已經接受無誤。 ])訊息響應。這樣在客戶機和伺服器之間才能建立起可靠的TCP連線,資料才可以在客戶機和伺服器之間傳遞。

TCP四次揮手

斷開一個 TCP 連線則需要“四次揮手”:

  • 客戶端-傳送一個 FIN,用來關閉客戶端到伺服器的資料傳送
  • 伺服器-收到這個 FIN,它發回一 個 ACK,確認序號為收到的序號加1 。和 SYN 一樣,一個 FIN 將佔用一個序號
  • 伺服器-關閉與客戶端的連線,傳送一個FIN給客戶端
  • 客戶端-發回 ACK 報文確認,並將確認序號設定為收到序號加1

為什麼要四次揮手

任何一方都可以在資料傳送結束後發出連線釋放的通知,待對方確認後進入半關閉狀態。當另一方也沒有資料再傳送的時候,則發出連線釋放通知,對方確認後就完全關閉了TCP連線。

舉個例子:A 和 B 打電話,通話即將結束後,A 說“我沒啥要說的了”,B回答“我知道了”,但是 B 可能還會有要說的話,A 不能要求 B 跟著自己的節奏結束通話,於是 B 可能又巴拉巴拉說了一通,最後 B 說“我說完了”,A 回答“知道了”,這樣通話才算結束。

上面講的比較概括,推薦一篇講的比較細緻的文章:blog.csdn.net/qzcsu/artic…

三 TCP、UDP 協議的區別

TCP、UDP協議的區別

UDP 在傳送資料之前不需要先建立連線,遠地主機在收到 UDP 報文後,不需要給出任何確認。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 確是一種最有效的工作方式(一般用於即時通訊),比如: QQ 語音、 QQ 視訊 、直播等等

TCP 提供面向連線的服務。在傳送資料之前必須先建立連線,資料傳送結束後要釋放連線。 TCP 不提供廣播或多播服務。由於 TCP 要提供可靠的,面向連線的運輸服務(TCP的可靠體現在TCP在傳遞資料之前,會有三次握手來建立連線,而且在資料傳遞時,有確認、視窗、重傳、擁塞控制機制,在資料傳完後,還會斷開連線用來節約系統資源),這一難以避免增加了許多開銷,如確認,流量控制,計時器以及連線管理等。這不僅使協議資料單元的首部增大很多,還要佔用許多處理機資源。TCP 一般用於檔案傳輸、傳送和接收郵件、遠端登入等場景。

四 TCP 協議如何保證可靠傳輸

  1. 應用資料被分割成 TCP 認為最適合傳送的資料塊。
  2. TCP 給傳送的每一個包進行編號,接收方對資料包進行排序,把有序資料傳送給應用層。
  3. 校驗和: TCP 將保持它首部和資料的檢驗和。這是一個端到端的檢驗和,目的是檢測資料在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP 將丟棄這個報文段和不確認收到此報文段。
  4. TCP 的接收端會丟棄重複的資料。
  5. 流量控制: TCP 連線的每一方都有固定大小的緩衝空間,TCP的接收端只允許傳送端傳送接收端緩衝區能接納的資料。當接收方來不及處理髮送方的資料,能提示傳送方降低傳送的速率,防止包丟失。TCP 使用的流量控制協議是可變大小的滑動視窗協議。 (TCP 利用滑動視窗實現流量控制)
  6. 擁塞控制: 當網路擁塞時,減少資料的傳送。
  7. 停止等待協議 也是為了實現可靠傳輸的,它的基本原理就是每發完一個分組就停止傳送,等待對方確認。在收到確認後再發下一個分組。 超時重傳: 當 TCP 發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。

停止等待協議

  • 停止等待協議是為了實現可靠傳輸的,它的基本原理就是每發完一個分組就停止傳送,等待對方確認。在收到確認後再發下一個分組;
  • 在停止等待協議中,若接收方收到重複分組,就丟棄該分組,但同時還要傳送確認;

1) 無差錯情況:

搞定計算機網路面試,看這篇就夠了(補充版)

傳送方傳送分組,接收方在規定時間內收到,並且回覆確認.傳送方再次傳送。

2) 出現差錯情況(超時重傳):

搞定計算機網路面試,看這篇就夠了(補充版)

停止等待協議中超時重傳是指只要超過一段時間仍然沒有收到確認,就重傳前面傳送過的分組(認為剛才傳送過的分組丟失了)。因此每傳送完一個分組需要設定一個超時計時器,其重轉時間應比資料在分組傳輸的平均往返時間更長一些。這種自動重傳方式常稱為 自動重傳請求 ARQ 。另外在停止等待協議中若收到重複分組,就丟棄該分組,但同時還要傳送確認。連續 ARQ 協議 可提高通道利用率。傳送維持一個傳送視窗,凡位於傳送視窗內的分組可連續傳送出去,而不需要等待對方確認。接收方一般採用累積確認,對按序到達的最後一個分組傳送確認,表明到這個分組位置的所有分組都已經正確收到了。

3) 確認丟失和確認遲到

  • 確認丟失:確認訊息在傳輸過程丟失

    搞定計算機網路面試,看這篇就夠了(補充版)

    當A傳送M1訊息,B收到後,B向A傳送了一個M1確認訊息,但卻在傳輸過程中丟失。而A並不知道,在超時計時過後,A重傳M1訊息,B再次收到該訊息後採取以下兩點措施:

    1. 丟棄這個重複的M1訊息,不向上層交付。
    2. 向A傳送確認訊息。(不會認為已經傳送過了,就不再傳送。A能重傳,就證明B的確認訊息丟失)。
  • 確認遲到 :確認訊息在傳輸過程中遲到

    搞定計算機網路面試,看這篇就夠了(補充版)

    A傳送M1訊息,B收到併傳送確認。在超時時間內沒有收到確認訊息,A重傳M1訊息,B仍然收到並繼續傳送確認訊息(B收到了2份M1)。此時A收到了B第二次傳送的確認訊息。接著傳送其他資料。過了一會,A收到了B第一次傳送的對M1的確認訊息(A也收到了2份確認訊息)。處理如下:

    1. A收到重複的確認後,直接丟棄。
    2. B收到重複的M1後,也直接丟棄重複的M1。

自動重傳請求 ARQ 協議

停止等待協議中超時重傳是指只要超過一段時間仍然沒有收到確認,就重傳前面傳送過的分組(認為剛才傳送過的分組丟失了)。因此每傳送完一個分組需要設定一個超時計時器,其重轉時間應比資料在分組傳輸的平均往返時間更長一些。這種自動重傳方式常稱為自動重傳請求ARQ。

優點: 簡單

缺點: 通道利用率低

連續ARQ協議

連續 ARQ 協議可提高通道利用率。傳送方維持一個傳送視窗,凡位於傳送視窗內的分組可以連續傳送出去,而不需要等待對方確認。接收方一般採用累計確認,對按序到達的最後一個分組傳送確認,表明到這個分組為止的所有分組都已經正確收到了。

優點: 通道利用率高,容易實現,即使確認丟失,也不必重傳。

缺點: 不能向傳送方反映出接收方已經正確收到的所有分組的資訊。 比如:傳送方傳送了 5條 訊息,中間第三條丟失(3號),這時接收方只能對前兩個傳送確認。傳送方無法知道後三個分組的下落,而只好把後三個全部重傳一次。這也叫 Go-Back-N(回退 N),表示需要退回來重傳已經傳送過的 N 個訊息。

滑動視窗

  • TCP 利用滑動視窗實現流量控制的機制。
  • 滑動視窗(Sliding window)是一種流量控制技術。早期的網路通訊中,通訊雙方不會考慮網路的擁擠情況直接傳送資料。由於大家不知道網路擁塞狀況,同時傳送資料,導致中間節點阻塞掉包,誰也發不了資料,所以就有了滑動視窗機制來解決此問題。
  • TCP 中採用滑動視窗來進行傳輸控制,滑動視窗的大小意味著接收方還有多大的緩衝區可以用於接收資料。傳送方可以通過滑動視窗的大小來確定應該傳送多少位元組的資料。當滑動視窗為 0 時,傳送方一般不能再傳送資料包,但有兩種情況除外,一種情況是可以傳送緊急資料,例如,允許使用者終止在遠端機上的執行程式。另一種情況是傳送方可以傳送一個 1 位元組的資料包來通知接收方重新宣告它希望接收的下一位元組及傳送方的滑動視窗大小。

流量控制

  • TCP 利用滑動視窗實現流量控制。
  • 流量控制是為了控制傳送方傳送速率,保證接收方來得及接收。
  • 接收方傳送的確認報文中的視窗欄位可以用來控制傳送方視窗大小,從而影響傳送方的傳送速率。將視窗欄位設定為 0,則傳送方不能傳送資料。

擁塞控制

在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就要變壞。這種情況就叫擁塞。擁塞控制就是為了防止過多的資料注入到網路中,這樣就可以使網路中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提,就是網路能夠承受現有的網路負荷。擁塞控制是一個全域性性的過程,涉及到所有的主機,所有的路由器,以及與降低網路傳輸效能有關的所有因素。相反,流量控制往往是點對點通訊量的控制,是個端到端的問題。流量控制所要做到的就是抑制傳送端傳送資料的速率,以便使接收端來得及接收。

為了進行擁塞控制,TCP 傳送方要維持一個 擁塞視窗(cwnd) 的狀態變數。擁塞控制視窗的大小取決於網路的擁塞程度,並且動態變化。傳送方讓自己的傳送視窗取為擁塞視窗和接收方的接受視窗中較小的一個。

TCP的擁塞控制採用了四種演算法,即 慢開始擁塞避免快重傳快恢復。在網路層也可以使路由器採用適當的分組丟棄策略(如主動佇列管理 AQM),以減少網路擁塞的發生。

  • 慢開始: 慢開始演算法的思路是當主機開始傳送資料時,如果立即把大量資料位元組注入到網路,那麼可能會引起網路阻塞,因為現在還不知道網路的符合情況。經驗表明,較好的方法是先探測一下,即由小到大逐漸增大傳送視窗,也就是由小到大逐漸增大擁塞視窗數值。cwnd初始值為1,每經過一個傳播輪次,cwnd加倍。
    搞定計算機網路面試,看這篇就夠了(補充版)
  • 擁塞避免: 擁塞避免演算法的思路是讓擁塞視窗cwnd緩慢增大,即每經過一個往返時間RTT就把傳送放的cwnd加1.
  • 快重傳與快恢復:在 TCP/IP 中,快速重傳和恢復(fast retransmit and recovery,FRR)是一種擁塞控制演算法,它能快速恢復丟失的資料包。沒有 FRR,如果資料包丟失了,TCP 將會使用定時器來要求傳輸暫停。在暫停的這段時間內,沒有新的或複製的資料包被髮送。有了 FRR,如果接收機接收到一個不按順序的資料段,它會立即給傳送機傳送一個重複確認。如果傳送機接收到三個重複確認,它會假定確認件指出的資料段丟失了,並立即重傳這些丟失的資料段。有了 FRR,就不會因為重傳時要求的暫停被耽誤。  當有單獨的資料包丟失時,快速重傳和恢復(FRR)能最有效地工作。當有多個資料資訊包在某一段很短的時間內丟失時,它則不能很有效地工作。
    快重傳與快恢復

五 在瀏覽器中輸入url地址 ->
>
顯示主頁的過程(面試常客)

百度好像最喜歡問這個問題。

開啟一個網頁,整個過程會使用哪些協議

圖片來源:《圖解HTTP》

狀態碼

六 狀態碼

狀態碼

七 各種協議與HTTP協議之間的關係

一般面試官會通過這樣的問題來考察你對計算機網路知識體系的理解。

圖片來源:《圖解HTTP》

各種協議與HTTP協議之間的關係

八 HTTP長連線、短連線

在HTTP/1.0中預設使用短連線。也就是說,客戶端和伺服器每進行一次HTTP操作,就建立一次連線,任務結束就中斷連線。當客戶端瀏覽器訪問的某個HTML或其他型別的Web頁中包含有其他的Web資源(如JavaScript檔案、影像檔案、CSS檔案等),每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話。

而從HTTP/1.1起,預設使用長連線,用以保持連線特性。使用長連線的HTTP協議,會在響應頭加入這行程式碼:

Connection:keep-alive複製程式碼

在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,客戶端再次訪問這個伺服器時,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實現長連線需要客戶端和服務端都支援長連線。

HTTP協議的長連線和短連線,實質上是TCP協議的長連線和短連線。

—— 《HTTP長連線、短連線究竟是什麼?》

寫在最後

計算機網路常見問題回顧

  • ①TCP三次握手和四次揮手、
  • ②在瀏覽器中輸入url地址->
    >
    顯示主頁的過程
  • ③HTTP和HTTPS的區別
  • ④TCP、UDP協議的區別
  • ⑤常見的狀態碼。

建議

非常推薦大家看一下 《圖解HTTP》 這本書,這本書頁數不多,但是內容很是充實,不管是用來系統的掌握網路方面的一些知識還是說純粹為了應付面試都有很大幫助。下面的一些文章只是參考。大二學習這門課程的時候,我們使用的教材是 《計算機網路第七版》(謝希仁編著),不推薦大家看這本教材,書非常厚而且知識偏理論,不確定大家能不能心平氣和的讀完。

開源文件推薦

Java-Guide:一份涵蓋大部分Java程式設計師所需要掌握的核心知識,正在一步一步慢慢完善,期待您的參與。

Github地址:github.com/Snailclimb/…

參考:

blog.csdn.net/qq_16209077…

blog.csdn.net/zixiaomuwu/…

blog.csdn.net/turn__back/…

你若盛開,清風自來。 歡迎關注我的微信公眾號:“Java面試通關手冊”,一個有溫度的微信公眾號。公眾號有大量資料,回覆關鍵字“1”你可能看到想要的東西哦!

搞定計算機網路面試,看這篇就夠了(補充版)

來源:https://juejin.im/post/5b7be0b2e51d4538db34a51e

相關文章