去面試吧網絡問題
http 響應常見狀態碼
200成功
304未修改,表示客戶機緩存的版本是最新的, 客戶機應該繼續使用它
301永久重定向
302臨時重定向
403 禁止,服務器理解客戶端請求, 但拒絕處理它, 通常用於服務器上文件或目錄的權限設置所致
404找不到
500服務器錯誤
查找域名對應 IP 地址
DNS 的作用就是通過域名查詢到具體的 IP。DNS 是基於 UDP 做的查詢。
DNS 具體的查找過程,包括:瀏覽器緩存->系統緩存->路由器緩存.
- 操作系統會首先在本地緩存中查詢
- 沒有的話會去系統配置的 DNS 服務器中查詢
- 如果這時候還沒得話,會直接去 DNS 根服務器查詢,這一步查詢會找出負責
com
- 然後去該服務器查詢
google
這個二級域名 - 接下來三級域名的查詢其實是我們配置的,你可以給
www
這個域名配置一個 IP,然後還可以給別的三級域名配置一個 IP
如何理解 HTTP 協議是無狀態的【常考】
HTTP 協議是無狀態的,指的是協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麽狀態。也就是說,打開一個服務器上的網頁和上一次打開這個服務器上的網頁之間沒有任何聯系。HTTP 是一個無狀態的面向連接的協議,無狀態不代表 HTTP 不能保持 TCP 連接,更不能代表 HTTP 使用的是 UDP 協議(無連接)
Post 和 Get 的區別
- Get 請求能緩存,Post 不能
- Post 相對 Get 安全一點點,因為Get 請求都包含在 URL 裏,且會被瀏覽器保存歷史紀錄,Post 不會,但是在抓包的情況下都是一樣的。
- Post 可以通過 request body來傳輸比 Get 更多的數據,Get 沒有這個技術
- URL有長度限制,會影響 Get 請求,但是這個長度限制是瀏覽器規定的,不是 RFC 規定的
- Post 支持更多的編碼類型且不對數據類型限制
從輸入 URL 到頁面加載完成的過程
這是一個很經典的面試題,在這題中可以將本文講得內容都串聯起來。
- 首先做 DNS 查詢,如果這一步做了智能 DNS 解析的話,會提供訪問速度最快的 IP 地址回來
- 接下來是 TCP 握手,應用層會下發數據給傳輸層,這裏 TCP 協議會指明兩端的端口號,然後下發給網絡層。網絡層中的 IP 協議會確定 IP 地址,並且指示了數據傳輸中如何跳轉路由器。然後包會再被封裝到數據鏈路層的數據幀結構中,最後就是物理層面的傳輸了
- TCP 握手結束後會進行 TLS 握手,然後就開始正式的傳輸數據
- 數據在進入服務端之前,可能還會先經過負責負載均衡的服務器,它的作用就是將請求合理的分發到多臺服務器上,這時假設服務端會響應一個 HTML 文件
- 首先瀏覽器會判斷狀態碼是什麽,如果是 200 那就繼續解析,如果 400 或 500 的話就會報錯,如果 300 的話會進行重定向,這裏會有個重定向計數器,避免過多次的重定向,超過次數也會報錯
- 瀏覽器開始解析文件,如果是 gzip 格式的話會先解壓一下,然後通過文件的編碼格式知道該如何去解碼文件
- 文件解碼成功後會正式開始渲染流程,先會根據 HTML 構建 DOM 樹,有 CSS 的話會去構建 CSSOM 樹。如果遇到
script
標簽的話,會判斷是否存在async
或者defer
,前者會並行進行下載並執行 JS,後者會先下載文件,然後等待 HTML 解析完成後順序執行,如果以上都沒有,就會阻塞住渲染流程直到 JS 執行完畢。遇到文件下載的會去下載文件,這裏如果使用 HTTP 2.0 協議的話會極大的提高多圖的下載效率。 - 初始的 HTML 被完全加載和解析後會觸發
DOMContentLoaded
事件 - CSSOM 樹和 DOM 樹構建完成後會開始生成 Render 樹,這一步就是確定頁面元素的布局、樣式等等諸多方面的東西
- 在生成 Render 樹的過程中,瀏覽器就開始調用 GPU 繪制,合成圖層,將內容顯示在屏幕上了
HTTPS
HTTPS 還是通過了 HTTP 來傳輸信息,但是信息通過 TLS 協議進行了加密。
TLS
在 TLS 中使用了兩種加密技術,分別為:對稱加密和非對稱加密。
對稱加密:
對稱加密就是兩邊擁有相同的秘鑰,兩邊都知道如何將密文加密解密。
非對稱加密:
有公鑰私鑰之分,公鑰所有人都可以知道,可以將數據用公鑰加密,但是將數據解密必須使用私鑰解密,私鑰只有分發公鑰的一方才知道。
Socket 連接與 HTTP 連接的聯系與區別(需了解)
由於通常情況下 Socket 連接就是 TCP 連接,因此 Socket 連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火墻等,大部分防火墻默認會關閉長時間處於非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處於活躍狀態。
而 HTTP 連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回復數據。
很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是 Socket 連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是 HTTP 連接,則服務器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端。
說一下 TCP 三次握手和四次揮手
HTTP 2.0(TO Learn)
去面試吧網絡問題