1. 程式人生 > >http請求過程(訪問一個頁面,發生了怎樣的網路請求?)

http請求過程(訪問一個頁面,發生了怎樣的網路請求?)

  1. 域名解析->域名 ->快取->根域dns->頂級域dns->本域dns->伺服器IP
    1.搜尋瀏覽器自身DNS快取,如果不存在或者過期(>60s)放棄
    2.搜尋作業系統自身的dns快取
    3.讀取本地的HOST檔案
    4.瀏覽器發起一個DNS的系統呼叫 域名解析
    5.客戶端通過隨機埠使用tcp協議伺服器ip的80埠發起連線請求 三次握手
    6.tcp/ip連線請求建立後瀏覽器可以向伺服器發起http請求
    7.http客戶端發起請求,建立埠,解析使用者操作,拼接請求頭資訊
    8.http客戶端並向伺服器的該埠傳送request頭資訊
    9.伺服器監聽埠 如80
    10.http監聽到發到80埠的請求頭資訊
    11.http伺服器解析頭資訊
    12.http伺服器 按照請求頭資訊,返回相應響應頭資訊response
    13.響應頭資訊傳送給http客戶端,客戶端解析響應頭資訊,並完成其他操作
    14.完成一次http請求

    上文來自 https://www.cnblogs.com/greatluoluo/p/5725082.html

  2. 在瀏覽器中敲入一個 URL 到獲取網頁內容發生了一個怎樣的過程?

    先了解一下 URI 和 URL
    URI 全稱為 UniformResource Identifier,即統一資源標誌符,
    URL 全稱為 Universal Resource Locator,即統一資源定位符。

    超文字
    超文字英文名稱叫做 Hypertext,我們在瀏覽器裡面看到的網頁就是超文字解析而成的,其網頁原始碼是一系列 HTML 程式碼,而這網頁的原始碼HTML 就可以稱作超文字。

    http
    HTTP 的全稱是 Hyper Text Transfer Protocol,中文名叫做超文字傳輸協議,
    HTTP協議是用於從網路傳輸超文字資料到本地瀏覽器的傳送協議,它能保證傳送高效而準確地傳送超文字文件。
    在URL 的開頭會有 http 或 https,這個就是訪問資源需要的協議型別,有時我們還會看到 ftp、sftp、smb 開頭的 URL

  3. http請求過程
    我們在瀏覽器中輸入一個 URL,回車之後便會在瀏覽器中觀察到頁面內容,實際上這個過程是瀏覽器向網站所在的伺服器傳送了一個 Request,即請求,網站伺服器接收到這個 Request 之後進行處理和解析,然後返回對應的一個 Response,即響應,然後傳回給瀏覽器,Response裡面就包含了頁面的原始碼等內容,瀏覽器再對其進行解析便將網頁呈現了出來,模型如圖所示:在這裡插入圖片描述

  4. http://www.baidu.com/,輸入該 URL,敲擊回車訪問這個頁面,觀察一下在這個過程中發生了怎樣的網路請求?
    F12 -> Network.

在這裡插入圖片描述
這一個條目的各列分別代表:

第一列 Name,即 Request 的名稱。一般會用URL的最後一部分內容當做名稱。
第二列 Status,即 Response 的狀態碼。這裡顯示為 200,代表 Response 是正常的,通過狀態碼我們可以判斷髮送了 Request 之後是否得到了正常的 Response。
第三列 Type,即 Request 請求的文件型別。這裡為 document,代表我們這次請求的是一個 HTML 文件,內容就是一些 HTML 程式碼。
第四列 Initiator,即請求源。用來標記 Request 是由哪個物件或程序發起的。
第五列 Size,即從伺服器下載的檔案和請求的資源大小。如果是從快取中取得的資源則該列會顯示 from cache。
第六列 Time,即發起 Request 到獲取到 Response 所用的總時間。
第七列 Timeline,即網路請求的視覺化瀑布流。
在這裡插入圖片描述

General
Request URL: https://www.baidu.com/
Request Method: GET
Status Code: 200 OK
Remote Address: 61.135.169.125:443
Referrer Policy: no-referrer-when-downgrade

首先是 General 部分,
Request URL 為 Request 的 URL,
RequestMethod 為請求的方法,.
Status Code 為響應狀態碼,
Remote Address 為遠端伺服器的地址和埠,
Referrer Policy 為 Referrer 判別策略。

Response Headers
Bdpagetype: 2
Bdqid: 0x81a0a6a90003fce2
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 12 Oct 2018 08:27:51 GMT
Expires: Fri, 12 Oct 2018 08:27:51 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=319; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1438_27215_21122_20928; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8

Request Headers
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BAIDUID=91549D75F9BB27A514CBC4671D78FCF3:FG=1; BIDUPSID=91549D75F9BB27A514CBC4671D78FCF3; PSTM=1536133533; BD_UPN=12314753; MSA_WH=388_483; MCITY=-176%3A; ispeed_lsm=2; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDUSS=FBFdFJQQVo4eUROWTVtSjZBWHhhdzlxa2JZZk1lZGNJfms4eEczcVpoSmMyZVpiQUFBQUFBJCQAAAAAAAAAAAEAAAAPIGWVMzIxeWZ0MDAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxMv1tcTL9bc; H_PS_PSSID=1438_27215_21122_20928; delPer=0; BD_CK_SAM=1; PSINO=2; BD_HOME=1
DNT: 1
Host: www.baidu.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36

再繼續往下看可以看到有一個
Response Headers 和一個 Request Headers,這分別代表響應頭和請求頭,
請求頭裡面帶有許多請求資訊,例如瀏覽器標識、Cookies、Host 等資訊,這是Request 的一部分,伺服器會根據請求頭內的資訊判斷請求是否合法,進而作出對應的響應,返回Response,那麼在圖中看到的 Response Headers 就是 Response 的一部分,例如其中包含了伺服器的型別、文件型別、日期等資訊,瀏覽器接受到 Response 後,會解析響應內容,進而呈現網頁內容。

詳細解釋往下看

5. 請求 Request 和響應 Response 都包含了哪些內容?

(1) Request

Request,即請求,由客戶端向服務端發出。
可以將 Request 劃分為四部分內容:
Request Method、Request URL、Request Headers、Request Body,
即請求方式、請求連結、請求頭、請求體。
Request Method

請求方式,請求方式常見的有兩種型別,GET 和 POST。
GET 請求: 瀏覽器中直接輸入一個 URL 並回車,這便發起了一個 GET 請求
POST 請求: 表單提交

> 我們在瀏覽器中直接輸入一個 URL 並回車,這便發起了一個 GET 請求,請求的引數會直接包含到 URL 裡,例如百度搜索Python,這就是一個 GET 請求,連結為:https://www.baidu.com/s?wd=Python,URL中包含了請求的引數資訊,這裡引數 wd 就是要搜尋的關鍵字。 

> POST 請求大多為表單提交發起,如一個登入表單,輸入使用者名稱密碼,點選登入按鈕,這通常會發起一個 POST 請求,其資料通常以 Form Data,即表單的形式傳輸,不會體現在 URL 中。

GET 和 POST 請求方法有如下區別:

GET 方式請求中引數是包含在 URL 裡面的,資料可以在 URL 中看到,而 POST 請求的 URL 不會包含這些資料,資料都是通過表單的形式傳輸,會包含在 Request Body 中
GET 方式請求提交的資料最多隻有 1024 位元組,而 POST 方式沒有限制。

所以一般來說,網站登入驗證的時候,需要提交使用者名稱密碼,這裡包含了敏感資訊,使用GET方式請求的話密碼就會暴露在URL裡面,造成密碼洩露,所以這裡最好以POST方式傳送。檔案的上傳時,由於檔案內容比較大,也會選用POST方式。

我們平常遇到的絕大部分請求都是 GET 或 POST 請求,另外還有一些請求方式,如 HEAD、PUT、DELETE、OPTIONS、CONNECT、TRACE,我們簡單將其總結如下:

方法描述 GET請求指定的頁面資訊,並返回實體主體。
HEAD類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
POST向指定資源提交資料進行處理請求,資料被包含在請求體中。
PUT從客戶端向伺服器傳送的資料取代指定的文件的內容。
DELETE請求伺服器刪除指定的頁面。
CONNECTHTTP/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器。
OPTIONS允許客戶端檢視伺服器的效能。
TRACE回顯伺服器收到的請求,主要用於測試或診斷。
本表參考:http://www.runoob.com/http/http-methods.html。

Request Headers
請求頭,用來說明伺服器要使用的附加資訊,比較重要的資訊有 Cookie、Referer、User-Agent等,下面將一些常用的頭資訊說明如下:

Accept,請求報頭域,用於指定客戶端可接受哪些型別的資訊。
Accept-Language,指定客戶端可接受的語言型別。
Accept-Encoding,指定客戶端可接受的內容編碼。
Host,用於指定請求資源的主機 IP 和埠號,其內容為請求 URL 的原始伺服器或閘道器的位置。從 HTTP 1.1 版本開始,Request 必須包含此內容。
Cookie,也常用複數形式 Cookies,是網站為了辨別使用者進行 Session 跟蹤而儲存在使用者本地的資料。Cookies 的主要功能就是維持當前訪問會話,例如我們輸入使用者名稱密碼登入了某個網站,登入成功之後伺服器會用 Session 儲存我們的登入狀態資訊,後面我們每次重新整理或請求該站點的其他頁面時會發現都是保持著登入狀態的,在這裡就是 Cookies 的功勞,Cookies 裡有資訊標識了我們所對應的伺服器的 Session 會話,每次瀏覽器在請求該站點的頁面時都會在請求頭中加上 Cookies 並將其傳送給伺服器,伺服器通過 Cookies 識別出是我們自己,並且查出當前狀態是登入的狀態,所以返回的結果就是登入之後才能看到的網頁內容。
Referer,此內容用來標識這個請求是從哪個頁面發過來的,伺服器可以拿到這一資訊並做相應的處理,如做來源統計、做防盜鏈處理等。
User-Agent,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本、瀏覽器及版本等資訊。在做爬蟲時加上此資訊可以偽裝為瀏覽器,如果不加很可能會被識別出為爬蟲。
Content-Type,即 Internet Media Type,網際網路媒體型別,也叫做 MIME 型別,在 HTTP 協議訊息頭中,使用它來表示具體請求中的媒體型別資訊。例如 text/html 代表 HTML 格式,image/gif 代表 GIF 圖片,application/json 代表 Json 型別,
更多對應關係可以檢視此對照表:http://tool.oschina.net/commons。
Request Body

即請求體,一般承載的內容是 POST 請求中的 Form Data,即表單資料,而對於 GET 請求 Request Body 則為空。


(2)Response

Response,即響應,由服務端返回給客戶端。
Response 可以劃分為三部分,Response Status Code、Response Headers、Response Body。

Response Status Code

響應狀態碼,此狀態碼錶示了伺服器的響應狀態,

200 則代表伺服器正常響應,
404 則代表頁面未找到,
500 則代表伺服器內部發生錯誤。

Response Headers

響應頭,其中包含了伺服器對請求的應答資訊,如 Content-Type、Server、Set-Cookie 等,下面將一些常用的頭資訊說明如下:

Date,標識 Response 產生的時間。
Last-Modified,指定資源的最後修改時間。
Content-Encoding,指定 Response 內容的編碼。
Server,包含了伺服器的資訊,名稱,版本號等。
Content-Type,文件型別,指定了返回的資料型別是什麼,如text/html 則代表返回 HTML 文件,application/x-javascript 則代表返回 JavaScript 檔案,image/jpeg 則代表返回了圖片。
Set-Cookie,設定Cookie,Response Headers 中的 Set-Cookie即告訴瀏覽器需要將此內容放在 Cookies 中,下次請求攜帶 Cookies 請求。
Expires,指定 Response 的過期時間,使用它可以控制代理伺服器或瀏覽器將內容更新到快取中,如果再次訪問時,直接從快取中載入,降低伺服器負載,縮短載入時間。

Resposne Body

即響應體,最重要的當屬響應體內容了,響應的正文資料都是在響應體中,如請求一個網頁,它的響應體就是網頁的 HTML 程式碼,請求一張圖片,它的響應體就是圖片的二進位制資料。所以最主要的資料都包含在響應體中了

響應體內容

我們在瀏覽器開發者工具中點選 Preview,就可以看到網頁的原始碼,這也就是響應體內容,是解析的目標。

我們在做爬蟲時主要解析的內容就是 Resposne Body,通過 Resposne Body 我們可以得到網頁的原始碼、Json 資料等等,然後從中做相應內容的提取。

以上便是 Response 的組成部分。


轉載請務必附上原博主博文連結:https://blog.csdn.net/zz_1111/article/details/79192167?utm_source=copy
他的實習導師http://blog.csdn.net/a15020059230/article/category/6961754