參考https://juejin.cn/post/6844903951335178248里的提問格式給出一份自己總結的答案,以求能鞏固自己的基礎
1、談下你對五層網絡協議體系結構的理解?
學習計算機網絡時我們一般采用折中的辦法,也就是中和 OSI 和 TCP/IP 的優點,采用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚。
- 1. 應用層
- 2. 運輸層
- 3. 網絡層
在計算機網絡中進行通信的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通信子網。網絡層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送。在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。
在 TCP/IP 體系結構中,由於網絡層使用 IP 協議,因此分組也叫 IP 數據報,簡稱數據報。
- 4. 數據鏈路層
- 5. 物理層
在物理層上所傳送的數據單位是比特。物理層(physical layer)的作用是實現相鄰計算機節點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質和物理設備的差異。使其上面的數據鏈路層不必考慮網絡的具體傳輸介質是什么。“透明傳送比特流”表示經實際電路傳送后的比特流沒有發生變化,對傳送的比特流來說,這個電路好像是看不見的。
2、簡單說下每一層對應的網絡協議有哪些?
計算機五層網絡體系中涉及的協議非常多,下面就常用的做了列舉:
3、ARP 協議(地址解析協議)的工作原理?
網絡層的 ARP 協議完成了從網絡層的 IP 地址到數據鏈路層使用的物理地址的映射。首先,每台主機都會在自己的 ARP 高速緩存(ARP cache)中建立一個 ARP 列表,以表示 IP 地址和 MAC 地址的對應關系。當源主機需要將一個數據包要發送到目的主機時,會首先檢查自己 ARP 列表中是否存在該 IP 地址對應的 MAC 地址:如果有,就直接將數據包發送到這個 MAC 地址;如果沒有,就向本地網段發起一個 ARP 請求分組的廣播包,查詢此目的主機對應的 MAC 地址。
此 ARP 請求數據包里包括源主機的 IP 地址、硬件地址、以及目的主機的 IP 地址並請求目的主機的硬件地址。網絡中所有的主機收到這個 ARP 請求分組后,會檢查數據包中的目的 IP 是否和自己的 IP 地址一致。如果不相同就忽略此數據包;如果相同,該主機首先將發送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中,如果 ARP 表中已經存在該 IP 的信息,則將其覆蓋,然后給源主機發送一個 ARP 響應數據包(普通的單播),告訴對方自己是它需要查找的 MAC 地址;源主機收到這個 ARP 響應數據包后,將得到的目的主機的 IP 地址和 MAC 地址添加到自己的 ARP 列表中,並利用此信息開始數據的傳輸。如果源主機一直沒有收到 ARP 響應數據包,表示 ARP 查詢失敗。
4、談下你對 IP 地址分類的理解?
IP 地址是指互聯網協議地址,是 IP 協議提供的一種統一的地址格式,它為互聯網上的每一個網絡和每一台主機分配一個邏輯地址,以此來屏蔽物理地址的差異。IP 地址編址方案將 IP 地址空間划分為 A、B、C、D、E 五類,其中 A、B、C 是基本類,D、E 類作為多播(一對多通信)和保留使用,為特殊地址。
每個 IP 地址包括兩個標識碼(ID),即網絡 ID 和主機 ID。同一個物理網絡上的所有主機都使用同一個網絡 ID,網絡上的一個主機(包括網絡上工作站,服務器和路由器等)有一個主機 ID 與其對應。A~E 類地址的特點如下:
A 類地址:以 0 開頭,第一個字節范圍:0~127,網絡號字段1個字節;數字0和127不作為主機的IP地址,數字127保留給內部回送函數,而數字0則表示該地址是本地宿主機,不能傳送,但是0和127確實是屬於A類地址,所以,A類地址最多只有126個網絡
網絡類別 | 最大可指派的網絡數 | 第一個可指派的網絡號 | 最后一個可指派的網絡號 | 每一個網絡中的最大主機數 | 占IP地址總數的比例 |
A | 2^7-2(126) | 1 | 126 | 16777241 | 1/2 |
B | 2^14(16384) | 128.1 | 191.255 | 65534 | 1/4 |
C | 2^21(2097151) | 192.01 | 223.255.255 | 254 | 1/8 |
5、TCP 的主要特點是什么?
6、UDP 的主要特點是什么?
7、TCP 和 UDP 的區別?
2.TCP 提供可靠的服務,也就是說,通過 TCP 連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP 盡最大努力交付,即不保證可靠交付
3.TCP 的邏輯通信信道是全雙工的可靠信道;UDP 則是不可靠信道
4.每一條 TCP 連接只能是點到點的;UDP 支持一對一,一對多,多對一和多對多的交互通信
5.TCP 面向字節流(可能出現黏包問題),實際上是 TCP 把數據看成一連串無結構的字節流;UDP 是面向報文的(不會出現黏包問題)
6.UDP 沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如 IP 電話,實時視頻會議等)
7.TCP 首部開銷20字節;UDP 的首部開銷小,只有 8 個字節
8、TCP 和 UDP 分別對應的常見應用層協議有哪些?
- 1. TCP 對應的應用層協議
- 2. UDP 對應的應用層協議
9、詳細說下 TCP 三次握手的過程?
-
1. 三次握手
TCP 建立連接的過程叫做握手,握手需要在客戶和服務器之間交換三個 TCP 報文段。
10、為什么兩次握手不可以呢?
11、為什么不需要四次握手?
有人可能會說 A 發出第三次握手的信息后在沒有接收到 B 的請求就已經進入了連接狀態,那如果 A 的這個確認包丟失或者滯留了怎么辦?
12、Server 端收到 Client 端的 SYN 后,為什么還要傳回 SYN?
SYN —— 用於初始化化一個連接的序列號。
接收端傳回發送端所發送的 SYN 是為了告訴發送端,我接收到的信息確實就是你所發送的信號了。
SYN 是 TCP / IP 建立連接時使用的握手信號。在客戶機和服務器之間建立正常的 TCP 網絡連接時,客戶機首先發出一個 SYN 消息,服務器使用 SYN-ACK 應答表示接收到了這個消息,最后客戶機再以 ACK(Acknowledgement[漢譯:確認字符,在數據通信傳輸中,接收站發給發送站的一種傳輸控制字符。它表示確認發來的數據已經接受無誤])消息響應。這樣在客戶機和服務器之間才能建立起可靠的 TCP 連接,數據才可以在客戶機和服務器之間傳遞。
13、傳了 SYN,為什么還要傳 ACK?
ACK —— 確認,使得確認號有效。
雙方通信無誤必須是兩者互相發送信息都無誤。傳了 SYN,證明發送方到接收方的通道沒有問題,但是接收方到發送方的通道還需要 ACK 信號來進行驗證。
14、詳細說下 TCP 四次揮手的過程?
據傳輸結束后,通信的雙方都可以釋放連接。現在 A 和 B 都處於 ESTABLISHED 狀態。
第一次揮手:A 的應用進程先向其 TCP 發出連接釋放報文段,並停止再發送數據,主動關閉 TCP 連接。A 把連接釋放報文段首部的終止控制位 FIN 置 1,其序號 seq = u(等於前面已傳送過的數據的最后一個字節的序號加 1),這時 A 進入 FIN-WAIT-1(終止等待1)狀態,等待 B 的確認。請注意:TCP 規定,FIN 報文段即使不攜帶數據,也將消耗掉一個序號。
第二次揮手:B 收到連接釋放報文段后立即發出確認,確認號是 ack = u + 1,而這個報文段自己的序號是 v(等於 B 前面已經傳送過的數據的最后一個字節的序號加1),然后 B 就進入 CLOSE-WAIT(關閉等待)狀態。TCP 服務端進程這時應通知高層應用進程,因而從 A 到 B 這個方向的連接就釋放了,這時的 TCP 連接處於半關閉(half-close)狀態,即 A 已經沒有數據要發送了,但 B 若發送數據,A 仍要接收。也就是說,從 B 到 A 這個方向的連接並未關閉,這個狀態可能會持續一段時間。A 收到來自 B 的確認后,就進入 FIN-WAIT-2(終止等待2)狀態,等待 B 發出的連接釋放報文段。
第三次揮手:若 B 已經沒有要向 A 發送的數據,其應用進程就通知 TCP 釋放連接。這時 B 發出的連接釋放報文段必須使 FIN = 1。假定 B 的序號為 w(在半關閉狀態,B 可能又發送了一些數據)。B 還必須重復上次已發送過的確認號 ack = u + 1。這時 B 就進入 LAST-ACK(最后確認)狀態,等待 A 的確認。
第四次揮手:A 在收到 B 的連接釋放報文后,必須對此發出確認。在確認報文段中把 ACK 置 1,確認號 ack = w + 1,而自己的序號 seq = u + 1(前面發送的 FIN 報文段要消耗一個序號)。然后進入 TIME-WAIT(時間等待) 狀態。請注意,現在 TCP 連接還沒有釋放掉。必須經過時間等待計時器設置的時間 2MSL(MSL:最長報文段壽命)后,A 才能進入到 CLOSED 狀態,然后撤銷傳輸控制塊,結束這次 TCP 連接。當然如果 B 一收到 A 的確認就進入 CLOSED 狀態,然后撤銷傳輸控制塊。所以在釋放連接時,B 結束 TCP 連接的時間要早於 A。
15、為什么 TIME-WAIT 狀態必須等待 2MSL 的時間呢?
16、為什么第二次跟第三次不能合並, 第二次和第三次之間的等待是什么?
當服務器執行第二次揮手之后, 此時證明客戶端不會再向服務端請求任何數據, 但是服務端可能還正在給客戶端發送數據(可能是客戶端上一次請求的資源還沒有發送完畢),所以此時服務端會等待把之前未傳輸完的數據傳輸完畢之后再發送關閉請求。
17、保活計時器的作用?
除時間等待計時器外,TCP 還有一個保活計時器(keepalive timer)。設想這樣的場景:客戶已主動與服務器建立了 TCP 連接。但后來客戶端的主機突然發生故障。顯然,服務器以后就不能再收到客戶端發來的數據。因此,應當有措施使服務器不要再白白等待下去。這就需要使用保活計時器了。
服務器每收到一次客戶的數據,就重新設置保活計時器,時間的設置通常是兩個小時。若兩個小時都沒有收到客戶端的數據,服務端就發送一個探測報文段,以后則每隔 75 秒鍾發送一次。若連續發送 10個 探測報文段后仍然無客戶端的響應,服務端就認為客戶端出了故障,接着就關閉這個連接。
18、TCP 協議是如何保證可靠傳輸的?
19、談談你對停止等待協議的理解?
20、談談你對 ARQ 協議的理解?
- 自動重傳請求 ARQ 協議
停止等待協議中超時重傳是指只要超過一段時間仍然沒有收到確認,就重傳前面發送過的分組(認為剛才發送過的分組丟失了)。因此每發送完一個分組需要設置一個超時計時器,其重傳時間應比數據在分組傳輸的平均往返時間更長一些。這種自動重傳方式常稱為自動重傳請求 ARQ。
- 連續 ARQ 協議
連續 ARQ 協議可提高信道利用率。發送方維持一個發送窗口,凡位於發送窗口內的分組可以連續發送出去,而不需要等待對方確認。接收方一般采用累計確認,對按序到達的最后一個分組發送確認,表明到這個分組為止的所有分組都已經正確收到了。
21、談談你對滑動窗口的了解?
TCP 利用滑動窗口實現流量控制的機制。滑動窗口(Sliding window)是一種流量控制技術。早期的網絡通信中,通信雙方不會考慮網絡的擁擠情況直接發送數據。由於大家不知道網絡擁塞狀況,同時發送數據,導致中間節點阻塞掉包,誰也發不了數據,所以就有了滑動窗口機制來解決此問題。
TCP 中采用滑動窗口來進行傳輸控制,滑動窗口的大小意味着接收方還有多大的緩沖區可以用於接收數據。發送方可以通過滑動窗口的大小來確定應該發送多少字節的數據。當滑動窗口為 0 時,發送方一般不能再發送數據報,但有兩種情況除外,一種情況是可以發送緊急數據,例如,允許用戶終止在遠端機上的運行進程。另一種情況是發送方可以發送一個 1 字節的數據報來通知接收方重新聲明它希望接收的下一字節及發送方的滑動窗口大小。
22、談下你對流量控制的理解?
TCP 利用滑動窗口實現流量控制。流量控制是為了控制發送方發送速率,保證接收方來得及接收。接收方發送的確認報文中的窗口字段可以用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口字段設置為 0,則發送方不能發送數據。
23、談下你對 TCP 擁塞控制的理解?使用了哪些算法?
擁塞控制和流量控制不同,前者是一個全局性的過程,而后者指點對點通信量的控制。在某段時間,若對網絡中某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞。這種情況就叫擁塞。
擁塞控制就是為了防止過多的數據注入到網絡中,這樣就可以使網絡中的路由器或鏈路不致於過載。擁塞控制所要做的都有一個前提,就是網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機,所有的路由器,以及與降低網絡傳輸性能有關的所有因素。相反,流量控制往往是點對點通信量的控制,是個端到端的問題。流量控制所要做到的就是抑制發送端發送數據的速率,以便使接收端來得及接收。
為了進行擁塞控制,TCP 發送方要維持一個擁塞窗口(cwnd) 的狀態變量。擁塞控制窗口的大小取決於網絡的擁塞程度,並且動態變化。發送方讓自己的發送窗口取為擁塞窗口和接收方的接受窗口中較小的一個。
TCP 的擁塞控制采用了四種算法,即:慢開始、擁塞避免、快重傳和快恢復。在網絡層也可以使路由器采用適當的分組丟棄策略(如:主動隊列管理 AQM),以減少網絡擁塞的發生。
- 慢開始:
慢開始算法的思路是當主機開始發送數據時,如果立即把大量數據字節注入到網絡,那么可能會引起網絡阻塞,因為現在還不知道網絡的符合情況。經驗表明,較好的方法是先探測一下,即由小到大逐漸增大發送窗口,也就是由小到大逐漸增大擁塞窗口數值。cwnd 初始值為 1,每經過一個傳播輪次,cwnd 加倍。
- 擁塞避免:
擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢增大,即每經過一個往返時間 RTT 就把發送方的 cwnd 加 1。
- 快重傳與快恢復:
在 TCP/IP 中,快速重傳和快恢復(fast retransmit and recovery,FRR)是一種擁塞控制算法,它能快速恢復丟失的數據包。
沒有 FRR,如果數據包丟失了,TCP 將會使用定時器來要求傳輸暫停。在暫停的這段時間內,沒有新的或復制的數據包被發送。有了 FRR,如果接收機接收到一個不按順序的數據段,它會立即給發送機發送一個重復確認。如果發送機接收到三個重復確認,它會假定確認件指出的數據段丟失了,並立即重傳這些丟失的數據段。
有了 FRR,就不會因為重傳時要求的暫停被耽誤。當有單獨的數據包丟失時,快速重傳和快恢復(FRR)能最有效地工作。當有多個數據信息包在某一段很短的時間內丟失時,它則不能很有效地工作。
24、什么是粘包?
在進行 Java NIO 學習時,可能會發現:如果客戶端連續不斷的向服務端發送數據包時,服務端接收的數據會出現兩個數據包粘在一起的情況。
基於上面兩點,在使用 TCP 傳輸數據時,才有粘包或者拆包現象發生的可能。一個數據包中包含了發送端發送的兩個數據包的信息,這種現象即為粘包。
接收端收到了兩個數據包,但是這兩個數據包要么是不完整的,要么就是多出來一塊,這種情況即發生了拆包和粘包。拆包和粘包的問題導致接收端在處理的時候會非常困難,因為無法區分一個完整的數據包。
25、TCP 黏包是怎么產生的?
- 發送方產生粘包
- 接收方產生粘包
接收方采用 TCP 協議接收數據時的過程是這樣的:數據到接收方,從網絡模型的下方傳遞至傳輸層,傳輸層的 TCP 協議處理是將其放置接收緩沖區,然后由應用層來主動獲取(C 語言用 recv、read 等函數);這時會出現一個問題,就是我們在程序中調用的讀取數據函數不能及時的把緩沖區中的數據拿出來,而下一個數據又到來並有一部分放入的緩沖區末尾,等我們讀取數據時就是一個粘包。(放數據的速度 > 應用層拿數據速度)
26、怎么解決拆包和粘包?
分包機制一般有四個通用的解決方法:
27、你對 HTTP 狀態碼有了解嗎?
- 1XX 信息
- 2XX 成功
- 3XX 重定向
- 4XX 客戶端錯誤
- 5XX 服務器錯誤
28、HTTP 狀態碼 301 和 302 代表的是什么?有什么區別?
301,302 都是 HTTP 狀態的編碼,都代表着某個 URL 發生了轉移。
- 區別:
29、forward 和 redirect 的區別?
Forward 和 Redirect 代表了兩種請求轉發方式:直接轉發和間接轉發。
-
舉個通俗的例子:
30、HTTP 方法有哪些?
客戶端發送的 請求報文 第一行為請求行,包含了方法字段,請求資源的URL,以及HTTP的版本。
31、說下 GET 和 POST 的區別?
GET 和 POST 本質都是 HTTP 請求,只不過對它們的作用做了界定和適配,並且讓他們適應各自的場景。
本質區別:GET 只是一次 HTTP請求,POST 先發請求頭再發請求體,實際上是兩次請求。(FIrefox瀏覽器並不是)
32、在瀏覽器中輸入 URL 地址到顯示主頁的過程?
1. DNS 解析:瀏覽器查詢 DNS,獲取域名對應的 IP 地址:具體過程包括瀏覽器搜索自身的 DNS 緩存、搜索操作系統的 DNS 緩存、讀取本地的 Host 文件和向本地 DNS 服務器進行查詢等。對於向本地 DNS 服務器進行查詢,如果要查詢的域名包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析(此解析具有權威性);如果要查詢的域名不由本地 DNS 服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個 IP 地址映射,完成域名解析(此解析不具有權威性)。如果本地域名服務器並未緩存該網址映射關系,那么將根據其設置發起遞歸查詢或者迭代查詢;
2. TCP 連接:瀏覽器獲得域名對應的 IP 地址以后,瀏覽器向服務器請求建立鏈接,發起三次握手;
3. 發送 HTTP 請求:TCP 連接建立起來后,瀏覽器向服務器發送 HTTP 請求;
4. 服務器處理請求並返回 HTTP 報文:服務器接收到這個請求,並根據路徑參數映射到特定的請求處理器進行處理,並將處理結果及相應的視圖返回給瀏覽器;
5. 瀏覽器解析渲染頁面:瀏覽器解析並渲染視圖,若遇到對 js 文件、css 文件及圖片等靜態資源的引用,則重復上述步驟並向服務器請求這些資源;瀏覽器根據其請求到的資源、數據渲染頁面,最終向用戶呈現一個完整的頁面。
6. 連接結束。
33、DNS 的解析過程?
34、談談你對域名緩存的了解?
為了提高 DNS 查詢效率,並減輕服務器的負荷和減少因特網上的 DNS 查詢報文數量,在域名服務器中廣泛使用了高速緩存,用來存放最近查詢過的域名以及從何處獲得域名映射信息的記錄。
由於名字到地址的綁定並不經常改變,為保持高速緩存中的內容正確,域名服務器應為每項內容設置計時器並處理超過合理時間的項(例如:每個項目兩天)。當域名服務器已從緩存中刪去某項信息后又被請求查詢該項信息,就必須重新到授權管理該項的域名服務器綁定信息。當權限服務器回答一個查詢請求時,在響應中都指明綁定有效存在的時間值。增加此時間值可減少網絡開銷,而減少此時間值可提高域名解析的正確性。
不僅在本地域名服務器中需要高速緩存,在主機中也需要。許多主機在啟動時從本地服務器下載名字和地址的全部數據庫,維護存放自己最近使用的域名的高速緩存,並且只在從緩存中找不到名字時才使用域名服務器。維護本地域名服務器數據庫的主機應當定期地檢查域名服務器以獲取新的映射信息,而且主機必須從緩存中刪除無效的項。由於域名改動並不頻繁,大多數網點不需花精力就能維護數據庫的一致性。
35、談下你對 HTTP 長連接和短連接的理解?分別應用於哪些場景?
在 HTTP/1.0 中默認使用短連接。也就是說,客戶端和服務器每進行一次 HTTP 操作,就建立一次連接,任務結束就中斷連接。當客戶端瀏覽器訪問的某個 HTML 或其他類型的 Web 頁中包含有其他的 Web 資源(如:JavaScript 文件、圖像文件、CSS 文件等),每遇到這樣一個 Web 資源,瀏覽器就會重新建立一個 HTTP 會話。
而從 HTTP/1.1 起,默認使用長連接,用以保持連接特性。使用長連接的 HTTP 協議,會在響應頭加入這行代碼
Connection:keep-alive
在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用於傳輸 HTTP 數據的 TCP 連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。
Keep-Alive 不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如:Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。
36、談下 HTTP 1.0 和 1.1、1.2 的主要變化?
- HTTP1.1 的主要變化:
-
HTTP2.0 的主要變化:
37、HTTPS 的工作過程?
-
3.1 驗證證書的合法性;
-
3.2 如果驗證通過證書,瀏覽器會生成一串隨機數,並用證書中的公鑰進行加密;
-
3.3 用約定好的 hash 算法計算握手消息,然后用生成的密鑰進行加密,然后一起發送給服務器。
-
4.1 用私鑰解析出密碼,用密碼解析握手消息,驗證 hash 值是否和瀏覽器發來的一致;
-
4.2 使用密鑰加密消息;
38、HTTP 和 HTTPS 的區別?
39、HTTPS 的優缺點?
- 優點:
- 缺點:
40、什么是數字簽名?
41、什么是數字證書?
對稱加密中,雙方使用公鑰進行解密。雖然數字簽名可以保證數據不被替換,但是數據是由公鑰加密的,如果公鑰也被替換,則仍然可以偽造數據,因為用戶不知道對方提供的公鑰其實是假的。所以為了保證發送方的公鑰是真的,CA 證書機構會負責頒發一個證書,里面的公鑰保證是真的,用戶請求服務器時,服務器將證書發給用戶,這個證書是經由系統內置證書的備案的。
42、什么是對稱加密和非對稱加密?
對稱密鑰加密是指加密和解密使用同一個密鑰的方式,這種方式存在的最大問題就是密鑰發送問題,即如何安全地將密鑰發給對方。
非對稱加密指使用一對非對稱密鑰,即:公鑰和私鑰,公鑰可以隨意發布,但私鑰只有自己知道。發送密文的一方使用對方的公鑰進行加密處理,對方接收到加密信息后,使用自己的私鑰進行解密。
由於非對稱加密的方式不需要發送用來解密的私鑰,所以可以保證安全性。但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。
0.0.0.0到127.255.255.255。 這里要強調下,數字0和127不作為主機的IP地址,數字127保留給內部回送函數,而數字0則表示該地址是本地宿主機,不能傳送,但是0和127確實是屬於A類地址,所以,A類地址最多只有126個網絡