HTTP 面試題匯總

HTTP 與 HTTPS 的區(qū)別

http:超文本傳輸協(xié)議,設(shè)計目的是為了提供一種發(fā)布和接收 HTML 頁面的方法。
https:是以 數(shù)據(jù)保密性、完整性和身份校驗安全性為目標(biāo)的 HTTP 安全版。

  • 傳輸信息安全性不同
    http 是超文本傳輸協(xié)議,明文傳輸
    https 是 SSL 加密傳輸協(xié)議,密文傳輸
  • 端口不同
    http 默認80 端口,https 默認 443 端口
  • 連接方式不同
    http 是無狀態(tài)連接;
    https 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡(luò)協(xié)議,安全性更高
  • 證書申請方式不同
    http 協(xié)議:免費申請
    https 協(xié)議需 CA 證書,一般免費證書較少,需要付費

HTTPS 相對于 HTTP 的改進

  1. 雙向的身份認證
    客戶端 和服務(wù)端在傳輸數(shù)據(jù)之前,會通過基于X.509 證書對雙方進行身份認證,過程如下:
     a) 客戶端發(fā)起 SSL 握手消息給服務(wù)端要求連接。
     b) 服務(wù)端將證書發(fā)送給客戶端。
     c) 客戶端檢查服務(wù)端證書,確認是否由自己信任的證書簽發(fā)機構(gòu)簽發(fā)(客戶端內(nèi)置了所有受信任 CA 的證書)。 如果不是,將是否繼續(xù)通訊的決定權(quán)交給用戶選擇。如果檢查無誤或者用戶選擇繼續(xù),則客戶端認可服務(wù)端的身份。
     d) 服務(wù)端要求客戶端發(fā)送證書,并檢查是否通過驗證。失敗則關(guān)閉連接,認證成功則從客戶端證書中獲得客戶端的公鑰,一般為 1024 位或者 2048 位。到此,服務(wù)器客戶端雙方的身份認證結(jié)束,雙方確保身份都是真實可靠的。

  2. 數(shù)據(jù)傳輸?shù)臋C密性
    客戶端和服務(wù)端在開始傳輸數(shù)據(jù)之前,會協(xié)商傳輸過程需要使用的加密算法。 客戶端發(fā)送協(xié)商請求給服務(wù)端, 其中包含自己支持的非對成加密的密鑰交換算法 ( 一般是RSA),數(shù)據(jù)簽名摘要算法 ( 一般是SHA或MD5) ,加密傳輸數(shù)據(jù)的對稱加密算法 ( 一般是DES ),以及加密密鑰的長度。 服務(wù)端接收到消息之后,選中安全性最高的算法,并將選中的算法發(fā)送給客戶端,完成協(xié)商。客戶端生成隨機的字符串,通過協(xié)商好的非對稱加密算法,使用服務(wù)端的公鑰對該字符串進行加密,發(fā)送給服務(wù)端。 服務(wù)端接收到之后,使用自己的私鑰解密得到該字符串。在隨后的數(shù)據(jù)傳輸當(dāng)中,使用這個字符串作為密鑰進行對稱加密。

  3. 防止重放攻擊
    SSL 使用序列號來保護通訊方免受報文重放攻擊。這個序列號被加密后作為數(shù)據(jù)包的負載。在整個 SSL 握手中,都有一個唯一的隨機數(shù)來標(biāo)記 SSL 握手。 這樣防止了攻擊者嗅探整個登錄過程,獲取到加密的登錄數(shù)據(jù)之后,不對數(shù)據(jù)進行解密,而直接重傳登錄數(shù)據(jù)包的攻擊手法。

HTTPS 的優(yōu)點

  • 可認證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機和服務(wù)器;
  • 是由 SSL+HTTP 協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡(luò)協(xié)議,比 HTTP 協(xié)議安全;
  • 是現(xiàn)行架構(gòu)下最安全的解決方案( 雖然不是絕對安全 )。

HTTPS 的缺點

  • 握手階段比較費時,使頁面加載時間延長;
  • HTTPS 連接緩存不如 HTTP 高效,會增加數(shù)據(jù)開銷和功耗,甚至已有的安全措施也會因此而受到影響;
  • SSL 證書需要錢,功能越強大費用越高。
  • SSL 證書通常需要綁定 IP,不能在同一 IP上綁定多個域名。

瀏覽器輸入一個地址,到頁面展示中間經(jīng)歷了哪些東西

  1. 對 URL進行DNS域名解析,得到對應(yīng)的IP地址
    DNS域名解析采用的是遞歸查詢的順序為:
    先找DNS緩存=>根域名服務(wù)器=>繼續(xù)找找下一級=>找到之后給瀏覽器
    緩存的查找順序大概是:
    瀏覽器DNS緩存=>系統(tǒng)DNS緩存=>hosts文件查找=>遞歸去服務(wù)器查找

  2. 根據(jù)IP地址找到對應(yīng)的服務(wù)器并發(fā)起TCP三次握手
    TCP是一個端到端的可靠的面向連接的協(xié)議,HTTP基于傳輸層TCP協(xié)議不用擔(dān)心數(shù)據(jù)傳輸?shù)母鞣N問題(如有錯會重傳)
    建立一個 TCP 連接時,需要客戶端和服務(wù)器總共發(fā)送 3 個包
    (1). 客戶端發(fā)送一個 TCPSYN 標(biāo)志位置 1 的包到服務(wù)器,并進入SYN_SENT 狀態(tài),等待服務(wù)器確認。
    (2). 服務(wù)器收到SYN 包,必須確認客戶的 SYN(ack=x+1),同時自己也發(fā)送一個SYN(syn=y),即SYN+ACK 包,此時服務(wù)器進入SYN_RECV狀態(tài)
    (3). 客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認包ACK(ack=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進入 ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

  3. 建立TCP 連接后發(fā)送HTTP請求
    HTTP請求包含請求頭,或請求體兩部分
    請求頭:中包含希望對請求文件的操作的信息
    請求體:中包含傳遞給后臺的參數(shù)

  4. 服務(wù)器響應(yīng)HTTP請求,返回相應(yīng)數(shù)據(jù)包
    服務(wù)器收到處理的請求開始做負載平衡,跨域等,文件處理完畢,生成響應(yīng)數(shù)據(jù)包并返回
    響應(yīng)包含:響應(yīng)頭和相應(yīng)體,響應(yīng)體就是請求的文件

  5. 經(jīng)過網(wǎng)絡(luò)傳輸,文件被下載到本地客戶端,瀏覽器收到 HTTP 響應(yīng),客戶端開始加載

  6. 瀏覽器得到 HTML 代碼后開始解析,并請求 HTML 代碼中的資源
    如CSS、JS 和 圖片,如果響應(yīng)可以緩存,則存入緩存

  7. 瀏覽器對頁面進行渲染并呈現(xiàn)給用戶
    (1)解析 html 文件是自上而下,先是頭部后是 body
    (2)當(dāng)解析到頭部 CSS 外部鏈接時,同步去下載,如果遇到外部 JS 鏈接也是下載
    (3)接著解析 body 部分,將 html 文件解析成 DOM 樹
    (4)同時等待 css 文件下載并把CSS文件解析成 CSSOM 樹
    (5)DOM 樹 和 CSSOM 樹 就組成了 Render Tree 渲染樹
    (6)CSS 文件加載不會阻塞 html 文件的解析,但會阻塞 DOM 的渲染,也會阻塞后面 JS 語句的執(zhí)行
    (7)在下載 JS 時會阻塞 html 的解析和渲染,又分幾種情況:
      a)沒有 defer 和 async 標(biāo)簽的 script 會立即加載并執(zhí)行
      b)有 async 標(biāo)簽的 js,js 的加載執(zhí)行和 html 的解析和渲染并行
      c)有 defer 標(biāo)簽的 js,js 的加載和 html 的解析和渲染并行
    (8)渲染樹一旦有結(jié)構(gòu)模型了,接著就會同步去計算渲染樹節(jié)點的布局位置
    (9)計算出來渲染的坐標(biāo)后,又同步去開始渲染
    (10)進行過程中如果遇到圖片則跳過去渲染下面內(nèi)容,等待圖片下載成功后會返回來在渲染原來圖片的位置
    (11)如果渲染過程中出現(xiàn) JS 代碼調(diào)整 DOM 樹機構(gòu)的情況,也會再次重新來過,從修改 DOM 那步開始
    (12)最終所有節(jié)點和資源都會渲染完成,頁面全部渲染結(jié)束。

  8. 服務(wù)器關(guān)閉TCP鏈接,TCP 四次揮手
    為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手?
    因為當(dāng) Server 端收到 Client 端的SYN連接請求報文后,可以直接發(fā)送 SYN+ACK 報文。其中 ACK 報文是用來應(yīng)答的,SYN 報文是用來同步的。但是關(guān)閉連接時,當(dāng) Server 端收到 FIN 報文時,很可能并不會立即關(guān)閉 SOCKET,所以只能先回復(fù)一個 ACK 報文,告訴Client 端,"你發(fā)的 FIN 報文我收到了"。只有等到 Server 端所有的報文都發(fā)送完了,才能發(fā)送 FIN 報文,因此不能一起發(fā)送。故需要四步握手。

一個 TCP 連接能發(fā)幾個 http 請求?

HTTP 1.0一般情況下,不支持長連接,因此在每次請求發(fā)送完畢之后,TCP 連接即會斷開,因此一個 TCP 發(fā)送一個 HTTP 請求。
但是通過在請求頭帶上 Connection: Keep-Alive 將一條 TCP 連接保持在活躍狀態(tài)。
如果客戶端和服務(wù)端都支持,那么其實也可以發(fā)送多條,不過此方式也有限制。

HTTP 1.1 支持了長連接, HTTP 2.0 版本協(xié)議,支持了多用復(fù)用。
因此只要不斷開 TCP 的連接,HTTP 請求數(shù)也是可以沒有上限地持續(xù)發(fā)送;

常用的 HTTP 方法有哪些?

GET: 用于請求訪問已經(jīng)被URI(統(tǒng)一資源標(biāo)識符)識別的資源,可以通過URL傳參給服務(wù)器
POST:用于傳輸信息給服務(wù)器,主要功能與GET方法類似,但一般推薦使用POST方式。
PUT: 傳輸文件,報文主體中包含文件內(nèi)容,保存到對應(yīng) URI 位置。
HEAD: 獲得報文首部,與 GET 方法類似,只是不返回報文主體,一般用于驗證 URI 是否有效。
DELETE:刪除文件,與 PUT 方法相反,刪除對應(yīng) URI 位置的文件。
OPTIONS:查詢相應(yīng)URI支持的HTTP方法。

GET 請求和 POST 請求的區(qū)別

  1. 從安全性講,兩者都不安全
    GET 請求參數(shù)在 URL 地址上,直接暴露
    POST 請求的參數(shù)放 BODY 部分,按 F12 也直接暴露了
  2. GET 請求因為是向 URL 添加數(shù)據(jù),不同的瀏覽器廠商,代理服務(wù)器,web服務(wù)器都可能會有自己的長度限制,而 POST 請求無長度限制;
  3. GET請求一般不具有請求體,因此只能進行 URL 編碼,而POST請求支持多種編碼方式。
  4. GET請求可以收藏為書簽,POST請求不可以收藏為書簽;
  5. GET請求可以被緩存,POST請求不可以被緩存
  6. GET產(chǎn)生一個TCP數(shù)據(jù)包;POST產(chǎn)生兩個TCP數(shù)據(jù)包。
  7. GET請求:瀏覽器會把 http header 和 data 一并發(fā)送出去,服務(wù)器響應(yīng) 200;
  8. POST請求:瀏覽器先發(fā)送 header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送 data,服務(wù)器響應(yīng) 200。

HTTPS 工作原理

  1. 首先HTTP請求服務(wù)端生成證書,客戶端對證書的有效期、合法性、域名是否與請求的域名一致、證書的公鑰(RSA加密)等進行校驗;
  2. 客戶端如果校驗通過后,就根據(jù)證書的公鑰的有效, 生成隨機數(shù),隨機數(shù)使用公鑰進行加密(RSA加密);
  3. 消息體產(chǎn)生的后,對它的摘要進行MD5(或者SHA1)算法加密,此時就得到了RSA簽名;
  4. 發(fā)送給服務(wù)端,此時只有服務(wù)端(RSA私鑰)能解密。
  5. 解密得到的隨機數(shù),再用AES加密,作為密鑰(此時的密鑰只有客戶端和服務(wù)端知道)。

常見的HTTP相應(yīng)狀態(tài)碼

200:請求被正常處理
204:請求被受理但沒有資源可以返回
206:客戶端只是請求資源的一部分,服務(wù)器只對請求的部分資源執(zhí)行GET方法,相應(yīng)報文中通過Content-Range指定范圍的資源。
301:永久性重定向
302:臨時重定向
303:與302功能相似,只是它希望客戶端在請求一個URI時,能通過GET方法重定向到另一個URL上
304:發(fā)送附帶條件的請求時,條件不滿足時返回,與重定向無關(guān)
307:臨時重定向,與302類似,只是強制要求使用POST方法
400:請求報文語法有誤,服務(wù)器無法識別
401:請求需要認證
403:請求的對應(yīng)資源禁止被訪問
404:服務(wù)器無法找到對應(yīng)資源
500:服務(wù)器內(nèi)部錯誤
503:服務(wù)器正忙

HTTP優(yōu)化方案

TCP復(fù)用:TCP連接復(fù)用是將多個客戶端的HTTP請求復(fù)用到一個服務(wù)器端TCP連接上,而HTTP復(fù)用則是一個客戶端的多個HTTP請求通過一個TCP連接進行處理。前者是負載均衡設(shè)備的獨特功能;而后者是HTTP 1.1協(xié)議所支持的新功能,目前被大多數(shù)瀏覽器所支持。
內(nèi)容緩存:將經(jīng)常用到的內(nèi)容進行緩存起來,那么客戶端就可以直接在內(nèi)存中獲取相應(yīng)的數(shù)據(jù)了。
壓縮:將文本數(shù)據(jù)進行壓縮,減少帶寬
SSL加速(SSL Acceleration):使用SSL協(xié)議對HTTP協(xié)議進行加密,在通道內(nèi)加密并加速
TCP緩沖:通過采用TCP緩沖技術(shù),可以提高服務(wù)器端響應(yīng)時間和處理效率,減少由于通信鏈路問題給服務(wù)器造成的連接負擔(dān)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容