HTTP面試題小結

什麼是Http協議

客戶端和服務器端之間數據傳輸的格式規範,格式簡稱爲“超文本傳輸協議”。

HTTP協議與TCP/IP協議的關係

HTTP的長連接和短連接本質上是TCP長連接和短連接。
HTTP屬於應用層協議,在傳輸層使用TCP協議,在網絡層使用IP協議。 IP協議主要解決網絡路由和尋址問題,TCP協議主要解決如何在IP層之上可靠地傳遞數據包,使得網絡上接收端收到發送端所發出的所有包,並且順序與發送順序一致。TCP協議是可靠的、面向連接的。

Http協議有哪些特徵?

1、支持客戶/服務器模式;
2、簡單快速;
3、靈活;
4、無連接;
5、無狀態;

如何理解HTTP協議是無狀態的

HTTP協議是無狀態的,指的是協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。也就是說,打開一個服務器上的網頁和上一次打開這個服務器上的網頁之間沒有任何聯繫。HTTP是一個無狀態的面向連接的協議,無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)。

Http協議首部字段

a、通用首部字段(請求報文與響應報文都會使用的首部字段)
Date:創建報文時間
Connection:連接的管理
Cache-Control:緩存的控制
Transfer-Encoding:報文主體的傳輸編碼方式

b、請求首部字段(請求報文會使用的首部字段)
Host:請求資源所在服務器
Accept:可處理的媒體類型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的內容編碼
Accept-Language:可接受的自然語言

c、響應首部字段(響應報文會使用的首部字段)
Accept-Ranges:可接受的字節範圍
Location:令客戶端重新定向到的URI
Server:HTTP服務器的安裝信息

d、實體首部字段(請求報文與響應報文的的實體部分使用的首部字段)
Allow:資源可支持的HTTP方法
Content-Type:實體主類的類型
Content-Encoding:實體主體適用的編碼方式
Content-Language:實體主體的自然語言
Content-Length:實體主體的的字節數
Content-Range:實體主體的位置範圍,一般用於發出部分請求時使用

HTTP狀態碼,你知道哪些

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

HTTP報文格式

請求報文

HTTP請求報文由請求行、請求頭、空行和請求內容4個部分構成。
圖片說明

請求行:
由請求方法字段、URL字段、協議版本字段三部分構成,它們之間由空格隔開。常用的請求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

請求頭:
請求頭由key/value對組成,每行爲一對,key和value之間通過冒號(:)分割。請求頭的作用主要用於通知服務端有關於客戶端的請求信息。

典型的請求頭有:
User-Agent:生成請求的瀏覽器類型
Accept:客戶端可識別的響應內容類型列表;星號*用於按範圍將類型分組。/\表示可接受全部類型,type/*表示可接受type類型的所有子類型。
Accept-Language: 客戶端可接受的自然語言
Accept-Encoding: 客戶端可接受的編碼壓縮格式
Accept-Charset: 可接受的字符集
Host: 請求的主機名,允許多個域名綁定同一IP地址
connection:連接方式(close或keeplive)
Cookie: 存儲在客戶端的擴展字段

空行:
最後一個請求頭之後就是空行,用於告訴服務端以下內容不再是請求頭的內容了。

請求內容:
請求內容主要用於POST請求,與POST請求方法配套的請求頭一般有Content-Type(標識請求內容的類型)和Content-Length(標識請求內容的長度)

響應報文

HTTP響應報文由狀態行、響應頭、空行和響應內容4個部分構成。
圖片說明
狀態行:
由HTTP協議版本、狀態碼、狀態碼描述三部分構成,它們之間由空格隔開。

狀態碼由3位數字組成,第一位標識響應的類型,常用的5大類狀態碼如下:
1xx:表示服務器已接收了客戶端的請求,客戶端可以繼續發送請求
2xx:表示服務器已成功接收到請求並進行處理
3xx:表示服務器要求客戶端重定向
4xx:表示客戶端的請求有非法內容
5xx:標識服務器未能正常處理客戶端的請求而出現意外錯誤

響應頭:
一般情況下,響應頭會包含以下,甚至更多的信息。
Location:服務器返回給客戶端,用於重定向到新的位置
Server: 包含服務器用來處理請求的軟件信息及版本信息
Vary:標識不可緩存的請求頭列表
Connection: 連接方式。
對於請求端來講: close是告訴服務端,斷開連接,不用等待後續的求請了。keeplive則是告訴服務端,在完成本次請求的響應後,保持連接,等待本次連接後的後續請求。
對於響應端來講: close表示連接已經關閉。keeplive則表示連接保持中,可以繼續處理後續請求。Keep-Alive表示如果請求端保持連接,則該請求頭部信息表明期望服務端保持連接多長時間(秒),例如300秒,應該這樣寫Keep-Alive: 300

空行:
最後一個響應頭之後就是空行,用於告訴請求端以下內容不再是響應頭的內容了。

響應內容:
服務端返回給請求端的文本信息。

大文件怎麼分塊編碼傳輸

分塊傳輸編碼是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許HTTP由應用服務器發送給客戶端應用( 通常是網頁瀏覽器)的數據可以分成多個部分。分塊傳輸編碼只在HTTP1.1版本中提供。

通常,HTTP應答消息中發送的數據是整個發送的,Content-Length消息頭字段表示數據的長度。數據的長度很重要,因爲客戶端需要知道哪裏是應答消息的結束,以及後續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。通常數據塊的大小是一致的。

HTTP 1.1引入分塊傳輸編碼提供了以下幾點好處:
1、HTTP分塊傳輸編碼允許服務器爲動態生成的內容維持HTTP持久連接。 通常,持久鏈接需要服務器在開始發送消息體前發送Content-Length消息頭字段,但是對於動態生成的內容來說,在內容創建完之前是不可知的。

2、分塊傳輸編碼允許服務器在最後發送消息頭字段。 對於那些頭字段值在內容被生成之前無法知道的情形非常重要,例如消息的內容要使用散列進行簽名,散列的結果通過HTTP消息頭字段進行傳輸。沒有分塊傳輸編碼時,服務器必須緩衝內容直到完成後計算頭字段的值並在發送內容前發送這些頭字段的值。[散列簽名,需緩衝完成才能計算]

3、HTTP服務器可以壓縮與傳輸同時進行以縮短傳輸花費的時間。 分塊傳輸編碼可以用來分隔壓縮對象的多個部分。在這種情況下,塊不是分別壓縮的,而是整個負載進行壓縮,壓縮的輸出使用本文描述的方案進行分塊傳輸。在壓縮的情形中,分塊編碼有利於一邊進行壓縮一邊發送數據,而不是先完成壓縮過程以得知壓縮後數據的大小。[gzip壓縮]

Http協議中有哪些請求方式?

URI:可以分爲URL,URN或同時具備locators 和names特性的一個東西。URN作用就好像一個人的名字,URL就像一個人的地址。換句話說:URN確定了東西的身份,URL提供了找到它的方式。

GET:用於請求訪問已經被URI(統一資源標識符)識別的資源,可以通過URL傳參給服務器

POST:用於傳輸信息給服務器,主要功能與GET方法類似,但一般推薦使用POST方式

PUT:傳輸文件,報文主體中包含文件內容,保存到對應URI位置

HEAD:獲得報文首部,與GET方法類似,只是不返回報文主體,一般用於驗證URI是否有效

DELETE:刪除文件,與PUT方法相反,刪除對應URI位置的文件

OPTIONS:查詢響應URI支持的HTTP方法

什麼是HTTP長連接

長連接定義:
client方與server方先建立連接,連接建立後不斷開,然後再進行報文發送和接收。這種方式下由於通訊連接一直存在。此種方式常用於P2P點對點的通信。

長連接的操作步驟是:建立連接——數據傳輸...(保持連接)...數據傳輸——關閉連接

長連接適用場景:
監控系統:後臺硬件熱插拔、LED、溫度、電壓發生變化;
即時通信系統:其它用戶登錄、發送信息;
即時報價系統:後臺數據庫內容發生變化;
像以上這些連接,如果每次操作都要建立連接然後再操作的話處理速度會降低。所以操作時第一次連接上以後,以後每次直接發送數據就可以了,不用再建立TCP連接。
再比如:數據庫的連接用長連接,如果用短連接頻繁的通信會造成socket錯誤,頻繁的socket創建也是對資源的浪費。

什麼是HTTP短連接

短連接定義:
Client方與server每進行一次報文收發交易時才進行通訊連接,交易完畢後立即斷開連接。此方式常用於一點對多點通訊。

短連接的操作步驟是:建立連接——數據傳輸——關閉連接...建立連接——數據傳輸——關閉連接

短連接的適用場景:
短連接多用於操作頻繁,點對點的通訊,而且連接數不能太多的情況。每個TCP連接的建立都需要三次握手,每個TCP連接的斷開要四次握手。
web網站的http服務一般都用短連接。因爲長連接對於服務器來說要耗費一定的資源。像web網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接更省一些資源。
試想如果都用長連接,而且同時用成千上萬的用戶,每個用戶都佔有一個連接的話,可想而知服務器的壓力有多大。所以併發量大,但是每個用戶又不需頻繁操作的情況下需要短連接。總之:長連接和短連接的選擇要視需求而定。

Get和POST方法的區別

1、傳送方式:get通過地址欄傳輸,post通過報文傳輸。

2、傳送長度:get參數有長度限制(受限於url長度),而post無限制

3、GET產生一個TCP數據包;POST產生兩個TCP數據包。

對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據)

而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

因爲POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。爲什麼?

  1. GET與POST都有自己的語義,不能隨便混用。
  2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
  3. 並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。

建議:
1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;

案例:
一般情況下,登錄的時候都是用的POST傳輸,涉及到密碼傳輸,而頁面查詢的時候,如文章id查詢文章,用get 地址欄的鏈接爲:article.php?id=11,用post查詢地址欄鏈接爲:article.php, 不會將傳輸的數據展現出來。

Http協議實現的原理機制

(1).整個流程步驟:
圖片說明
(2)域名解析過程:
圖片說明
(3).三次握手過程
(4).建立連接後,客戶端發起Http請求
(5).服務器響應Http請求,客戶端得到HTML代碼
(6).瀏覽器解析HTML代碼
(7).瀏覽器對頁面進行渲染呈現給用戶

Http怎麼優化?

HTTP和HTTPS的基本概念

HTTP:是互聯網上應用最爲廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
HTTPS協議的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。

HTTP與HTTPS有什麼區別?

HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全,爲了保證這些隱私數據能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
HTTPS和HTTP的區別主要如下:
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

位於用戶的計算機上,用來維護用戶計算機中的信息,直到用戶刪除。比如我們在網頁上登錄某個軟件時輸入用戶名及密碼時如果保存爲cookie,則每次我們訪問的時候就不需要登錄網站了。我們可以在瀏覽器上保存任何文本,而且我們還可以隨時隨地的去阻止它或者刪除。我們同樣也可以禁用或者編輯cookie,但是有一點需要注意不要使用cookie來存儲一些隱私數據,以防隱私泄***r>圖片說明

session

session稱爲會話信息,位於web服務器上,主要負責訪問者與網站之間的交互,當訪問瀏覽器請求http地址時,將傳遞到web服務器上並與訪問信息進行匹配, 當關閉網站時就表示會話已經結束,網站無法訪問該信息了,所以它無法保存永久數據,我們無法訪問以及禁用網站
圖片說明

session與cookie的區別

(1)Cookie以文本文件格式存儲在瀏覽器中,而session存儲在服務端它存儲了限制數據量。它只允許4kb它沒有在cookie中保存多個變量。
(2)cookie的存儲限制了數據量,只允許4KB,而session是無限量的
(3)我們可以輕鬆訪問cookie值但是我們無法輕鬆訪問會話值,因此它更安全
(4)設置cookie時間可以使cookie過期。但是使用session-destory(),我們將會銷燬會話。

總結:如果我們需要經常登錄一個站點時,最好用cookie來保存信息,要不然每次登陸都特別麻煩,如果對於需要安全性高的站點以及控制數據的能力時需要用會話效果更佳,當然我們也可以結合兩者,使網站按照我們的想法進行運行。

發佈了119 篇原創文章 · 獲贊 77 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章