一 OSI與TCP/IP各層的結(jié)構(gòu)與功能,都有哪些協(xié)議?
學(xué)習(xí)計算機網(wǎng)絡(luò)時我們一般采用折中的辦法,也就是中和 OSI 和 TCP/IP 的優(yōu)點,采用一種只有五層協(xié)議的體系結(jié)構(gòu),這樣既簡潔又能將概念闡述清楚。
結(jié)合互聯(lián)網(wǎng)的情況,自上而下地,非常簡要的介紹一下各層的作用。
1.1 應(yīng)用層
應(yīng)用層(application-layer)的任務(wù)是通過應(yīng)用進(jìn)程間的交互來完成特定網(wǎng)絡(luò)應(yīng)用。應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程(進(jìn)程:主機中正在運行的程序)間的通信和交互的規(guī)則。對于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議。在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多,如域名系統(tǒng)DNS,支持萬維網(wǎng)應(yīng)用的 HTTP協(xié)議,支持電子郵件的 SMTP協(xié)議等等。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報文。
域名系統(tǒng)
域名系統(tǒng)(Domain Name System縮寫 DNS,Domain Name被譯為域名)是因特網(wǎng)的一項核心服務(wù),它作為可以將域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP數(shù)串。(百度百科)例如:一個公司的 Web 網(wǎng)站可看作是它在網(wǎng)上的門戶,而域名就相當(dāng)于其門牌地址,通常域名都使用該公司的名稱或簡稱。例如上面提到的微軟公司的域名,類似的還有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等。
HTTP協(xié)議
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的 WWW(萬維網(wǎng)) 文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計 HTTP 最初的目的是為了提供一種發(fā)布和接收 HTML 頁面的方法。(百度百科)
1.2 運輸層
運輸層(transport layer)的主要任務(wù)就是負(fù)責(zé)向兩臺主機進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報文?!巴ㄓ玫摹笔侵覆⒉会槍δ骋粋€特定的網(wǎng)絡(luò)應(yīng)用,而是多種應(yīng)用可以使用同一個運輸層服務(wù)。由于一臺主機可同時運行多個線程,因此運輸層有復(fù)用和分用的功能。所謂復(fù)用就是指多個應(yīng)用層進(jìn)程可同時使用下面運輸層的服務(wù),分用和復(fù)用相反,是運輸層把收到的信息分別交付上面應(yīng)用層中的相應(yīng)進(jìn)程。
運輸層主要使用以下兩種協(xié)議:
TCP 與 UDP 的對比見問題三。
1.3 網(wǎng)絡(luò)層
在 計算機網(wǎng)絡(luò)中進(jìn)行通信的兩個計算機之間可能會經(jīng)過很多個數(shù)據(jù)鏈路,也可能還要經(jīng)過很多通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點, 確保數(shù)據(jù)及時傳送。 在發(fā)送數(shù)據(jù)時,網(wǎng)絡(luò)層把運輸層產(chǎn)生的報文段或用戶數(shù)據(jù)報封裝成分組和包進(jìn)行傳送。在 TCP/IP 體系結(jié)構(gòu)中,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報 ,簡稱 數(shù)據(jù)報。
這里要注意:不要把運輸層的“用戶數(shù)據(jù)報 UDP ”和網(wǎng)絡(luò)層的“ IP 數(shù)據(jù)報”弄混。另外,無論是哪一層的數(shù)據(jù)單元,都可籠統(tǒng)地用“分組”來表示。
這里強調(diào)指出,網(wǎng)絡(luò)層中的“網(wǎng)絡(luò)”二字已經(jīng)不是我們通常談到的具體網(wǎng)絡(luò),而是指計算機網(wǎng)絡(luò)體系結(jié)構(gòu)模型中第三層的名稱.
互聯(lián)網(wǎng)是由大量的異構(gòu)(heterogeneous)網(wǎng)絡(luò)通過路由器(router)相互連接起來的。互聯(lián)網(wǎng)使用的網(wǎng)絡(luò)層協(xié)議是無連接的網(wǎng)際協(xié)議(Intert Protocol)和許多路由選擇協(xié)議,因此互聯(lián)網(wǎng)的網(wǎng)絡(luò)層也叫做網(wǎng)際層或IP層。
1.4 數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的數(shù)據(jù)傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協(xié)議。 在兩個相鄰節(jié)點之間傳送數(shù)據(jù)時,數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來的 IP 數(shù)據(jù)報組裝成幀,在兩個相鄰節(jié)點間的鏈路上傳送幀。每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息,地址信息,差錯控制等)。
在接收數(shù)據(jù)時,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結(jié)束。這樣,數(shù)據(jù)鏈路層在收到一個幀后,就可從中提出數(shù)據(jù)部分,上交給網(wǎng)絡(luò)層。 控制信息還使接收端能夠檢測到所收到的幀中有誤差錯。如果發(fā)現(xiàn)差錯,數(shù)據(jù)鏈路層就簡單地丟棄這個出了差錯的幀,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費網(wǎng)絡(luò)資源。如果需要改正數(shù)據(jù)在鏈路層傳輸時出現(xiàn)差錯(這就是說,數(shù)據(jù)鏈路層不僅要檢錯,而且還要糾錯),那么就要采用可靠性傳輸協(xié)議來糾正出現(xiàn)的差錯。這種方法會使鏈路層的協(xié)議復(fù)雜些。
1.5 物理層
在物理層上所傳送的數(shù)據(jù)單位是比特。 物理層(physical layer)的作用是實現(xiàn)相鄰計算機節(jié)點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異。 使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么?!巴该鱾魉捅忍亓鳌北硎窘?jīng)實際電路傳送后的比特流沒有發(fā)生變化,對傳送的比特流來說,這個電路好像是看不見的。
在互聯(lián)網(wǎng)使用的各種協(xié)中最重要和最著名的就是 TCP/IP 兩個協(xié)議?,F(xiàn)在人們經(jīng)常提到的TCP/IP并不一定單指TCP和IP這兩個具體的協(xié)議,而往往表示互聯(lián)網(wǎng)所使用的整個TCP/IP協(xié)議族。
1.6 總結(jié)一下
上面我們對計算機網(wǎng)絡(luò)的五層體系結(jié)構(gòu)有了初步的了解,下面附送一張七層體系結(jié)構(gòu)圖總結(jié)一下。
二 TCP 三次握手和四次揮手(面試???
為了準(zhǔn)確無誤地把數(shù)據(jù)送達(dá)目標(biāo)處,TCP協(xié)議采用了三次握手策略。
2.1 TCP 三次握手漫畫圖解
如下圖所示,下面的兩個機器人通過3次握手確定了對方能正確接收和發(fā)送消息(圖片來源:《圖解HTTP》)。
簡單示意圖:
2.2 為什么要三次握手
三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是雙方確認(rèn)自己與對方的發(fā)送與接收是正常的。
第一次握手:Client 什么都不能確認(rèn);Server 確認(rèn)了對方發(fā)送正常,自己接收正常
第二次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對方發(fā)送、接收正常;Server 確認(rèn)了:對方發(fā)送正常,自己接收正常
第三次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對方發(fā)送、接收正常;Server 確認(rèn)了:自己發(fā)送、接收正常,對方發(fā)送、接收正常
所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常,缺一不可。
2.3 為什么要傳回 SYN
接收端傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端,我接收到的信息確實就是你所發(fā)送的信號了。
SYN 是 TCP/IP 建立連接時使用的握手信號。在客戶機和服務(wù)器之間建立正常的 TCP 網(wǎng)絡(luò)連接時,客戶機首先發(fā)出一個 SYN 消息,服務(wù)器使用 SYN-ACK 應(yīng)答表示接收到了這個消息,最后客戶機再以 ACK(Acknowledgement[漢譯:確認(rèn)字符 ,在數(shù)據(jù)通信傳輸中,接收站發(fā)給發(fā)送站的一種傳輸控制字符。它表示確認(rèn)發(fā)來的數(shù)據(jù)已經(jīng)接受無誤。 ])消息響應(yīng)。這樣在客戶機和服務(wù)器之間才能建立起可靠的TCP連接,數(shù)據(jù)才可以在客戶機和服務(wù)器之間傳遞。
2.4 傳了 SYN,為啥還要傳 ACK
雙方通信無誤必須是兩者互相發(fā)送信息都無誤。傳了 SYN,證明發(fā)送方到接收方的通道沒有問題,但是接收方到發(fā)送方的通道還需要 ACK 信號來進(jìn)行驗證。
斷開一個 TCP 連接則需要“四次揮手”:
2.5 為什么要四次揮手
任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知,待對方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài)。當(dāng)另一方也沒有數(shù)據(jù)再發(fā)送的時候,則發(fā)出連接釋放通知,對方確認(rèn)后就完全關(guān)閉了TCP連接。
舉個例子:A 和 B 打電話,通話即將結(jié)束后,A 說“我沒啥要說的了”,B回答“我知道了”,但是 B 可能還會有要說的話,A 不能要求 B 跟著自己的節(jié)奏結(jié)束通話,于是 B 可能又巴拉巴拉說了一通,最后 B 說“我說完了”,A 回答“知道了”,這樣通話才算結(jié)束。
上面講的比較概括,推薦一篇講的比較細(xì)致的文章:https://blog.csdn.net/qzcsu/article/details/72861891
三 TCP,UDP 協(xié)議的區(qū)別
UDP 在傳送數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機在收到 UDP 報文后,不需要給出任何確認(rèn)。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 確是一種最有效的工作方式(一般用于即時通信),比如: QQ 語音、 QQ 視頻 、直播等等
TCP 提供面向連接的服務(wù)。在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。 TCP 不提供廣播或多播服務(wù)。由于 TCP 要提供可靠的,面向連接的傳輸服務(wù)(TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會有三次握手來建立連接,而且在數(shù)據(jù)傳遞時,有確認(rèn)、窗口、重傳、擁塞控制機制,在數(shù)據(jù)傳完后,還會斷開連接用來節(jié)約系統(tǒng)資源),這一難以避免增加了許多開銷,如確認(rèn),流量控制,計時器以及連接管理等。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多,還要占用許多處理機資源。TCP 一般用于文件傳輸、發(fā)送和接收郵件、遠(yuǎn)程登錄等場景。
四 TCP 協(xié)議如何保證可靠傳輸
4.1 ARQ協(xié)議
自動重傳請求(Automatic Repeat-reQuest,ARQ)是OSI模型中數(shù)據(jù)鏈路層和傳輸層的錯誤糾正協(xié)議之一。它通過使用確認(rèn)和超時這兩個機制,在不可靠服務(wù)的基礎(chǔ)上實現(xiàn)可靠的信息傳輸。如果發(fā)送方在發(fā)送后一段時間之內(nèi)沒有收到確認(rèn)幀,它通常會重新發(fā)送。ARQ包括停止等待ARQ協(xié)議和連續(xù)ARQ協(xié)議。
停止等待ARQ協(xié)議
優(yōu)點: 簡單
缺點: 信道利用率低,等待時間長
1) 無差錯情況:
發(fā)送方發(fā)送分組,接收方在規(guī)定時間內(nèi)收到,并且回復(fù)確認(rèn).發(fā)送方再次發(fā)送。
2) 出現(xiàn)差錯情況(超時重傳):
停止等待協(xié)議中超時重傳是指只要超過一段時間仍然沒有收到確認(rèn),就重傳前面發(fā)送過的分組(認(rèn)為剛才發(fā)送過的分組丟失了)。因此每發(fā)送完一個分組需要設(shè)置一個超時計時器,其重傳時間應(yīng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些。這種自動重傳方式常稱為 自動重傳請求 ARQ 。另外在停止等待協(xié)議中若收到重復(fù)分組,就丟棄該分組,但同時還要發(fā)送確認(rèn)。連續(xù) ARQ 協(xié)議 可提高信道利用率。發(fā)送維持一個發(fā)送窗口,凡位于發(fā)送窗口內(nèi)的分組可連續(xù)發(fā)送出去,而不需要等待對方確認(rèn)。接收方一般采用累積確認(rèn),對按序到達(dá)的最后一個分組發(fā)送確認(rèn),表明到這個分組位置的所有分組都已經(jīng)正確收到了。
3) 確認(rèn)丟失和確認(rèn)遲到
連續(xù)ARQ協(xié)議
連續(xù) ARQ 協(xié)議可提高信道利用率。發(fā)送方維持一個發(fā)送窗口,凡位于發(fā)送窗口內(nèi)的分組可以連續(xù)發(fā)送出去,而不需要等待對方確認(rèn)。接收方一般采用累計確認(rèn),對按序到達(dá)的最后一個分組發(fā)送確認(rèn),表明到這個分組為止的所有分組都已經(jīng)正確收到了。
優(yōu)點: 信道利用率高,容易實現(xiàn),即使確認(rèn)丟失,也不必重傳。
缺點: 不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息。 比如:發(fā)送方發(fā)送了 5條 消息,中間第三條丟失(3號),這時接收方只能對前兩個發(fā)送確認(rèn)。發(fā)送方無法知道后三個分組的下落,而只好把后三個全部重傳一次。這也叫 Go-Back-N(回退 N),表示需要退回來重傳已經(jīng)發(fā)送過的 N 個消息。
4.2 滑動窗口和流量控制
TCP 利用滑動窗口實現(xiàn)流量控制。流量控制是為了控制發(fā)送方發(fā)送速率,保證接收方來得及接收。 接收方發(fā)送的確認(rèn)報文中的窗口字段可以用來控制發(fā)送方窗口大小,從而影響發(fā)送方的發(fā)送速率。將窗口字段設(shè)置為 0,則發(fā)送方不能發(fā)送數(shù)據(jù)。
4.3 擁塞控制
在某段時間,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)的性能就要變壞。這種情況就叫擁塞。擁塞控制就是為了防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣就可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。擁塞控制是一個全局性的過程,涉及到所有的主機,所有的路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。相反,流量控制往往是點對點通信量的控制,是個端到端的問題。流量控制所要做到的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收。
為了進(jìn)行擁塞控制,TCP 發(fā)送方要維持一個 擁塞窗口(cwnd) 的狀態(tài)變量。擁塞控制窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動態(tài)變化。發(fā)送方讓自己的發(fā)送窗口取為擁塞窗口和接收方的接受窗口中較小的一個。
TCP的擁塞控制采用了四種算法,即 慢開始 、 擁塞避免 、快重傳 和 快恢復(fù)。在網(wǎng)絡(luò)層也可以使路由器采用適當(dāng)?shù)姆纸M丟棄策略(如主動隊列管理 AQM),以減少網(wǎng)絡(luò)擁塞的發(fā)生。
五 在瀏覽器中輸入url地址 ->> 顯示主頁的過程(面試???
百度好像最喜歡問這個問題。
打開一個網(wǎng)頁,整個過程會使用哪些協(xié)議
圖解(圖片來源:《圖解HTTP》):
總體來說分為以下幾個過程:
具體可以參考下面這篇文章:
六 狀態(tài)碼
七 各種協(xié)議與HTTP協(xié)議之間的關(guān)系
一般面試官會通過這樣的問題來考察你對計算機網(wǎng)絡(luò)知識體系的理解。
圖片來源:《圖解HTTP》
八 HTTP長連接,短連接
在HTTP/1.0中默認(rèn)使用短連接。也就是說,客戶端和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,任務(wù)結(jié)束就中斷連接。當(dāng)客戶端瀏覽器訪問的某個HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript文件、圖像文件、CSS文件等),每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話。
而從HTTP/1.1起,默認(rèn)使用長連接,用以保持連接特性。使用長連接的HTTP協(xié)議,會在響應(yīng)頭加入這行代碼:
在使用長連接的情況下,當(dāng)一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使用這一條已經(jīng)建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間。實現(xiàn)長連接需要客戶端和服務(wù)端都支持長連接。
HTTP協(xié)議的長連接和短連接,實質(zhì)上是TCP協(xié)議的長連接和短連接。
—— 《HTTP長連接、短連接究竟是什么?》
九 HTTP是不保存狀態(tài)的協(xié)議,如何保存用戶狀態(tài)?
HTTP 是一種不保存狀態(tài),即無狀態(tài)(stateless)協(xié)議。也就是說 HTTP 協(xié)議自身不對請求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。那么我們保存用戶狀態(tài)呢?Session 機制的存在就是為了解決這個問題,Session 的主要作用就是通過服務(wù)端記錄用戶的狀態(tài)。典型的場景是購物車,當(dāng)你要添加商品到購物車的時候,系統(tǒng)不知道是哪個用戶操作的,因為 HTTP 協(xié)議是無狀態(tài)的。服務(wù)端給特定的用戶創(chuàng)建特定的 Session 之后就可以標(biāo)識這個用戶并且跟蹤這個用戶了(一般情況下,服務(wù)器會在一定時間內(nèi)保存這個 Session,過了時間限制,就會銷毀這個Session)。
在服務(wù)端保存 Session 的方法很多,最常用的就是內(nèi)存和數(shù)據(jù)庫(比如是使用內(nèi)存數(shù)據(jù)庫redis保存)。既然 Session 存放在服務(wù)器端,那么我們?nèi)绾螌崿F(xiàn) Session 跟蹤呢?大部分情況下,我們都是通過在 Cookie 中附加一個 Session ID 來方式來跟蹤。
Cookie 被禁用怎么辦?
最常用的就是利用 URL 重寫把 Session ID 直接附加在URL路徑的后面。
十 Cookie的作用是什么?和Session有什么區(qū)別?
Cookie 和 Session都是用來跟蹤瀏覽器用戶身份的會話方式,但是兩者的應(yīng)用場景不太一樣。
Cookie 一般用來保存用戶信息 比如①我們在 Cookie 中保存已經(jīng)登錄過得用戶信息,下次訪問網(wǎng)站的時候頁面可以自動幫你登錄的一些基本信息給填了;②一般的網(wǎng)站都會有保持登錄也就是說下次你再訪問網(wǎng)站的時候就不需要重新登錄了,這是因為用戶登錄的時候我們可以存放了一個 Token 在 Cookie 中,下次登錄的時候只需要根據(jù) Token 值來查找用戶即可(為了安全考慮,重新登錄一般要將 Token 重寫);③登錄一次網(wǎng)站后訪問網(wǎng)站其他頁面不需要重新登錄。Session 的主要作用就是通過服務(wù)端記錄用戶的狀態(tài)。 典型的場景是購物車,當(dāng)你要添加商品到購物車的時候,系統(tǒng)不知道是哪個用戶操作的,因為 HTTP 協(xié)議是無狀態(tài)的。服務(wù)端給特定的用戶創(chuàng)建特定的 Session 之后就可以標(biāo)識這個用戶并且跟蹤這個用戶了。
Cookie 數(shù)據(jù)保存在客戶端(瀏覽器端),Session 數(shù)據(jù)保存在服務(wù)器端。
Cookie 存儲在客戶端中,而Session存儲在服務(wù)器上,相對來說 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要寫入 Cookie 中,最好能將 Cookie 信息加密然后使用到的時候再去服務(wù)器端解密。
十一 HTTP 1.0和HTTP 1.1的主要區(qū)別是什么?
這部分回答引用這篇文章 https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A? 的一些內(nèi)容。
HTTP1.0最早在網(wǎng)頁中使用是在1996年,那個時候只是使用一些較為簡單的網(wǎng)頁上和網(wǎng)絡(luò)請求上,而HTTP1.1則在1999年才開始廣泛應(yīng)用于現(xiàn)在的各大瀏覽器網(wǎng)絡(luò)請求中,同時HTTP1.1也是當(dāng)前使用最為廣泛的HTTP協(xié)議。 主要區(qū)別主要體現(xiàn)在:
十二 URI和URL的區(qū)別是什么?
URI的作用像身份證號一樣,URL的作用更像家庭住址一樣。URL是一種具體的URI,它不僅唯一標(biāo)識資源,而且還提供了定位該資源的信息。
十三 HTTP 和 HTTPS 的區(qū)別?
聯(lián)系客服