HTTP協議客戶端是如何向服務器發送請求


  • 一、HTTP協議解讀

HTTP協議:超文本傳輸協議(HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。 所有的HTML文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的 方法。 

HTTPS協議(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在 HTTP下加入SSL層。

  SSL (Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡連接進行加 密,保障在Internet上數據傳輸的安全。

  HTTP 的端口號為 80,

  HTTPS 的端口號為 443

1、HTTP請求的過程:

客戶端:PC端應用程序 瀏覽器 APP 小程序 ,爬蟲(代碼) HTTP通信由兩部分組成: 客戶端請求消息 與 服務器響應消息

1. 當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵之后,瀏覽器會向HTTP服務器發送HTTP請 求。HTTP請求主要分為“Get”和“Post”兩種方法。

2. 當我們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發送一個Request請求去獲取 ht tp://www.baidu.com 的html文件,服務器把Response文件對象發送回給瀏覽器。

3. 瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件, JS文件。 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。

4. 當所有的文件都下載成功后,網頁會根據HTML語法結構,完整的顯示出來了。 URL(Uniform / Universal Resource Locator的縮寫):統一資源定位符,是用於完整地描述Internet 上網頁和其他資源的地址的一種標識方法。

  基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]

        scheme:協議(例如:http, https, ftp)

        host:服務器的IP地址或者域名

        port#:服務器的端口(如果是走協議默認端口,缺省端口80)

        path:訪問資源的路徑

        query-string:參數,發送給http服務器的數據

        anchor:錨(跳轉到網頁的指定錨點位置)

2、HTTP請求信息

在瀏覽器中輸入URL地址,訪問某個網站,發送一個HTTP請求到服務器的請求消息,包括以下格式:

請求行           請求頭部              空行              請求數據

1.Host (主機和端口號) Host:對應網址URL中的Web名稱和端口號(域名)

2. Connection (鏈接類型) Connection:表示客戶端與服務連接類型:keep-alive表示長連接(HTTP/1.1使用 keep-alive 為默 認值。)

3. Upgrade-Insecure-Requests (升級為HTTPS請求) Upgrade-Insecure-Requests:升級不安全的請求,意思是會在加載 http 資源時自動替換成 https 請求,讓瀏覽器不再顯示https頁面中的http請求警報。

4、User-Agent (瀏覽器名稱) User-Agent:是客戶瀏覽器的名稱。

5、Accept (傳輸文件類型) Accept:指瀏覽器或其他客戶端可以接受的文件類型,服務器可以根據它判斷並返回適當的文件 格式。 Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8 :表示瀏覽器支持的 MIME 類型分別是 html文本、xhtml和xml文檔、所有的圖像格式資源。 Text:文本信息,可以是多種字符集和或者多種格式的; Application:用於傳輸應用程序數據或者二進制數據。 q是權重系數,范圍 0 =< q <= 1,q 值越大,越靠前。默認為1,按從左到右排序順序;若賦 值為0,表示瀏覽器不接受此類型。

6. Referer (頁面跳轉處) Referer:表明產生請求的網頁來自於哪個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。 這個屬性可以用來跟蹤Web請求來自哪個頁面,是從什么網站來的等。

7. Accept-Encoding(文件編解碼格式) Accept-Encoding:指出瀏覽器可以接受的編碼方式。編碼方式不同於文件格式,它是為了壓縮文 件並加速文件傳遞速度。瀏覽器在接收到Web響應之后先解碼,然后再檢查文件格式,許多情形 下這可以減少大量的下載時間。

8. Accept-Language(語言種類) Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us指英語,zh或者zh-cn指中 文,當服務器能夠提供一種以上的語言版本時要用到。

9、Cache-Control:max-age=0 明確表示不會緩存服務器資源、

10、Accept-Charset(字符編碼) Accept-Charset:指出瀏覽器可以接受的字符編碼。 如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。

11. Cookie (Cookie) Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它可 以記載和服務器相關的用戶信息,也可以用來實現會話功能,以后會詳細講。

12. Content-Type (POST數據類型) Content-Type:POST請求里用來表示的內容類型 

3、HTTP響應信息

 服務器接收到請求后,返回的HTTP響應也由四個部分組成,分別是:

狀態行     消息報頭      空行      響應正文

 1,Cache-Control:must-revalidate, no-cache, private。 這個值告訴客戶端,服務端不希望客戶端緩存資源,在下次請求資源時,必須要從新請求服務器,不能 從緩存副本中獲取資源。 Cache-Control是響應頭中很重要的信息,當客戶端請求頭中包含Cache-Control:max-age=0請 求,明確表示不會緩存服務器資源時,Cache-Control作為作為回應信息,通常會返回no-cache, 意思就是說,"那就不緩存唄"。 當客戶端在請求頭中沒有包含Cache-Control時,服務端往往會定,不同的資源不同的緩存策略,比 如說oschina在緩存圖片資源的策略就是Cache-Control:max-age=86400,這個意思是,從當前時 間開始,在86400秒的時間內,客戶端可以直接從緩存副本中讀取資源,而不需要向服務器請求。

2. Connection:keep-alive 這個字段作為回應客戶端的Connection:keep-alive,告訴客戶端服務器的tcp連接也是一個長連接, 客戶端可以繼續使用這個tcp連接發送http請求。

3. Content-Encoding:gzip 告訴客戶端,服務端發送的資源是采用gzip編碼的,客戶端看到這個信息后,應該采用gzip對資源進行 解碼。 狀態行 消息報頭 空行 響應正文 HTTP/1.1 200 OK Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: https://m.baidu.com,https: Connection: keep-alive Content-Encoding: gzip Content-Type: text/html Date: Tue, 12 Mar 2019 07:58:18 GMT Search_result: OK Server: Apache Tracecode: 34988465750563182602031215 Tracecode: 34988458200827947786031215 Vary: Accept-Encoding Transfer-Encoding: chunked

4. Content-Type:text/html;charset=UTF-8 告訴客戶端,資源文件的類型,還有字符編碼,客戶端通過utf-8對資源進行解碼,然后對資源進行 html解析。通常我們會看到有些網站是亂碼的,往往就是服務器端沒有返回正確的編碼。

5. Date:Sun, 21 Sep 2016 06:18:21 GMT 這個是服務端發送資源時的服務器時間,GMT是格林尼治所在地的標准時間。http協議中發送的時間都 是GMT的,這主要是解決在互聯網上,不同時區在相互請求資源的時候,時間混亂問題。

6. Expires:Sun, 1 Jan 2000 01:00:00 GMT 這個響應頭也是跟緩存有關的,告訴客戶端在這個時間前,可以直接訪問緩存副本,很顯然這個值會存 在問題,因為客戶端和服務器的時間不一定會都是相同的,如果時間不同就會導致問題。所以這個響應 頭是沒有Cache-Control:max-age=*這個響應頭准確的,因為max-age=date中的date是個相對時 間,不僅更好理解,也更准確。

7. Pragma:no-cache 這個含義與Cache-Control等同。

8.Server:Tengine/1.4.6 這個是服務器和相對應的版本,只是告訴客戶端服務器的信息。

9. Transfer-Encoding:chunked 這個響應頭告訴客戶端,服務器發送的資源的方式是分塊發送的。一般分塊發送的資源都是服務器動態 生成的,在發送時還不知道發送資源的大小,所以采用分塊發送,每一塊都是獨立的,獨立的塊都能標 示自己的長度,最后一塊是0長度的,當客戶端讀到這個0長度的塊時,就可以確定資源已經傳輸完了。

10. Vary: Accept-Encoding 告訴緩存服務器,緩存壓縮文件和非壓縮文件兩個版本,現在這個字段用處並不大,因為現在的瀏覽器 都是支持壓縮的。

11. Cookie:通過在 客戶端 記錄的信息確定用戶的身份。

12. Session:通過在 服務器端 記錄的信息確定用戶的身份

4、HTTP響應狀態碼

 

 

 

 

 

 5、HTTP請求方法

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

 HTTP請求常用的 Get 和 Post 兩種方法

GET是從服務器上獲取數據,POST是向服務器傳送數據

GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來產生 響應內容,即“Get”請求的參數是URL的一部分。 例如: http://www.baidu.com/s? wd=Chinese&tt=9999

POST請求參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向HTTP服 務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等),請求的參數包含在 “Content-Type”消息頭里,指明該消息體的媒體類型和編碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM