http詳解

http

http是超文本傳輸協議,是客戶端瀏覽器或其餘程序與Web服務器之間的應用層通訊協議。在Internet上的Web服務器上存放的都是超文本信息, 客戶機須要經過HTTP協議傳輸所要訪問的超文本信息。HTTP包含命令和傳輸信息,不只可用於Web訪問,也能夠用於其餘因特網/內聯網應用系統之間的通訊,從而實現各種應用資源超媒體訪問的集成。編程

HTTP三點注意事項

  • HTTP是無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
  • HTTP是媒體獨立的:這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據均可以經過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
  • HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。

http交互流程

  1. 創建TCP連接
  2. 發出請求文檔
  3. 發出響應文檔
  4. 釋放TCP連接

創建TCP連接

tcp(傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通訊協議。TCP創建須要三次握手,釋放須要4次揮手瀏覽器

什麼是三次握手緩存

所謂三次握手是指:創建tcp連接時,須要client與server發送三個包,確認連接的創建,這一過程由lcient執行connect觸發服務器

第一次握手socket

client將SYN設置爲1,seq=隨機值j,將數據包發送給server,進入SYN_SEND狀態,等待server確認

第二次握手tcp

server收到數據包由標誌位SYN=1知道,是請求創建連接,將ACK設置爲1,ack=j+1,做爲響應client的請求,將SYN設置爲1,seq=隨機值k,發送給client確認,erver進入SYN_RECV狀態,由於是創建連接這些數據在一個包中。

第三次握手post

client收到響應,檢查ACK=1?,ack=j+1?,若都符合,將ACK設置爲1,ack=k+1,發送給server,client進入establish狀態,server收到響應,檢查ACK=1?,ack=k+1?若都符合進入establish狀態,三次握手完成,TCP創建連接,開始通訊。

四次揮手

即終止TCP鏈接,就是指斷開一個TCP鏈接時,須要客戶端和服務端總共發送4個包以確認鏈接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發測試

因爲TCP鏈接時全雙工的,所以,每一個方向都必需要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的鏈接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,可是在這個TCP鏈接上仍然可以發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另外一方則執行被動關閉網站

第一次揮手編碼

client發送一個FIN,用來關閉client到server的數據傳送,cliient進入FIN_WAIT_1狀態

第二次揮手

server收到FIN後,發送一個ack給client,確認序列號爲收到序列號+1(與SYN相同,一個FIN佔用一個序號),server進入CLOSE_WAIT狀態

第三次揮手

server發送一個FIN,用來關閉server到client的數據傳送,server進入LAST_ACK狀態

第四次揮手

client收到FIN後,client進入TIME_WAIT狀態,接着發送一個ack給server,確認序列號爲收到序列號+1,server進入CLOSED狀態,完成四次揮手

請求報文

一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據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:連接方式
  • Cookie:存儲在客戶端的擴展字段

空行

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

請求內容

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

響應報文

HTTP響應報文由狀態行、響應頭、空行和響應內容4個部分構成。

狀態行

由HTTP協議版本、狀態碼、狀態碼描述三部分構成,它們之間由空格隔開。

響應頭

通常狀況下,響應頭會包含如下,甚至更多的信息。

  • Location:服務器返回給客戶端,用於重定向到新的位置
  • Server:包含服務端用來處理請求的軟件信息及版本信息
  • Vary:標示不可緩存的請求列表
  • Connection:連接方式
    對於請求端來說:close是告訴服務端,斷開鏈接,不用等待後續的求請了。keeplive則是告訴服務端,在完成本次請求的響應後,保持鏈接,等待本次鏈接後的後續請求。

對於響應端來說:close表示鏈接已經關閉。keeplive則表示鏈接保持中,能夠繼續處理後續請求。Keep-Alive表示若是請求端保持鏈接,則該請求頭部信息代表指望服務端保持鏈接多長時間(秒),例如300秒,應該這樣寫Keep-Alive: 300

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

響應內容

服務端返回給請求端的文本信息。

HTTP請求方式

  • GET: 向特定的資源發出請求。
  • POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的建立和/或已有資源的修改。
  • PUT:向指定資源位置上傳其最新內容。
  • HEAD:向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法能夠在沒必要傳輸整個響應內容的狀況下,就能夠獲取包含在響應消息頭中的元信息。
  • OPTIONS:返回服務器針對特定資源所支持的HTTP請求方法。也能夠利用向Web服務器發送'*'的請求來測試服務器的功能性。
  • DELETE:請求服務器刪除 Request-URI 所標識的資源。
  • TRACE:回顯服務器收到的請求,主要是用於測試或者診斷
  • CONNECT:HTTP/1.1 協議中預留給可以將鏈接改成管道方式的代理服務器。
  • PATCH:是對 PUT 方法的補充,用來對已知資源進行局部更新 。

HTTP狀態碼

  • 200:請求成功
  • 201:以建立,成功請求並建立了新的資源
  • 203:非受權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本
  • 204:無內容。服務器成功處理,但未返回內容。在未更新網頁的狀況下,可確保瀏覽器繼續顯示當前文檔
  • 301:永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。從此任何新的請求都應使用新的URI代替
  • 302:臨時移動。與301相似。但資源只是臨時被移動。客戶端應繼續使用原有URI
  • 307:臨時重定向。與302相似。使用GET請求重定向
  • 400:客戶端請求的語法錯誤,服務器沒法理解(給服務端傳的參數和服務端指定接收的字段不一樣)
  • 403:服務器理解請求客戶端的請求,可是拒絕執行此請求
  • 404:服務器沒法根據客戶端的請求找到資源(網頁)。經過此代碼,網站設計人員可設置"您所請求的資源沒法找到"的個性頁面(找不到路徑)
  • 405:客戶端請求中的方法被禁止(請求方法不對,好比服務端設置get請求,客戶端使用post請求)
  • 500:服務器內部錯誤,沒法完成請求

URL 和 URI的區別

URL:統一資源定位符

是Internet上資源的地址,能夠定義爲引用地址的字符串,用於指示資源的位置以及用於訪問它的協議。

URI:統一資源標識符

是標識邏輯或物理資源的字符序列,與URL相似,也是一串字符。經過使用位置,名稱或二者來標識Internet上的資源;它容許統一識別資源。

相關文章
相關標籤/搜索