1. 程式人生 > 其它 >10天拿到阿里Android崗offer,深入剖析

10天拿到阿里Android崗offer,深入剖析

HTTP協議的特點

  1. HTTP允許傳輸任意型別的資料。
  2. 無狀態。對於客戶端每次傳送的請求,伺服器都認為是一個新的請求,上一次會話和下一次會話之間沒有聯絡。
  3. 支援客戶端/伺服器模式

HTTP報文格式

  1. HTTP請求由請求行、請求頭、請求體組成。
  • 請求行:包括請求方法,訪問的資源URL,使用的HTTP版本。GETPOST是最常見的HTTP方法,除此之外還包括DELETE、HEAD、OPTIONS、PUT、TRACE
  • 請求頭:格式為屬性名:屬性值,服務端根據請求頭獲取客戶端的資訊,主要有cookie、host、connection、accept-language、accept-encoding、user-agent
  • 請求體:使用者的請求資料如使用者名稱、密碼等。
序號 方法 描述
1 GET 傳送請求來獲得伺服器上的資源,請求體中不會包含請求資料,請求資料放在協議頭中。另外get支援快取、快取、可保留書籤等。
2 POST 和get一樣很常見,向伺服器提交資源讓伺服器處理,比如提交表單、上傳檔案等,可能導致建立新的資源或者對原有資源的修改。提交的資源放在請求體中。不支援快取。
3 HEAD 本質和get一樣,但是響應中沒有呈現資料,而是http的頭資訊,主要用來檢查資源或超連結的有效性或是否可以可達、檢查網頁是否被串改或更新,獲取頭資訊等,特別適用在有限的速度和頻寬下。
4 PUT 和post類似,html表單不支援,傳送資源給伺服器,並存儲在伺服器指定位置,要求客戶端事先知道該位置;比如post是在一個集合上(/province),而put是具體某一個資源上(/province/123)。所以put是安全的,無論請求多少次,都是在123上更改,而post可能請求幾次建立了幾次資源。
5 DELETE 請求伺服器刪除某資源。和put都具有破壞性,可能被防火牆攔截。如果是https協議,則無需擔心。
6 CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。就是把伺服器作為跳板,去訪問其他網頁然後把資料返回回來,連線成功後,就可以正常的get、post了。
7 OPTIONS 獲取http伺服器支援的http請求方法,允許客戶端檢視伺服器的效能,比如ajax跨域時的預檢等。
8 TRACE 回顯伺服器收到的請求,主要用於測試或診斷。一般禁用,防止被惡意攻擊或盜取資訊。

請求報文示例:

POST /xxx HTTP/1.1 請求行
Accept:image/gif.image/jpeg, 請求頭部
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate

username=dabin 請求體
  1. HTTP響應由狀態行、響應頭、響應體組成。
  • 狀態行:協議版本、狀態碼及狀態描述。
  • 響應頭:響應頭欄位主要有connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires
  • 響應體:伺服器返回給客戶端的內容。

響應報文示例

HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<html>
    <body>響應體</body>
</html>

HTTP狀態碼

POST和GET的區別

  • GET請求引數通過URL傳遞,POST的引數放在請求體中。
  • GET產生一個TCP資料包;POST產生兩個TCP資料包。對於GET方式的請求,瀏覽器會把請求頭和請求體一併傳送出去;而對於POST,瀏覽器先發送請求頭,伺服器響應100 continue,瀏覽器再發送請求體。
  • GET請求會被瀏覽器主動快取,而POST不會,除非手動設定。
  • GET請求只能進行URL編碼,而POST支援多種編碼方式(json、xml)。
  • GET請求引數會被完整保留在瀏覽器歷史記錄裡,而POST中的引數不會被保留。
  • GET請求在URL中傳送的引數是有長度限制的,而POST沒有。
  • GET請求比POST更不安全,因為引數直接暴露在URL中,所以不能用來傳遞敏感資訊。

HTTP長連線和短連線

HTTP1.0預設使用的是短連線。瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,任務結束就中斷連線。

HTTP1.1起,預設使用長連線。要使用長連線,客戶端和伺服器的HTTP首部的Connection都要設定為keep-alive,才能支援長連線。

HTTP長連線,指的是複用TCP連線。多個HTTP請求可以複用同一個TCP連線,這就節省了TCP連線建立和斷開的消耗。

HTTP1.0和HTTP1.1的區別

  1. 快取處理。在HTTP1.0中主要使用header裡的if-Modified-Since來作為快取判斷的標準,HTTP1.1則引入了更多的快取控制策略。
  2. 頻寬優化及網路連線的使用。HTTP1.0中,存在一些浪費頻寬的現象,例如客戶端只是需要某個物件的一部分,但伺服器卻將整個物件送過來了,並且不支援斷點續傳功能。HTTP1.1則在請求頭引入range頭域,它允許只請求資源的某個部分,即返回碼是206,這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。
  3. 錯誤通知的管理。在HTTP1.1中新增了24個錯誤狀態響應嗎。
  4. Host頭處理。在HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因為,請求資訊的中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機,並且他們共享一個IP地址。HTTP1.1的請求訊息和響應訊息都應支援Host頭域,且請求訊息中如果沒有Host頭域會報告一個錯誤(400)。
  5. 長連線,HTTP1.1 支援長連線和請求的流水線處理,在一個TCP連線上可以傳送多個HTTP請求和響應,減少建立和關閉連線的消耗和延遲,在HTTP1.1中預設開啟Connection:keep-alive,一定程度上彌補了HTTP1.0每次請求都要建立連線的缺點。

HTTP1.1和HTTP2.0的區別

  1. 新的二進位制格式:HTTP1.1基於文字格式傳輸資料;HTTP2.0採用二進位制格式傳輸資料,解析更高效。
  2. 多路複用:在一個連線裡,允許同時傳送多個請求或響應,並且這些請求或響應能夠並行的傳輸而不被阻塞,避免HTTP1.1出現的“隊頭阻塞”問題。
  3. 頭部壓縮:HTTP1.1的header帶有大量資訊,而且每次都要重複傳送;HTTP2.0把header從資料中分離,並封裝成頭幀和資料幀,使用特定演算法壓縮頭幀,有效減少header資訊大小。並且HTTP2.0在客戶端和服務端記錄了之前傳送的鍵值對,對於相同的資料,不會重複傳送。比如請求a傳送了所有的頭資訊欄位,請求b則只需要傳送差異資料,這樣可以減少冗餘資料,降低開銷。
  4. 服務端推送:HTTP2.0允許伺服器向客戶端推送資源,無需客戶端傳送請求到伺服器獲取。

HTTPS和HTTP的區別

  1. HTTP是超文字傳輸協議,資訊是明文傳輸;HTTPS則是具有安全性的ssl加密傳輸協議。
  2. HTTP和HTTPS用的埠不一樣,HTTP埠是80,HTTPS是443。
  3. HTTPS協議需要到CA機構申請證書,需要一定費用。
  4. HTTP執行在TCP協議上;HTTPS執行在SSL協議上,SSL執行在TCP協議上。

HTTPS原理

對稱加密和非對稱加密

  • 對稱加密:客戶端和服務端採用相同的金鑰進行加密。

    	encrypt(明文,祕鑰) = 密文
        decrypt(密文,祕鑰) = 明文
    
  • 非對稱加密:客戶端通過公鑰加密,服務端通過私鑰解密。(或者客戶端通過私鑰加密,服務端通過公鑰解密)

客戶端如何驗證證書有效?

  1. 從服務端獲取證書,得到證書內容、證書籤名演算法和數字簽名。
  2. 用CA機構的公鑰對數字簽名解密(由於是瀏覽器信任的機構,所以瀏覽器會儲存它的公鑰)
  3. 用證書裡的簽名演算法對證書內容進行hash運算
  4. 比較解密後的數字簽名和對證書內容做hash運算後得到的雜湊值,相等則表明證書可信。

驗證證書是否有效使用的是非對稱加密,資料傳輸過程中使用對稱加密。