HTTP:偉大而又無聞的協議
學習一時爽,一直學習一直爽!
Hello,大家好啊,我是Connor,一個從無到有的技術小白。有的人一說什麼是HTTP協議就犯愁,寫東西的時候也沒想過什麼是HTTP協議,只是知道HTTP協議是用來網頁傳輸的,但是再深究一點就不明白了,所以今天我們來講一講什麼是HTTP協議。
1.HTTP 與 HTTPS
1.1 什麼是HTTP協議
超文本傳輸協議(HTTP,HyperText Transfer Protocol) 是互聯網上應用最爲廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。
HTTP協議是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。
一次HTTP請求的基本流程一般是,在建立TCP連接後,由客戶端向服務端發起一次請求 request ,而服務器在接收到以後返回給客戶端一個響應 response 。所以我們看到的HTTP請求內容一般就分爲請求和響應兩部分。
HTTP協議通常承載於TCP協議之上,默認HTTP的端口號爲80。有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS,稍後我們會詳細說HTTP和HTTPS的區別。
1.2 HTTP協議的特點
-
http協議支持客戶端/服務端模式,也是一種請求/響應模式的協議。
-
無連接。所謂的無連接就是服務器收到了客戶端的請求之後,響應完成並收到客戶端的應答之後,即斷開連接。限制每次的連接只處理一次請求。從而節省傳輸時間。
-
無狀態。HTTP協議是無狀態的,也就是說每一次HTTP請求之間都是相互獨立的,沒有聯繫的,服務端不知道客戶端具體的狀態。比如客戶端訪問一次網頁之後關閉瀏覽器,然後再一次啓動瀏覽器,再訪問該網站,服務器是不知道客戶關閉了一次瀏覽器的。這樣設計的原因是因爲Web服務器一般需要面對很多瀏覽器的併發訪問,爲了提高Web服務器對併發訪問的處理能力,在設計HTTP協議時規定Web服務器發送HTTP應答報文和文檔時,不保存發出請求的Web瀏覽器進程的任何狀態信息
-
簡單快捷:所謂的簡單快捷是指客戶端向服務器請求服務時,一般來說只需要傳輸請求方法和路徑,就能進行訪問。
-
靈活:客戶端可以通過HTTP協議傳輸任意類型的數據,包括但不限於文本,圖片,視頻等
1.3 HTTP與HTTPS的區別
HTTP大家都知道是什麼東西了,那什麼是HTTPS呢?HTTPS是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,承載於SSL協議層之上。因此加密的詳細內容就需要SSL。
區別 | HTTP | HTTPS |
---|---|---|
安全性 | 不安全 | 安全 |
是否需要證書 | 不需要 | 需要 |
傳輸方式 | 明文傳輸 | 加密傳輸 |
默認端口 | 80 | 443 |
HTTPS和HTTP相比的主要優勢就是體現在它的安全性上,它的缺點也很明顯,體現在它的行能和技術方面,具體的優缺點我們不再多說,大家可以自行體會。
2.HTTP 請求
每一個HTTP請求都由三部分組成,分別是:請求行、請求報頭、請求正文。
2.1 請求行
請求行一般由請求方法、url路徑、協議版本組成,如下所示:
GET https://www.baidu.com HTTP/1.1
通過上面我們可以看到請求行分了三個部分,其中GET
就是請求行中的請求方法,https://www.baidu.com
就是請求行中的url路徑, HTTP/1.1
就是它的協議版本。
2.2 請求報頭(請求頭)
請求頭遵循以下格式:
名字:空格 + 值
常用的請求頭的屬性如下:
屬性名 | 作用 |
---|---|
Host | 指定的請求資源的域名(主機和端口號)。HTTP請求必須包含HOST,否則系統會以400狀態碼返回。 |
User-Agent | 簡稱UA,內容包含發出請求的用戶信息,通常UA包含瀏覽者的信息,主要是瀏覽器的名稱版本和所用的操作系統。這個UA頭不僅僅是使用瀏覽器才存在,只要使用了基於HTTP協議的客戶端軟件都會發送,無論是手機端還是PDA等,這個UA頭是辨別客戶端所用設備的重要依據。 |
Accept | 告訴服務器可以接受的文件格式。 |
Cookie | 告訴瀏覽器Cookie信息 |
Cache-Control | 指定請求和響應遵循的緩存機制。 |
Referer | 頁面跳轉處,表明請求來自於哪個URL,用戶是從該哪個頁面訪問到當前頁面的。 |
Content-Length | 內容長度。 |
Content-Range | 響應的資源範圍。可以在每次請求中標記請求的資源範圍,在連接斷開重連時,客戶端只請求該資源未下載的部分,而不是重新請求整個資源,實現斷點續傳。 |
Accept-Encoding | 指定所能夠接受的編碼方式 |
Accept-Language | 指瀏覽器可以接受的語言種類 en、en-us指英語 zh、zh-cn指中文。 |
Connection | 客戶端與服務器鏈接類型,keep-alive:保持鏈接,close:關閉鏈接。 |
當然這些知識列舉出了平時常用的一些請求頭屬性,有些網站也會使用自定義的屬性,會使用諸如su,x-index等各種非常用屬性之外的屬性,非常容易鑑別。
2.3 請求正文
請求正文通常只有使用POST方式進行請求的時候纔會有請求正文,如果使用GET請求的話,是不會有請求正文的,具體情況將會在後面的GET與POST請求處細說。
2.4 HTTP請求方法
HTTP協議中定義的請求方法有以下幾種:
序號 | 方法 | 描述 |
---|---|---|
1 | GET | 請求指定的頁面信息,並返回實體主體。 |
2 | HEAD | 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 |
3 | POST | 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。 |
4 | PUT | 從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
5 | DELETE | 請求服務器刪除指定的頁面。 |
6 | CONNECT | HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。 |
7 | OPTIONS | 允許客戶端查看服務器的性能。 |
8 | TRACE | 回顯服務器收到的請求,主要用於測試或診斷。 |
雖然HTTP請求中定義的方法有這麼多種,但是我們平常使用的基本只有GET
和POST
兩種方法,而且大部分網站都是禁用掉了除GET
和POST
外其他的方法。
因爲其他幾種方法通過GET
或者POST
都能實現,而且對於網站來說更加的安全和可控。
-
GET
其實簡單來說,
GET
方法一般用來負責獲取數據,或者將一些簡短的數據放到URL參數中傳遞到服務器。比POST
更加高效和方便。 -
POST
由於
GET
方法最多在url中攜帶1024字節數據,且將數據放到URL中傳遞太不安全,數據量大時URL也會變得冗長。所以傳遞數據量大或者安全性要求高的數據的時候,最好使用POST
方法來傳遞數據。
3.HTTP響應
每一個HTTP請求也都由三部分組成和請求行類似,分別是:響應行、響應報頭、響應正文。
3.1 響應行
狀態行由HTTP協議版本號, 狀態碼, 狀態消息三部分組成。如下所示:
HTTP/1.1 200 OK
上面我們看到了響應行的內容,其中HTTP/1.1
是協議版本號,200
是狀態碼,OK
是狀態消息。
2.2響應正文
響應頭格式和請求頭格式相同,遵循以下格式:
名字:空格 + 值
常用的響應頭屬性如下:
屬性名 | 作用 |
---|---|
Allow | 服務器支持哪些請求方法(如GET、POST等) |
Date | 表示消息發送的時間,時間的描述格式爲格林威治時間 |
Set-Cookie | 用於把cookie發送到客戶端瀏覽器,每一個寫入cookie都會生成一個Set-Cookie |
Expires | 可以理解爲過期時間,當到期之後瀏覽器會從服務器重新獲取,放棄本地緩存文檔 |
Content-Type | WEB服務器告訴客戶端自己響應的對象的類型和字符集 |
Content-Encoding | 文檔的編碼(Encode)方法。只有在解碼之後纔可以得到Content-Type頭指定的內容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間 |
Content-Length | 指明實體正文的長度,以字節方式存儲的十進制數字來表示 |
Location | 用於重定向一個新的位置,包含新的URL地址。表示客戶應當到哪裏去提取文檔 |
Refresh | 表示瀏覽器應該在多少時間之後刷新文檔,以秒計 |
3.3 響應正文
服務器返回的數據。
3.4 狀態碼
當客戶端向服務端發起一次請求後,服務端在返回的響應頭中會包含一個HTTP狀態碼,以表明這一次請求的狀態。下面是一些常見的狀態碼:
- 200 - 請求成功
- 301 - 資源(網頁等)被永久轉移到其它URL
- 404 - 請求的資源(網頁等)不存在
- 500 - 內部服務器錯誤
HTTP的狀態碼是由三位數字來表示的,由第一位數字來表示狀態碼的類型,一般來說有五種類型:
分類 | 分類描述 |
---|---|
1** | 信息,服務器收到請求,需要請求者繼續執行操作 |
2** | 成功,操作被成功接收並處理 |
3** | 重定向,需要進一步的操作以完成請求 |
4** | 客戶端錯誤,請求包含語法錯誤或無法完成請求 |
5** | 服務器錯誤,服務器在處理請求的過程中發生了錯誤 |
以下是詳細的狀態碼列表:
狀態碼 | 狀態碼英文名稱 | 中文描述 |
---|---|---|
100 | Continue | 繼續。客戶端應繼續其請求 |
101 | Switching Protocols | 切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議 |
200 | OK | 請求成功。一般用於GET與POST請求 |
201 | Created | 已創建。成功請求並創建了新的資源 |
202 | Accepted | 已接受。已經接受請求,但未處理完成 |
203 | Non-Authoritative Information | 非授權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本 |
204 | No Content | 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔 |
205 | Reset Content | 重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清除瀏覽器的表單域 |
206 | Partial Content | 部分內容。服務器成功處理了部分GET請求 |
300 | Multiple Choices | 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表用於用戶終端(例如:瀏覽器)選擇 |
301 | Moved Permanently | 永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替 |
302 | Found | 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI |
303 | See Other | 查看其它地址。與301類似。使用GET和POST請求查看 |
304 | Not Modified | 未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之後修改的資源 |
305 | Use Proxy | 使用代理。所請求的資源必須通過代理訪問 |
306 | Unused | 已經被廢棄的HTTP狀態碼 |
307 | Temporary Redirect | 臨時重定向。與302類似。使用GET請求重定向 |
400 | Bad Request | 客戶端請求的語法錯誤,服務器無法理解 |
401 | Unauthorized | 請求要求用戶的身份認證 |
402 | Payment Required | 保留,將來使用 |
403 | Forbidden | 服務器理解請求客戶端的請求,但是拒絕執行此請求 |
404 | Not Found | 服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面 |
405 | Method Not Allowed | 客戶端請求中的方法被禁止 |
406 | Not Acceptable | 服務器無法根據客戶端請求的內容特性完成請求 |
407 | Proxy Authentication Required | 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 |
408 | Request Time-out | 服務器等待客戶端發送的請求時間過長,超時 |
409 | Conflict | 服務器完成客戶端的PUT請求是可能返回此代碼,服務器處理請求時發生了衝突 |
410 | Gone | 客戶端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410代碼,網站設計人員可通過301代碼指定資源的新位置 |
411 | Length Required | 服務器無法處理客戶端發送的不帶Content-Length的請求信息 |
412 | Precondition Failed | 客戶端請求信息的先決條件錯誤 |
413 | Request Entity Too Large | 由於請求的實體過大,服務器無法處理,因此拒絕請求。爲防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則會包含一個Retry-After的響應信息 |
414 | Request-URI Too Large | 請求的URI過長(URI通常爲網址),服務器無法處理 |
415 | Unsupported Media Type | 服務器無法處理請求附帶的媒體格式 |
416 | Requested range not satisfiable | 客戶端請求的範圍無效 |
417 | Expectation Failed | 服務器無法滿足Expect的請求頭信息 |
500 | Internal Server Error | 服務器內部錯誤,無法完成請求 |
501 | Not Implemented | 服務器不支持請求的功能,無法完成請求 |
502 | Bad Gateway | 充當網關或代理的服務器,從遠端服務器接收到了一個無效的請求 |
503 | Service Unavailable | 由於超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中 |
504 | Gateway Time-out | 充當網關或代理的服務器,未及時從遠端服務器獲取請求 |
505 | HTTP Version not supported | 服務器不支持請求的HTTP協議的版本,無法完成處理 |
4. URI、URL、URN
4.1 URI、URL、URN的定義
什麼是URI? 什麼是URL? 什麼又是URN?三個概念中我們接觸的最多的就是URL,那URN和URI又是什麼東西呢?怎麼以前沒聽過呢?我們來看他們三個的定義:
URI:Uniform Resource Identifier,即統一資源標誌符,用來唯一的標識一個資源。
URL:Uniform Resource Locator,統一資源定位符。即URL可以用來標識一個資源,而且還指明瞭如何locate這個資源。
URN:Uniform Resource Name,統一資源命名。即通過名字來表示資源的。
下面我們重點說一下URL的格式,再來說一下URI、URL、URN的區別:
4.2 URL的格式:
一個完整的URL包含協議名稱,主機名稱(IP或者域名)、端口號(沒寫端口號默認 爲80端口)、路徑、查詢字符串和錨這6個部分。比如:
http//www.quanshuwang.com:80/modules/article/search.php?searchkey=abcd&searchtype=1&page=2#top
http
是它的協議名稱。
www.quanshuwang.com
就是它的域名。
/modules/article/search.php
是它的路徑。
:80
是它的端口號,80是http的默認端口號,一般情況下會隱藏的。
searchtype=1&page=2
是它的查詢字符串。
#top
是它的錨點,用來定位的,比如說回到頂部。
4.3 URI,URL,URN之間的關係:
上圖中我們可以看到,URL和URN是URI的子集,URI是統一資源標誌符,而URL除了有標識的功能之外,還有定位的功能,可以用來描述資源的具體位置,還指明瞭獲取資源所採用的協議。
URN也是URL的一種表現形式,它和URL的區別就是與資源的位置無關,正式由於位置的無關性,被某個URN標識的資源在位置發生變化時,其URI可以保持不變。但是我們在平時的使用中幾乎沒有用URN的,更多的用的是URL。所以URL和URN都是URI的一種擴展,一種表現形式,URL和URN肯定是一個URI,但是URI不一定是URN或URL。
5. Cookie
Cookie
有時也用其複數形式 Cookies
,英文是餅乾的意思。指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
Cookie
其實就是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然後客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息。 服務器在接收到Cookie
以後,會驗證Cookie
的信息,以此來辨別用戶的身份,當然如果有需求,服務器還可以根據需要對Cookie的內容進行修改。
5.1 Cookie的作用
Cookie
其實是HTTP請求頭的擴展部分,由於HTTP協議是無狀態的協議,所以爲了在網頁上實現登陸之類的需求,所以擴展了Cookie
這樣的功能。
每一次HTTP請求在數據交換完畢之後就會關閉連接,所以下一次HTTP請求就無法讓服務端得知你和上一次請求的關係。而使用了Cookie
之後,你在第一次登陸之類的請求成功之後,服務器會在Response
的頭信息中給你返回Cookie
信息,你下一次訪問的時候帶上這個Cookie信息,則服務器就能識別你爲上一次成功登陸的用戶。
5.2 Cookie的內容
Cookie
一般保存的格式爲json格式,由一些屬性組成。
- name:Cookie
的名稱
- value:Cookie
的值
- domain:可以使用此Cookie
的域名
- path:可以使用此Cookie
的頁面路徑
- expires/Max-Age:此Cookie
的超時時間
- secure:設置是否只能通過https來傳遞此條Cookie
5.3 domain屬性
域名一般來說分爲頂級域名,二級域名,三級域名等等。
例如baidu.com是一個頂級域名,而www.baidu.com和map.baidu.com就是二級域名,依次類推。
而在我們的Cookie
來說,都有一個domain
屬性,這個屬性限制了訪問哪些域名時可以使用這一條Cookie
。因爲每個網站基本上都會分發Cookie
,所以domain
屬性就可以讓我們在訪問新浪時不會帶上百度分發給我們的Cookie
。
而在同一系的域名中,頂級域名是無法使用其二級域名的Cookie
的,也就是說訪問baidu.com的時候是不會帶上map.baidu.com分發的Cookie
的,二級域名之間的Cookie
也不可以共享。但訪問二級域名時是可以使用頂級域名的Cookie
的。
5.4 path屬性
path屬性爲可以訪問此cookie的頁面路徑。 比如domain是abc.com,path是/test,那麼只有/test路徑下的頁面可以讀取此cookie。
5.5 expires/Max-Age屬性
字段爲此cookie超時時間。若設置其值爲一個時間,那麼當到達此時間後,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標籤頁,而是整個瀏覽器) 後,此cookie失效。
6. Session
Session,中文經常翻譯爲會話,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之爲一個session。這個詞在各個領域都有在使用。
而我們web領域,一般使用的是其本義,一個瀏覽器窗口從打開到關閉這個期間。
Session的目的則是,在一個客戶從打開瀏覽器到關閉瀏覽器這個期間內,發起的所有請求都可以被識別爲同一個用戶。而實現的方式則是,在一個客戶打開瀏覽器開始訪問網站的時候,會生成一個SessionID,這個ID每次的訪問都會帶上,而服務器會識別這個SessionID並且將與這個SessionID有關的數據保存在服務器上。由此來實現客戶端的狀態識別。
Session與Cookie相反,Session是存儲在服務器上的數據,只由客戶端傳上來的SessionId來進行判定,所以相對於Cookie,Session的安全性更高。
一般SessionID會在瀏覽器被關閉時丟棄,或者服務器會驗證Session的活躍程度,例如30分鐘某一個SessionID都沒有活躍,那麼也會被識別爲失效。
以上就是HTTP有關的所有內容了,我是Connor,一個從無到有的技術小白,如果覺得我說的有什麼不對的地方,歡迎指出!我們下期再見。
學習一時爽,一直學習一直爽!
系列文章連接:
Python 爬蟲十六式 - 第二式:urllib 與 urllib3 >>>
Python 爬蟲十六式 - 第三式:Requests的用法 >>>
Python 爬蟲十六式 - 第四式: 使用Xpath提取網頁內容>>>
Python 爬蟲十六式 - 第五式:BeautifulSoup-美味的湯 >>>
Python 爬蟲十六式 - 第六式:JQuery的假兄弟-pyquery >>>
Python 爬蟲十六式 - 第七式:正則的藝術 >>>
Python 爬蟲十六式 - 第八式:實例解析 - 全書網 >>>