HTTP簡介(報文格式、cookie、keep-alive、HTTP請求的一個完整過程)

一、HTTP簡介

HTTP(HyperText Transfer Protocol)即超文本傳輸協議,是一種詳細規定了瀏覽器和萬維網服務器之間互相通信的規則,它是萬維網交換信息的基礎,它允許將HTML(超文本標記語言)文檔從Web服務器傳送到Web瀏覽器。

HTTP協議目前常用的版本是1.1,HTTP是一種無狀態的協議,無狀態是指Web瀏覽器與Web服務器之間不需要建立持久的連接,這意味着當一個客戶端向服務器端發出請求,然後Web服務器返回響應(Response),連接就被關閉了,在服務器端不保留連接的有關信息。也就是說,HTTP請求只能由客戶端發起,而服務器不能主動向客戶端發送數據。

HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

HTTP三點注意事項:

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

二、http報文格式

HTTP報文傳過來都是一堆的0x ASCII碼,諸如“41 63 63 65 70 74” 對應的是“accept” 單詞的十六進制ASCII碼。

這些十六進制的數字經過瀏覽器或者專用工具比如wireshark的翻譯,可以得到HTTP的報文結構。

1.請求報文

以下是wireshark抓出來的一段HTTP請求報文

GET /sid/close.png HTTP/1.1           這是請求行(request line)
Accept: */*
Referer: http://xxx.xxx.xxx.xxx/menu/neo
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: xxx.xxx.xxx.xxx
Connection: Keep-Alive
Cookie: startupapp=neo; is_cisco_platform=0; rdx_pagination_size=250%20Per%20Page; SESSID=deb31b8eb9ca68a514cf55777744e339

HTTP的請求報文包括:請求行(request line)、請求頭部(header)、空行 和 請求數據(request data) 四個部分組成。

1.1請求行(request line)

包括: 請求方法,URL(包括參數信息),協議版本這些信息,是上圖例子中的(GET /admin_ui/rdx/core/images/close.png HTTP/1.1)

其中請求方法介紹如下:

根據 HTTP 標準,HTTP 請求可以使用多種請求方法。

HTTP1.0 定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了五種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

序號 方法 描述
1 GET 請求指定的頁面信息,並返回實體主體。
2 HEAD 類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改。
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5 DELETE 請求服務器刪除指定的頁面
6 CONNECT HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。
7 OPTIONS 允許客戶端查看服務器的性能。
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷。
9 PATCH 是對 PUT 方法的補充,用來對已知資源進行局部更新 。

GET:GET方法用於獲取請求頁面的指定信息。如果請求資源爲動態腳本(非HTML),那麼返回文本是Web容器解析後的HTML源代碼。GET請求沒有消息主體,因此在消息頭後的空白行是沒有其他數據。

POST:POST方法也與GET方法相似,但最大的區別在於,GET方法沒有請求內容,而POST是有請求內容的。

HEAD:這個請求的功能與GET請求相似,不同之處在於服務器不會再其響應中返回消息主體,因此,這種方法可用於檢查某一資源在向其提交GET請求前是否存在。

PUT:PUT方法用於請求服務器把請求中的實體存儲在請求資源下,如果請求資源已經在服務器中存在,那麼將會用此請求中的數據替換原先的數據。向服務器上傳指定的資源。

1.2請求頭部(Header)

是一個個的key-value值

常見HTTP請求頭:

請求頭 說明
Host 請求報頭域主要用於指定被請求資源的Internet主機和端口。
User-Agent 請求報頭域允許客戶端將它的操作系統、瀏覽器和其他屬性告訴服務器。
Referer 包含一個URL,代表當前訪問URL的上一個URL,也就是說,用戶是從什麼地方來到本頁面。當前請求的原始URL地址。
Cookie 是非常重要的請求頭,常用來表示請求者的身份等。
Accept 這個消息頭用於告訴服務器客戶端願意接受那些內容,比如圖像類,辦公文檔格式等等。
Connection

一般值爲Keep-Alive 或close,在字段表示是否支持TPC的連接複用。

HTTP是無狀態無連接的,這裏說的是TPC的連接是否可複用。

在 HTTP 1.1 中 所有的連接默認都是持續連接,除非特殊聲明不支持。

請求頭和響應頭都有這個字段,要客戶端和服務端都表示支持連接複用才能複用。

從HTTP協議上來說,只要客戶端和服務端都Keep-Alive ,這個TCP連接會一直保持。

但實際上不同的服務器軟件(如nginx)中可設定這個保持時間 。

1.3空行(CR+LF)

請求報文用空行表示header和請求數據的分隔

1.4請求數據(request data)

GET方法沒有攜帶數據, POST方法會攜帶一個body

2.返回報文 

下面是wireshark抓出來的一段響應報文

HTTP/1.1 200 OK   這是狀態行
Bdpagetype: 1
Bdqid: 0xacbbb9d800005133
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+f8b5e5b521b3644ef7f3455ea441c5d0
Date: Fri, 12 Oct 2018 06:36:28 GMT
Expires: Fri, 12 Oct 2018 06:36:26 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1433_21112_18560_26350_27245_22158; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
 
<!DOCTYPE html>
<!--STATUS OK-->

HTTP的響應報文包括:狀態行,響應頭,空行,數據(響應體)

2.1狀態行

包括:HTTP版本號,狀態碼和狀態值組成。

HTTP狀態碼:
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼的信息頭(server header)用以響應瀏覽器的請求。

HTTP狀態碼的英文爲HTTP Status Code。

五種狀態碼:

1xx:信息提示,表示請求已被成功接收,繼續處理。
2xx:請求被成功提交。
3xx:客戶端被重定向到其他資源。
4xx:客戶端錯誤狀態碼,格式錯誤或者不存在資源。
5xx:描述服務器內部錯誤。

常見的狀態碼描述如下:

200:客戶端請求成功,是最常見的狀態。
302:重定向。
404:請求資源不存在,是最常見的狀態。
400:客戶端請求有語法錯誤,不能被服務器所理解。
401:請求未經授權。(比如沒登錄)
403:服務器收到請求,但是拒絕提供服務。
500:服務器內部錯誤,是最常見的狀態。
503:服務器當前不能處理客戶端的請求。

2.2響應頭

類似請求頭,是一系列key-value值

應答頭 說明
Allow 服務器支持哪些請求方法(如GET、POST等)。
Content-Encoding 文檔的編碼(Encode)方法。只有在解碼之後纔可以得到Content-Type頭指定的內容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。
Content-Length 表示內容長度。
Content-Type **表示後面的文檔屬於什麼MIME類型。**Servlet默認爲text/plain,但通常需要顯式地指定爲text/html。
Date 當前的GMT時間。
Expires 應該在什麼時候認爲文檔已經過期,從而不再緩存它?
Last-Modified **文檔的最後改動時間。**客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視爲一個條件GET,只有改動時間遲於指定時間的文檔纔會返回,否則返回一個304(Not Modified)狀態。
Location **表示客戶應當到哪裏去提取文檔。**Location通常不是直接設置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼爲302。
Refresh 表示瀏覽器應該在多少時間之後刷新文檔,以秒計。注意Refresh頭不屬於HTTP 1.1正式規範的一部分,而是一個擴展,但Netscape和IE都支持它。
Server 服務器名字。Servlet一般不設置這個值,而是由Web服務器自己設置。
Set-Cookie 設置和頁面關聯的Cookie。
WWW-Authenticate 客戶應該在Authorization頭中提供什麼類型的授權信息?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。

2.3空白行

同上,響應報文也用空白行來分隔header和數據

2.4響應體

響應的data,本例中是一段HTML

三、cookie

一個域名下面可能存在着很多個cookie對象。

cookie的屬性:

name  字段爲一個cookie的名稱。

value  字段爲一個cookie的值。

domain  字段爲可以訪問此cookie的域名。

domain屬性可以使多個web服務器共享cookie。domain屬性的默認值是創建cookie的網頁所在服務器的主機名。不能將一個cookie的域設置成服務器所在的域之外的域。

例如讓位於a.sodao.com的服務器能夠讀取b.sodao.com設置的cookie值。如果b.sodao.com的頁面創建的cookie把它的path屬性設置爲"/",把domain屬性設置成".sodao.com",那麼所有位於b.sodao.com的網頁和所有位於a.sodao.com的網頁,以及位於sodao.com域的其他服務器上的網頁都可以訪問這個cookie。

非頂級域名,如二級域名或者三級域名,設置的cookie的domain只能爲頂級域名或者二級域名或者三級域名本身,不能設置其他二級域名的cookie,否則cookie無法生成。

頂級域名只能設置domain爲頂級域名,不能設置爲二級域名或者三級域名,否則cookie無法生成。

二級域名能讀取設置了domain爲頂級域名或者自身的cookie,不能讀取其他二級域名domain的cookie。

所以要想cookie在多個二級域名中共享,需要設置domain爲頂級域名,這樣就可以在所有二級域名裏面或者到這個cookie的值了。

頂級域名只能獲取到domain設置爲頂級域名的cookie,其他domain設置爲二級域名的無法獲取。

path  字段爲可以訪問此cookie的頁面路徑。

它指定與cookie關聯在一起的網頁。在默認的情況下cookie會與創建它的網頁,該網頁處於同一目錄下的網頁以及與這個網頁所在目錄下的子目錄下的網頁關聯

比如domain是abc.com,path是/test,那麼只有/test路徑下的頁面可以讀取此cookie。

expires/Max-Age   字段爲此cookie超時時間。

expires屬性
  指定了cookie的生存期,默認情況下cookie是暫時存在的,他們存儲的值只在瀏覽器會話期間存在,當用戶退出瀏覽器後這些值也會丟失,如果想讓cookie存在一段時間,就要爲expires屬性設置爲未來的一個用毫秒數表示的過期日期或時間點,expires默認爲設置的expires的當前時間。現在已經被max-age屬性所取代,max-age用秒來設置cookie的生存期

max-age屬性爲正數,則表示該cookie會在max-age秒之後自動失效。

瀏覽器會將max-age爲正數的cookie持久化,即寫到對應的cookie文件中。

無論客戶關閉了瀏覽器還是電腦,只要還在max-age秒之前,登錄網站時該cookie仍然有效。

max-age爲負數,則表示該cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口後該cookie即失效。

max-age爲負數的Cookie,爲臨時性cookie,不會被持久化,不會被寫到cookie文件中。

cookie信息保存在瀏覽器內存中,因此關閉瀏覽器該cookie就消失了。cookie默認的max-age值爲-1

max-age爲0,則表示刪除該cookie

cookie機制沒有提供刪除cookie的方法,因此通過設置該cookie即時失效實現刪除cookie的效果。失效的Cookie會被瀏覽器從cookie文件或者內存中刪除。

如果不設置expires或者max-age這個cookie默認是Session的,也就是關閉瀏覽器該cookie就消失了。

Size  字段 此cookie大小。

httponly屬性  

若此屬性爲true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。

這意味着,瀏覽器腳本,比如javascript中,是不允許訪問操作此cookie的。

secure   字段 設置是否只能通過https來傳遞此條cookie

它是一個布爾值,指定在網絡上如何傳輸cookie,默認是不安全的,通過一個普通的http連接傳輸。

四、HTTP請求的一個完整過程

1.建立 TCP 連接(之前可能還有一次DNS域名解析)

2.三次握手建立TCP完成後,客戶端向服務器發送請求命令,比如 GET https://www.baidu.com?name=xx&addr=xx HTTP1.1

3.客戶端發送請求頭信息,發送完了header後會接着發送一個空白行,GET請求沒有數據,POST請求要發送body數據

4.服務器接收到以上信息後,開始處理業務,處理完有了結果以後,服務器開始應答

5.服務器返回響應頭信息,發送完response header以後,再發送一個空白行

6.然後服務器向客戶端發送數據

7.發送完了服務器四次揮手關閉 TCP 連接
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章