HTTP基本原理

HTTP基本原理javascript

 1.1 URL 和 URIhtml

   URI 全稱爲 Uniform Resource Identifier,意爲統一資源標誌符,URL 全稱爲 Universal Resource Locator ,意爲統一資源定位符。例如:https://github.com/favicon.ico 是Github的網站圖標連接,它既是一個 URL 也是一個 URI 。即有這樣的一個圖標資源,咱們用 URL / URI 來惟一指定了它的訪問方式,這其中包括了訪問協議、訪問路徑和資源名稱。經過這樣一個連接,咱們即可以從互聯網上找到這個資源,這就是 URL / URI。URL 是 URI 的子集,也就是說每一個URL都是URI,但不是每一個 URI 都是 URL。除了 URL 之外,URI 還包括 URN (全稱爲 Universal Resource Name,統一資源名稱),URN 只命名資源而不指定如何定位資源,好比:urn:isbn:0451450523 指定了一本書的 ISBN,能夠惟一標識這本書,可是沒有指定到哪裏定位這本書。在互聯網中,URN 用的很是少,因此幾乎全部的 URI 都是 URL,對於通常的網頁而言,既是URL,又是URI。java

 

 1.2 HTTP 和 HTTPSpython

  HTTP 全稱爲 Hyper Text Transfer Protocol,意爲超文本傳輸協議。HTTP協議是用於從網絡傳輸超文本數據到本地瀏覽器的傳輸協議,它能保證高效而準確地傳送超文本文檔(網頁)。HTTPS 全稱爲 Hyper Text Transfer Protocol over Secure Socket Layer ,是以安全爲目標的 HTTP 通道,意思就是HTTP的安全版(基於HTTP加入了SSL層)。git

 

1.3 HTTP請求過程github

  咱們在瀏覽器中輸入一個 URL 按回車以後便會在瀏覽器中觀察到網頁的內容,實際上,這個過程瀏覽器向網站所在服務器發送了一個請求,網站服務器接收到請求後進行處理和解析,而後返回響應,傳回給瀏覽器。響應裏面包含了網頁的源代碼等內容,瀏覽器再對其進行解析,便將網頁呈現出來。瀏覽器

以訪問百度爲例:緩存

在 URL 地址欄輸入https://www.baidu.com 而後按回車,瀏覽器就會向百度的服務器發送請求,而百度的服務器返回的響應就是上圖中的結果。安全

第一列 Name : 請求的名稱,通常會將URL 的最後一部份內容看成名稱服務器

第二列 Status : 響應的狀態碼,200表明響應是正常的。經過這個狀態碼,咱們能夠判斷髮送了請求之後是否獲得了正常的響應。

第三列 Type : 請求的文檔類型。document表明此次請求的是一個HTML文檔。

第四列 Initiator :請求源,用來標記請求是由哪一個對象或進程發起的。

第五列 Size :從服務器下載的文件和請求的資源大小,若是是從緩存中取得的資源,則會顯示 from cache。

第六列 Time :發起請求到獲取響應所用的總時間。

第七列 Waterfall :網絡請求的可視化瀑布流。

點擊具體的條目還能夠查看更詳細的信息:

General部分:Request URL 爲請求URL,Request Method 爲請求的方法(常見的有GET和POST),Status Code爲響應狀態碼,Remote Address 爲遠程服務器的地址和端口,Referrer Policy 爲Referrer判別策略。

Response Headers 爲響應頭,Request Headers爲請求頭。

  請求,由客戶端向服務器發出,能夠分爲4部份內容:請求方法(Request Method)、請求地址(Request URL)、請求頭(Request Headers)、請求體(Request Body)。

  常見得請求方法有兩種:GET 和 POST。在瀏覽器中直接輸入URL 按回車,這便發起了一個 GET 請求,請求的參數會直接包含在 URL 裏面。例如,在百度搜素python,這就是一個GET請求,連接爲https://www.baidu.com/s?wd=python ,其中URL中包含了請求的參數信息,參數wd表示要搜尋的關鍵字。問號?後面的內容稱爲查詢字符串,也就是一堆請求參數,多個請求參數之間使用&連接。POST請求大多在表單提交時發起,由於POST請求與GET請求最大的區別就是請求參數是否暴露,GET請求的參數直接暴露在URL中,對於一個用戶註冊或登陸的表單這無疑就是很嚴重的問題了,由於用戶名和密碼都直接暴露在URL地址欄上;POST請求的參數是包含在請求體中的,數據都是經過表單形式傳輸。除此之外,這兩種請求還有一點區別就是:GET請求提交的數據最多隻有1024字節,而POST請求沒有限制。

  請求地址,就是統一資源定位符URL,能夠惟一肯定請求的資源。

  請求頭,用來講明服務器使用的附加信息,例如:Cookie、Referer、User-Agent 等。一樣以訪問百度爲例來講明請求頭:

Accept:請求報頭,用於指定客戶端可接受哪些類型的信息, */*表明能夠接受任何類型的信息。

Accept-Language:指定客戶端可接受的語言類型

Accept-Encoding:指定客戶端可接受的內容編碼

Host:用於指定請求資源的主機 IP 和端口號,其內容爲請求URL的原始服務器或網關的位置。

Cookie:有的也用複數形式Cookies,這是網站爲了辨別用戶進行會話跟蹤而存儲在用戶本地的數據,是一堆key=value。

Referer:標識請求從哪一個頁面發過來

User-Agent:是一個特殊的字符串頭,可使服務器識別客戶端的操做系統及版本、瀏覽器及版本等信息,爬蟲必須加上該信息,不然會被識別爲爬蟲。

Content-Type:互聯網媒體類型

  請求體,通常承載的內容是POST請求中的表單數據,GET請求沒有請求體。

  響應,由服務器返回給客戶端,分爲三部分:響應狀態碼(Response Status Code)、響應頭(Response Headers)和響應體(Response Body)。

  響應狀態碼標識服務的響應狀態,好比常見的有:200表明服務器正常響應,404表明頁面沒有找到,500表明服務器內部發生錯誤。除此之外,還有以下狀態碼:

  響應頭包含了服務器對請求的應答信息,例如:

Date:標識響應產生的時間

Last-Modified:指定資源的最後修改時間

Content-Encoding:指定響應內容的編碼

Set-Cookie:設置Cookies,響應頭中的Set-Cookies告訴瀏覽器須要將此內容放在Cookies中,下次請求攜帶Cookies請求。

Expires:指定響應的過時時間

Content-Type:文檔類型,指定返回的數據類型。text/html表明返回HTML文檔,application/x-javascript表明返回JS文件,image/jpeg表明返回圖片

  響應體,響應的正文數據都在響應體重,好比請求網頁時,它的響應體就是網頁的HTML代碼,請求一張圖片時,它的響應體就是圖片 的二進制數據。

 

1.4 無狀態的HTTP

  HTTP的無狀態是指HTTP協議對事務處理是沒有記憶能力的,也就是說服務器不知道客戶端是什麼狀態。當咱們向服務器發送請求後,服務器解析該請求,而後返回對應的響應,服務器負責完成這個過程,並且這個過程是徹底獨立的,服務器不會記錄先後狀態的變化,也就是缺乏狀態記錄。這就意味着若是後續須要處理前面的信息,則必須從新傳,這致使須要額外傳遞一些前面的重複請求,才能獲取後續響應。

  正是由於這個現象,就有了會話和Cookies技術。會話在服務端,用來保存用戶的會話信息;Cookies在客戶端,瀏覽器在下次訪問網頁時會自動附帶上它發送給服務器,服務器經過識別Cookies並鑑定出是哪一個用戶。Cookies也分爲會話Cookie和持久Cookie,會話Cookie就是把Cookie放在瀏覽器內存裏,瀏覽器關閉以後該Cookie失效;持久Cookie則保存在客戶端的硬盤中,下次還能夠繼續使用。下面以知乎爲例說明Cookie:

Name:Cookie名稱,一旦建立則不可修改

Value:Cookie的值,若是是Unicode字符,須要字符編碼,若是是二進制數據,則須要使用BASE64編碼

Domain:能夠訪問該Cookie的域名,例如:.zhihu.com表示全部以zhihu.com結尾的域名均可以訪問該Cookie

Max Age:該Cookie的失效時間

Path:該Cookie的使用路徑

Size:Cookie的大小

HTTP:若是該屬性爲True,則只有在HTTP頭中會帶有此Cookie

相關文章
相關標籤/搜索