計算機網絡高頻面試題解析(含書籍推薦)

網絡原理是工程師的必須瞭解的計算機基礎知識,先推薦下兩本好書,《圖解HTTP》和《圖解TCP/IP》。
《圖解TCP/IP》講解網絡基礎知識、TCP/IP基礎知識、數據鏈路、IP協議、IP協議相關技術、TCP與UDP、路由協議、應用協議、網絡安全等內容,《圖解HTTP》對HTTP協議進行了全面系統的介紹,
這兩本書的特色都是在講解的同時,配上了大量漫畫通訊圖例,讀起來比較輕鬆。面試

高頻面試題解析

一、OSI七層網絡模型的結構與功能

OSI是一個開放性的通訊系統互連參考模型,OSI 七層模型經過七個層次化的結構模型使不一樣的系統不一樣的網絡之間實現可靠的通信。
算法

OSI是一個定義得很是好的協議規範,可是比較複雜因此通常使用TCP/IP 的四層模型來描述。
就目前來講,TCP/IP 的四層模型更受普遍承認,在計算機網絡中,你們更多喜歡使用 TCP/IP 模型來進行劃分和理解。由於表示層、會話層以及應用層之間的界限在實際應用中並不清晰,讓人很差區分。
segmentfault

二、TCP/IP四層協議有哪些結構與功能

TCP/IP 參考模型是一個包含了不一樣網絡層次的一系列網絡協議的集合。通常 TCP/IP 參考考模型分爲四層,從下到上分別是,數據鏈路層、網絡層、傳輸層和應用層。瀏覽器

三種劃分方式的對應關係

也有將它分爲五層的,也就是加上物理層,不過對於大部分的計算機網絡應用,軟件工程師通常都是不關心物理層。緩存

四層協議

應用層提供了不一樣應用數據包的處理協議。常見的有 HTTP、FTP、DNS、Email、Telnet 等。安全

傳輸層爲應用程序提供了端到端的通訊服務,該層的協議有兩個:TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Datagram Protocol,用戶數據包協議)。其中 TCP 提供的是有鏈接可靠服務,UDP 提供的是無鏈接不可靠服務。服務器

網絡層也稱互聯網層,核心協議是 IP 協議,是路由算法工做的主要層。網絡

數據鏈路層包括了邏輯鏈路控制層(Logical Link Control,LLC)和介質訪問控制層(Media Access Control,MAC)兩個子層。LLC 負責識別網絡層協議,而後對它們進行封裝。LLC 報頭告訴數據鏈路層一旦幀被接收到時,應當對數據包作何處理。數據鏈路層還包括了設備驅動程序部分的內容。架構

三、五層協議的體系結構,都有哪些協議

上面說了四層協議,咱們在四層協議的基礎上再來詳細的說明下五層協議。
app

(1)應用層

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

(2)運輸層

運輸層(transport layer)的主要任務就是負責向兩臺主機進程之間的通訊提供通用的數據傳輸服務。應用進程利用該服務傳送應用層報文。「通用的」是指並不針對某一個特定的網絡應用,而是多種應用可使用同一個運輸層服務。因爲一臺主機可同時運行多個線程,所以運輸層有複用和分用的功能。所謂複用就是指多個應用層進程可同時使用下面運輸層的服務,分用和複用相反,是運輸層把收到的信息分別交付上面應用層中的相應進程。

運輸層主要使用如下兩種協議:
傳輸控制協議 TCP(Transmisson Control Protocol)--提供面向鏈接的,可靠的數據傳輸服務。
用戶數據協議 UDP(User Datagram Protocol)--提供無鏈接的,盡最大努力的數據傳輸服務(不保證數據傳輸的可靠性)。

(3)網絡層

網絡層(network layer)負責爲分組交換網上的不一樣主機提供通訊服務。 在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,因爲網絡層使用 IP 協議,所以分組也叫 IP 數據報 ,簡稱 數據報。
這裏要注意:不要把運輸層的「用戶數據報 UDP 」和網絡層的「 IP 數據報」弄混。另外,不管是哪一層的數據單元,均可籠統地用「分組」來表示。
網絡層的另外一個任務就是選擇合適的路由,使源主機運輸層所傳下來的分株,能經過網絡層中的路由器找到目的主機。
這裏強調指出,網絡層中的「網絡」二字已經不是咱們一般談到的具體網絡,而是指計算機網絡體系結構模型中第三層的名稱.
互聯網是由大量的異構(heterogeneous)網絡經過路由器(router)相互鏈接起來的。互聯網使用的網絡層協議是無鏈接的網際協議(Intert Prococol)和許多路由選擇協議,所以互聯網的網絡層也叫作網際層或IP層。

(4)數據鏈路層

數據鏈路層(data link layer)一般簡稱爲鏈路層。兩臺主機之間的數據傳輸,老是在一段一段的鏈路上傳送的,這就須要使用專門的鏈路層的協議。 在兩個相鄰節點之間傳送數據時,數據鏈路層將網絡層交下來的 IP 數據報組裝程幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。
在接收數據時,控制信息使接收端可以知道一個幀從哪一個比特開始和到哪一個比特結束。這樣,數據鏈路層在收到一個幀後,就可從中提出數據部分,上交給網絡層。
控制信息還使接收端可以檢測到所收到的幀中有偏差錯。若是發現差錯,數據鏈路層就簡單地丟棄這個出了差錯的幀,以免繼續在網絡中傳送下去白白浪費網絡資源。若是須要改正數據在鏈路層傳輸時出現差錯(這就是說,數據鏈路層不只要檢錯,並且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。

(5)物理層

在物理層上所傳送的數據單位是比特。
物理層(physical layer)的做用是實現相鄰計算機節點之間比特流的透明傳送,儘量屏蔽掉具體傳輸介質和物理設備的差別。 使其上面的數據鏈路層沒必要考慮網絡的具體傳輸介質是什麼。「透明傳送比特流」表示經實際電路傳送後的比特流沒有發生變化,對傳送的比特流來講,這個電路好像是看不見的。

四、TCP和UPD的主要特色對比

UDP 的主要特色
UDP 是無鏈接的;
UDP 使用盡最大努力交付,即不保證可靠交付,所以主機不須要維持複雜的連接狀態(這裏面有許多參數);
UDP 是面向報文的;
UDP 沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如 直播,實時視頻會議等);
UDP 支持一對1、一對多、多對一和多對多的交互通訊;
UDP 的首部開銷小,只有8個字節,比TCP的20個字節的首部要短。

TCP 的主要特色
TCP 是面向鏈接的。(就好像打電話同樣,通話前須要先撥號創建鏈接,通話結束後要掛機釋放鏈接);
每一條 TCP 鏈接只能有兩個端點,每一條TCP鏈接只能是點對點的(一對一);
TCP 提供可靠交付的服務。經過TCP鏈接傳送的數據,無差錯、不丟失、不重複、而且按序到達;
TCP 提供全雙工通訊。TCP 容許通訊雙方的應用進程在任什麼時候候都能發送數據。TCP 鏈接的兩端都設有發送緩存和接收緩存,用來臨時存放雙方通訊的數據;
面向字節流。TCP 中的「流」(Stream)指的是流入進程或從進程流出的字節序列。「面向字節流」的含義是:雖然應用程序和 TCP 的交互是一次一個數據塊(大小不等),但 TCP 把應用程序交下來的數據僅僅當作是一連串的無結構的字節流。

五、TCP 三次握手和四次揮手

爲了準確無誤地把數據送達目標處,TCP協議採用了三次握手策略。
咱們看一下《圖解HTTP》的漫畫圖解:

具體操做的示意圖:

客戶端–發送帶有 SYN 標誌的數據包–一次握手–服務端
服務端–發送帶有 SYN/ACK 標誌的數據包–二次握手–客戶端
客戶端–發送帶有帶有 ACK 標誌的數據包–三次握手–服務端

六、爲何要三次握手?

三次握手的目的是創建可靠的通訊信道,說到通信,簡單來講就是數據的發送與接收,而三次握手最主要的目的就是雙方確認本身與對方的發送與接收是正常的。
第一次握手:Client 什麼都不能確認;Server 確認了對方發送正常
第二次握手:Client 確認了:本身發送、接收正常,對方發送、接收正常;Server 確認了:本身接收正常,對方發送正常
第三次握手:Client 確認了:本身發送、接收正常,對方發送、接收正常;Server 確認了:本身發送、接收正常,對方發送接收正常
因此三次握手就能確認雙發收發功能都正常,缺一不可。

七、三次握手爲何要傳回 SYN,爲何要ACK

SYN 是 TCP/IP 創建鏈接時使用的握手信號。在客戶機和服務器之間創建正常的 TCP 網絡鏈接時,客戶機首先發出一個 SYN 消息,服務器使用 SYN-ACK 應答表示接收到了這個消息,最後客戶機再以 ACK(Acknowledgement 確認字符 )消息響應。這樣在客戶機和服務器之間才能創建起可靠的TCP鏈接,數據才能夠在客戶機和服務器之間傳遞。
接收端傳回發送端所發送的 SYN 是爲了告訴發送端,我接收到的信息確實就是你所發送的信號了。
雙方通訊無誤必須是二者互相發送信息都無誤。傳了 SYN,證實發送方到接收方的通道沒有問題,可是接收方到發送方的通道還須要 ACK 信號來進行驗證。

八、爲何要四次揮手

斷開一個 TCP 鏈接須要四次揮手:

  • 客戶端-發送一個 FIN,用來關閉客戶端到服務器的數據傳送
  • 服務器-收到這個 FIN,它發回一 個 ACK,確認序號爲收到的序號加1 。和 SYN 同樣,一個 FIN 將佔用一個序號
  • 服務器-關閉與客戶端的鏈接,發送一個FIN給客戶端
  • 客戶端-發回 ACK 報文確認,並將確認序號設置爲收到序號加1

任何一方均可以在數據傳送結束後發出鏈接釋放的通知,待對方確認後進入半關閉狀態。當另外一方也沒有數據再發送的時候,則發出鏈接釋放通知,對方確認後就徹底關閉了TCP鏈接。
舉個例子:A 和 B 打電話,通話即將結束後,A 說「我沒啥要說的了」,B回答「我知道了」,可是 B 可能還會有要說的話,A 不能要求 B 跟着本身的節奏結束通話,因而 B 可能又巴拉巴拉說了一通,最後 B 說「我說完了」,A 回答「知道了」,這樣通話纔算結束。

九、TCP、UDP 協議的區別

UDP 在傳送數據以前不須要先創建鏈接,遠地主機在收到 UDP 報文後,不須要給出任何確認。雖然 UDP 不提供可靠交付,但在某些狀況下 UDP 確是一種最有效的工做方式(通常用於即時通訊),好比: QQ 語音、 QQ 視頻 、直播等等。

TCP 提供面向鏈接的服務。在傳送數據以前必須先創建鏈接,數據傳送結束後要釋放鏈接。
TCP 不提供廣播或多播服務。因爲 TCP 要提供可靠的,面向鏈接的運輸服務(TCP的可靠體如今TCP在傳遞數據以前,會有三次握手來創建鏈接,並且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開鏈接用來節約系統資源),這一難以免增長了許多開銷,如確認,流量控制,計時器以及鏈接管理等。這不只使協議數據單元的首部增大不少,還要佔用許多處理機資源。TCP 通常用於文件傳輸、發送和接收郵件、遠程登陸等場景。

十、TCP 協議如何保證可靠傳輸

1)確認和重傳:接收方收到報文就會確認,發送方發送一段時間後沒有收到確認就會重傳。
2)數據校驗:TCP報文頭有校驗和,用於校驗報文是否損壞
3)數據合理分片和排序:
tcp會按最大傳輸單元(MTU)合理分片,接收方會緩存未按序到達的數據,從新排序後交給應用層。
而UDP:IP數據報大於1500字節,大於MTU。這個時候發送方的IP層就須要分片,把數據報分紅若干片,是的每一片都小於MTU。而接收方IP層則須要進行數據報的重組。因爲UDP的特性,某一片數據丟失時,接收方便沒法重組數據報,致使丟棄整個UDP數據報。
4)流量控制:當接收方來不及處理髮送方的數據,能經過滑動窗口,提示發送方下降發送的速率,防止包丟失。
5)擁塞控制:當網絡擁塞時,經過擁塞窗口,減小數據的發送,防止包丟失。

十一、TCP 利用滑動窗口實現流量控制的機制

流量控制是爲了控制發送方發送速率,保證接收方來得及接收。
TCP 利用滑動窗口實現流量控制。
滑動窗口(Sliding window)是一種流量控制技術。早期的網絡通訊中,通訊雙方不會考慮網絡的擁擠狀況直接發送數據。因爲你們不知道網絡擁塞情況,同時發送數據,致使中間節點阻塞掉包,誰也發不了數據,因此就有了滑動窗口機制來解決此問題。
TCP 中採用滑動窗口來進行傳輸控制,滑動窗口的大小意味着接收方還有多大的緩衝區能夠用於接收數據。發送方能夠經過滑動窗口的大小來肯定應該發送多少字節的數據。當滑動窗口爲 0 時,發送方通常不能再發送數據報,但有兩種狀況除外,一種狀況是能夠發送緊急數據,例如,容許用戶終止在遠端機上的運行進程。另外一種狀況是發送方能夠發送一個 1 字節的數據報來通知接收方從新聲明它但願接收的下一字節及發送方的滑動窗口大小。

接收方發送的確認報文中的窗口字段能夠用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口字段設置爲 0,則發送方不能發送數據。

十二、TCP擁塞控制的機制以及算法

在某段時間,若對網絡中某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞。這種狀況就叫擁塞。
擁塞控制就是爲了防止過多的數據注入到網絡中,這樣就可使網絡中的路由器或鏈路不致過載。擁塞控制所要作的都有一個前提,就是網絡可以承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到全部的主機,全部的路由器,以及與下降網絡傳輸性能有關的全部因素。相反,流量控制每每是點對點通訊量的控制,是個端到端的問題。流量控制所要作到的就是抑制發送端發送數據的速率,以便使接收端來得及接收。
爲了進行擁塞控制,TCP 發送方要維持一個 擁塞窗口(cwnd) 的狀態變量。擁塞控制窗口的大小取決於網絡的擁塞程度,而且動態變化。發送方讓本身的發送窗口取爲擁塞窗口和接收方的接受窗口中較小的一個。
TCP的擁塞控制採用了四種算法,即 慢開始 、 擁塞避免 、快重傳 和 快恢復。在網絡層也可使路由器採用適當的分組丟棄策略(如主動隊列管理 AQM),以減小網絡擁塞的發生。

慢開始: 慢開始算法的思路是當主機開始發送數據時,若是當即把大量數據字節注入到網絡,那麼可能會引發網絡阻塞,由於如今還不知道網絡的符合狀況。經驗代表,較好的方法是先探測一下,即由小到大逐漸增大發送窗口,也就是由小到大逐漸增大擁塞窗口數值。cwnd初始值爲1,每通過一個傳播輪次,cwnd加倍。

擁塞避免: 擁塞避免算法的思路是讓擁塞窗口cwnd緩慢增大,即每通過一個往返時間RTT就把發送放的cwnd加1.
快重傳與快恢復:
在 TCP/IP 中,快速重傳和恢復(fast retransmit and recovery,FRR)是一種擁塞控制算法,它能快速恢復丟失的數據包。沒有 FRR,若是數據包丟失了,TCP 將會使用定時器來要求傳輸暫停。在暫停的這段時間內,沒有新的或複製的數據包被髮送。有了 FRR,若是接收機接收到一個不按順序的數據段,它會當即給發送機發送一個重複確認。若是發送機接收到三個重複確認,它會假定確認件指出的數據段丟失了,並當即重傳這些丟失的數據段。有了 FRR,就不會由於重傳時要求的暫停被耽誤。  當有單獨的數據包丟失時,快速重傳和恢復(FRR)能最有效地工做。當有多個數據信息包在某一段很短的時間內丟失時,它則不能頗有效地工做。

1三、在瀏覽器中輸入url地址後顯示主頁的過程

一次完整的http請求過程,整體來講分爲如下幾個過程:
1.DNS域名解析
2.創建TCP鏈接
3.發送HTTP請求
4.服務器處理請求
5.返回HTTP報文
6.關閉TCP鏈接
7.瀏覽器解析HTML
8.瀏覽器佈局渲

1四、常見的Http狀態碼

http狀態返回代碼:1xx(臨時響應)、2xx (成功)、3xx (重定向)、4xx(請求錯誤)、5xx(服務器錯誤)

2XX 成功

200 OK,表示從客戶端發來的請求在服務器端被正確處理
201 Created 請求已經被實現,並且有一個新的資源已經依據請求的須要而創建
202 Accepted 請求已接受,可是還沒執行,不保證完成請求
204 No content,表示請求成功,但響應報文不含實體的主體部分
206 Partial Content,進行範圍請求

3XX 重定向

301 moved permanently,永久性重定向,表示資源已被分配了新的 URL
302 found,臨時性重定向,表示資源臨時被分配了新的 URL
303 see other,表示資源存在着另外一個 URL,應使用 GET 方法丁香獲取資源
304 not modified,表示服務器容許訪問資源,但因發生請求未知足條件的狀況
307 temporary redirect,臨時重定向,和302含義相同

4XX 客戶端錯誤

400 bad request,請求報文存在語法錯誤
401 unauthorized,表示發送的請求須要有經過 HTTP 認證的認證信息
403 forbidden,表示對請求資源的訪問被服務器拒絕
404 not found,表示在服務器上沒有找到請求的資源
408 Request timeout, 客戶端請求超時
409 Confict, 請求的資源可能引發衝突

5XX 服務器錯誤

500 internal sever error,表示服務器端在執行請求時發生了錯誤
501 Not Implemented 請求超出服務器能力範圍,例如服務器不支持當前請求所須要的某個功能,或者請求是服務器不支持的某個方法
503 service unavailable,代表服務器暫時處於超負載或正在停機維護,沒法處理請求
505 http version not supported 服務器不支持,或者拒絕支持在請求中使用的 HTTP 版本

1五、HTTP有哪些方法?

HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT

GET: 一般用於請求服務器發送某些資源
HEAD: 請求資源的頭部信息, 而且這些頭部與 HTTP GET 方法請求時返回的一致. 該請求方法的一個使用場景是在下載一個大文件前先獲取其大小再決定是否要下載, 以此能夠節約帶寬資源
OPTIONS: 用於獲取目的資源所支持的通訊選項
POST: 發送數據給服務器
PUT: 用於新增資源或者使用請求中的有效負載替換目標資源的表現形式
DELETE: 用於刪除指定的資源
PATCH: 用於對資源進行部分修改
CONNECT: HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器
TRACE: 回顯服務器收到的請求,主要用於測試或診斷

1六、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協議的長鏈接和短鏈接。

1七、HTTPS是如何保證安全的?

HTTP協議是一個應用層協議,一般運行在TCP協議之上。它是一個明文協議,客戶端發起請求,服務端給出響應的響應。
因爲網絡並非可信任的,HTTP協議的明文特性會存在如下風險:

  • 通訊數據有被竊聽和被篡改的風險
  • 目標網站有被冒充的風險

HTTPS其實就是secure http的意思,也就是HTTP的安全升級版。HTTP是應用層協議,位於HTTP協議之下是傳輸協議TCP。TCP負責傳輸,HTTP則定義了數據如何進行包裝。
HTTPS相對於HTTP有哪些不一樣呢?其實就是在HTTP跟TCP中間加多了一層加密層TLS/SSL。

HTTPS使用非對稱加密,加密數據用的密鑰(公鑰),跟解密數據用的密鑰(私鑰)是不同的。

1八、HTTPS的中間人攻擊是什麼?

HTTPS從協議上解決了HTTP時代的中間人攻擊問題,可是HTTPS在用戶主動信任了僞造證書的時候也會發生中間人攻擊(好比早期的12306須要手動信任證書),HTTPS中間人攻擊流程以下:

客戶端用HTTPS鏈接服務器的443端口
服務器下發本身的數字證書給客戶端
黑客劫持了服務器的真實證書,並僞造了一個假的證書給瀏覽器
瀏覽器能夠發現獲得的網站證書是假的,可是瀏覽器選擇信任
瀏覽器生成隨機對稱密鑰A,用僞造的證書中的公鑰加密發往服務器
黑客一樣能夠劫持這個請求,獲得瀏覽器的對稱密鑰A,從而可以竊聽或者篡改通訊數據
黑客利用服務器的真實公鑰將客戶端的對稱密鑰A加密發往服務器
服務器利用私鑰解密這個對稱密鑰A以後與黑客通訊
黑客利用對稱密鑰A解密服務器的數據,篡改以後利用對稱密鑰A加密發給客戶端
客戶端收到的數據已是不安全的了

以上就是HTTPS中間人攻擊的原理,這也就是HTTPS抓包爲何要信任證書的緣由。

1九、如何理解HTTP協議是無狀態的?

http協議時無狀態的,指的是協議對事物沒有記憶能力,服務器不知道客戶端是什麼狀態,http是同一個無狀態面向鏈接的協議。

20、ping命令基於哪一層協議的原理是什麼?

ping命令基於網絡層的命令,是基於ICMP協議工做的。

關注公衆號:架構進化論,得到第一手的技術資訊和原創文章
相關文章
相關標籤/搜索