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

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

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

五層協議的體系結構

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

五層協議的體系結構

結合互聯網的狀況,自上而下地,很是簡要的介紹一下各層的做用。程序員

1 應用層

應用層(application-layer)的任務是經過應用進程間的交互來完成特定網絡應用。應用層協議定義的是應用進程(進程:主機中正在運行的程序)間的通訊和交互的規則。對於不一樣的網絡應用須要不一樣的應用層協議。在互聯網中應用層協議不少,如域名系統 DNS,支持萬維網應用的 HTTP 協議,支持電子郵件的 SMTP 協議等等。咱們把應用層交互的數據單元稱爲報文。github

域名系統

域名系統(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 支持一對1、一對多、多對一和多對多的交互通訊;
  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 數據報」弄混。另外,不管是哪一層的數據單元,均可籠統地用「分組」來表示。緩存

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

這裏強調指出,網絡層中的「網絡」二字已經不是咱們一般談到的具體網絡,而是指計算機網絡體系結構模型中第三層的名稱.

互聯網是由大量的異構(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」你可能看到想要的東西哦!

相關文章
相關標籤/搜索