HTTP中的請求和響應解析

原文鏈接:https://blog.csdn.net/gtlbtnq9mr3/article/details/78796955

目錄

一、用於HTTP請求中的常用請求頭字段

1. 請求報文

二、HTTP響應

1、狀態行:

2、狀態碼:

3、多個響應頭:

4、三種禁止瀏覽器緩存的頭字段:

5、常見狀態碼解析

6、 前兩行稱爲狀態行

7 、其餘部分稱爲應答實體

8、常見問題

三. Cookie


一、用於HTTP請求中的常用請求頭字段

Accept:用於高速服務器,客戶機支持的數據類型

Accept-Charset:用於告訴服務器,客戶機採用的編碼格式

Accept-Encoding:用於告訴服務器,客戶機支持的數據壓縮格式

Accept-Language:客戶機的語言環境

Host:客戶機通過這個頭高速服務器,想訪問的主機名

If-Modified-Since:客戶機通過這個頭告訴服務器,資源的緩存時間

Referer:客戶機通過這個頭告訴服務器,它是從哪個資源來訪問服務器的(防盜鏈)

User-Agent:客戶機通過這個頭告訴服務器,客戶機的軟件環境

Cookie:客戶機通過這個頭可以向服務器帶數據

Connection:處理完這次請求後是否斷開連接還是繼續保持連接

Date:當前時間值

1. 請求報文

HTTP協議使用TCP協議進行傳輸,在應用層協議發起交互之前,首先是TCP的三次握手。完成了TCP三次握手後,客戶端會向服務器發出一個請求報文。請求報文的格式如下圖抓包所示:

(1)前三行爲請求行,其餘部分稱爲 request-header。

請求行中的method表示這次請求使用的是get方法。請求方法的種類比較多,如option, get post  head  put,delete,trace等,常用的主要是get,pos。

Get表示請求頁面信息,返回頁面實體;

post是請求服務器將指定文檔作爲請求的url中的從屬實體,簡單說,我們常用的在網頁中填寫表單然後申請等動作就是使用了post方法,填寫用戶名密碼登錄站點就使用了post方法,如下圖:

 

(2)方法之後是URI,表示請求的頁面地址,圖中的“/”表示服務器的根目錄。之後是表示http的版本。

(3)請求行之後是請求首部。首部常見的部分有如下幾個:

l Accept:請求的對象類型。如果是“/”表示任意類型,如果是指定的類型,則會變成“type/”。

l Accept-Language:使用的語言種類。

l Accept-Encording:頁面編碼種類。

l Accept-Charset:頁面字符集。說到這裏,需要解釋以下字符集和編碼的區別。字符集通常對應着一種語言,將語言中的所有字符集合起來就可以視爲一種字符集,這樣我們可以看出,中文並非是一種字符集,因爲中文無法使用一些字符來進行表示;而編碼則是將字符轉換爲計算機所能識別的2進制數的一種方式,例如常說的unicode,UTF-8,ANSI等等,我們在訪問一些國外網站會出現亂碼的原因就是因爲我們瀏覽器所使用的編碼與頁面所使用的編碼不能互相識別。我們常說的BIG5和GB2312都是編碼。

l User-Agent:提供了客戶端瀏覽器的類型和版本。

l Host:連接的目標主機,如果連接的服務器是非標準端口,在這裏會出現使用的非標準端口。

l Connection:對於HTTP連接的處理,keep-alive表示保持連接,如果是在響應報文中發送頁面完畢就會關閉連接,狀態變爲close。

二、HTTP響應

1、狀態行:

用於描述服務器對請求的處理結果。

2、狀態碼:

100~199:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程。

200~299:表示成功接收請求並已完成整個處理過程。常用200

300~399:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、常用302(意味着你請求我,我讓你去找別人),307和304(我不給你這個資源,自己拿緩存)

400~499:客戶端的請求有錯誤,常用404(意味着你請求的資源在web服務器中沒有)403(服務器拒絕訪問,權限不夠)

500~599:服務器端出現錯誤,常用500

3、多個響應頭:

響應頭用於描述服務器的基本信息,以及數據的描述,服務器通過這些數據的描述信息,可以通知客戶端如何處理等一會兒它回送的數據。

Location:這個頭配合302狀態碼使用,用於告訴客戶找誰。

Server:服務器通過這個頭告訴瀏覽器服務器的類型。

Content-Encoding:服務器通過這個頭告訴瀏覽器數據的壓縮格式。

Content-Length:服務器通過這個頭告訴瀏覽器回送數據的長度

Content-Type:服務器通過這個頭告訴瀏覽器回送數據的類型

Last-Modified:告訴瀏覽器當前資源的最後緩存時間

Refresh:告訴瀏覽器隔多久刷新一次

Content-Disposition:告訴瀏覽器以下載方式打開數據

Transfer-Encoding:告訴瀏覽器數據的傳送格式

ETag:緩存相關的頭

4、三種禁止瀏覽器緩存的頭字段:

Expires:告訴瀏覽器把回送的資源緩存多長時間 -1或0則是不緩存

Cache-Control:no-cache

Pragma:no-cache

服務器通過以上兩個頭,也就是控制瀏覽器不要緩存數據

實體內容:代表服務器向客戶端回送的數據

5、常見狀態碼解析

l200(正常)表示一切正常,返回的是正常請求結果。

l302/307(臨時重定向)指出被請求的文檔已被臨時移動到別處,此文檔的新的URL在Location響應頭中給出。

l304(未修改)表示客戶機緩存的版本是最新的,客戶機應該繼續使用它。

l403(禁止)服務器理解客戶端請求,但拒絕處理它。通常由於服務器上文件或目錄的權限設置所致。

l404(找不到)服務器上不存在客戶機所請求的資源。

l500(內部服務器錯誤)服務器端的CGI、ASP、JSP等程序發生錯誤。

當收到get或post等方法發來的請求後,服務器就要對報文進行響應。同樣,響應報文也分爲兩部分。

6、 前兩行稱爲狀態行

狀態行給出了服務器的http版本,以及一個響應代碼。

響應代碼是服務器根據請求進行查找後得到的結果的一種反饋,共有5大類。分別以1、2、3、4、5開頭。

1**表示接收到請求,繼續進程,在發送post後可以收到該應答。

2**表示請求的操作成功,在發送get後返回。

3**表示重發,爲了完成操作必須進一步動作。

4**表示客戶端出現錯誤。

5**表示服務器出現錯誤。

7 、其餘部分稱爲應答實體

其中的server表示服務器軟件版本,

date標註了當前服務器的時間,

connection標明連接關閉,抓包可以發現在響應返回後服務器向客戶端發出fin包單向關閉了連接。

Expires表示在某個時間以前可以不用重新緩存該頁面,

cache-control表示對頁面是否進行緩存。

Pragma的參數no-cache表示對頁面不進行緩存。

content-type表示了應答請求後返回的內容類型。

Content還有內容長度和內容語言以及內容編碼三個項,其中內容長度只有在請求報文中的connection值爲keep-alive時纔會用到。

8、常見問題

1.請按自己的理解簡述HTTP 1.1與HTTP 1.0的區別。

HTTP1.0對於每個連接都的建立一次連接一次只能傳送一個請求和響應,請求就會關閉,HTTP1.0沒有Host字段;

而HTTP1.1在同一個連接中可以傳送多個請求和響應,多個請求可以重疊和同時進行,HTTP1.1必須有Host字段。

2.請描述HTTP請求消息和HTTP響應消息的組成結構,並各舉一例進行說明。

請求消息結構:一個請求行、若干消息頭、以及屍體內容,當中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用空行隔開。

響應消息結構:一個狀態行、若干消息頭、以及屍體內容,當中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用空行隔開。

兩者的區別:就是請求消息有請求行,響應消息有狀態行。

GET /mail/aa.html HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:8080
If-Modified-Since: Wed, 17 Oct 2012 09:35:13 GMT
If-None-Match: W/"62-1350466513174"
Connection: Keep-Alive
HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
ETag: W/"62-1350466513174"
Date: Wed, 17 Oct 2012 09:45:38 GMT

3.瀏覽器分別在哪些情況下使用GET方式和POST方式訪問WEB服務器?如果瀏覽器傳遞給WEB服務器的參數內容超過1K,應該使用那種方式發送請求消息?

數據量不大,因爲GET方式數據量限制1K,不帶有保護數據的情況下使用GET方式訪問WEB服務器;數據量大,而且帶有需要保護的數據時使用POST方式訪問WEB服務器。

如果瀏覽器傳送服務器的數據量超過1K,應使用POST方式訪問服務器,因爲POST方式向服務器傳送是數據時,會先把傳送的數據打包發送到WEB服務器。

4.請描述200、302、304、404和500等響應狀態碼所表示的意義。

200:表示成功,正常結果;

302:表示重定向,轉到別的站點;

304:表示未修改;

404:表示找不到資源;

500:表示內部服務器錯誤;

5.請列舉三種禁止瀏覽器緩存的頭字段,並寫出相應的設置值。

Expires:告訴瀏覽器把回送的資源緩存多長時間 -1或0則是不緩存

Cache-Control:no-cache

Pragma:no-cache

三. Cookie

(1)概念及作用

cookie是一種類似緩存的機制,它保存在一個本地的文本文件中,

其主要作用是在發送請求時將cookie放在請求首部中發送給服務器,服務器收到cookie後查找自己已有的cookie信息,確定客戶端的身份,然後返回相應的頁面,cookie的方便之處在於可以保持一種已登錄的狀態,

例如:我們註冊一個論壇,每次訪問都需要進行填寫用戶名和密碼然後登錄。而使用了cookie後,如果cookie沒有到達過期時間,那麼我們只需在第一次登錄時填寫信息然後登錄,以後的訪問就可以省略這一步驟。

(2) 交互過程

在HTTP協議中,cookie的交互過程是這樣的:

首先是三次握手建立TCP連接,

然後客戶端發出一個http request,這個request中不包含任何cookie信息。

 

當服務器收到這個報文後,針對request method作出響應動作,在響應報文的實體部分,加入了set-cookie段,set-cookie段中給出了cookie的id,過期時間以及參數path,path是表示在哪個虛擬目錄路徑下的頁面可以讀取使用該cookie,將這些信息發回給客戶端後,客戶端在以後的http request中就會將自己的cookie段用這些信息填充。

如果用戶在連接中通過了服務器相應的認證程序,服務器會添加一個cdb_auth到set-cookie中,這個段表示了客戶端的認證信息,而客戶端以後在訪問過程中也會將cdb_auth信息寫入自己的cookie字段。服務器每次收到http request後讀取cookie,然後根據cookie的信息返回不同的頁面。例如,沒有通過認證的客戶端在request中不會有cdb_auth,因此服務器讀取cookie後,不會將通過認證的客戶端的頁面返回給該客戶端。

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