寫之前推薦一本書,寫的很好,可以看看
點我下載-->圖解HTTP
概念
協議是指計算機通訊網路中兩臺計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議(HTTP)是一種通訊協議,它允許將超文字標記語言(HTML)文件從Web伺服器傳送到客戶端的瀏覽器。
HTTP協議,即超文字傳輸協議(Hypertext transfer protocol)。是一種詳細規定了瀏覽器和全球資訊網(WWW = World Wide Web)伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議。
HTTP協議是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。
在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協議作為TCP/IP模型中應用層的協議也不例外。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。
HTTP預設的埠號為80,HTTPS的埠號為443。
瀏覽網頁是HTTP的主要應用,但是這並不代表HTTP就只能應用於網頁的瀏覽。HTTP是一種協議,只要通訊的雙方都遵守這個協議,HTTP就能有用武之地。比如我們們常用的QQ,迅雷這些軟體,都會使用HTTP協議(還包括其他的協議)。
特點
HTTP協議永遠都是客戶端發起請求,伺服器回送響應。這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將訊息推送給客戶端。
HTTP協議的主要特點可概括如下:
1.支援客戶/伺服器模式。支援基本認證和安全認證。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
4.HTTP 0.9和1.0使用非持續連線:限制每次連線只處理一個請求,伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。HTTP1.1使用持續連線:不必為每個web物件建立一個新的連線,一個連線可以傳送多個物件,採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。
無狀態協議: 協議的狀態是指下一次傳輸可以“記住”這次傳輸資訊的能力。 http是不會為了下一次連線而維護這次連線所傳輸的資訊,為了保證伺服器記憶體。 比如客戶獲得一張網頁之後關閉瀏覽器,然後再一次啟動瀏覽器,再登陸該網站,但是伺服器並不知道客戶關閉了一次瀏覽器。 由於Web伺服器要面對很多瀏覽器的併發訪問,為了提高Web伺服器對併發訪問的處理能力,在設計HTTP協議時規定Web伺服器傳送HTTP應答報文和文件時,不儲存發出請求的Web瀏覽器程式的任何狀態資訊。這有可能出現一個瀏覽器在短短几秒之內兩次訪問同一物件時,伺服器程式不會因為已經給它發過應答報文而不接受第二期服務請求。由於Web伺服器不儲存傳送請求的Web瀏覽器程式的任何資訊,因此HTTP協議屬於無狀態協議(Stateless Protocol)。
工作流程
一次HTTP操作稱為一個事務,其工作過程可分為四步:
1)首先客戶機與伺服器需要建立連線。只要單擊某個超級連結,HTTP的工作開始。
2)建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容。
3)伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。
4)客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的螢幕上,然後客戶機與伺服器斷開連線。
如果在以上過程中的某一步出現錯誤,那麼產生錯誤的資訊將返回到客戶端,有螢幕輸出。對於使用者來說,這些過程是由HTTP自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。
HTTP是基於傳輸層的TCP協議,而TCP是一個端到端的面向連線的協議。所謂的端到端可以理解為程式到程式之間的通訊。所以HTTP在開始傳輸之前,首先需要建立TCP連線,而TCP連線的過程需要所謂的“三次握手”(具體內容請參考我的其他文章)。在TCP三次握手之後,建立了TCP連線,此時HTTP就可以進行傳輸了。
頭域
每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以新增任何數量的空格符,頭域可以被擴充套件為多行,在每行開始處,使用至少一個空格或製表符。
1.請求資訊:
發出的請求資訊格式如下:
- 請求行,例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif這個檔案。
- (請求)頭,例如Accept-Language: en
- 空行
- 可選的訊息體 請求行和標題必須以作為結尾(也就是,回車然後換行)。空行內必須只有而無其他空格。
三個部分分別是:請求行、訊息報頭、請求正文。
2.請求方法:
HTTP/1.1協議中共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式:
- OPTIONS - 返回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器傳送'*'的請求來測試伺服器的功能性。
- HEAD- 向伺服器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應訊息頭中的元資訊。該方法常用於測試超連結的有效性,是否可以訪問,以及最近是否更新。
- GET - 向特定的資源發出請求。注意:GET方法不應當被用於產生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網路蜘蛛等隨意訪問。
- POST - 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
- PUT - 向指定資源位置上傳其最新內容。
- DELETE - 請求伺服器刪除Request-URI所標識的資源。
- TRACE- 回顯伺服器收到的請求,主要用於測試或診斷。
- CONNECT - HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
- PATCH - 用來將區域性修改應用於某一資源。
方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當返回狀態碼405(Method Not Allowed);當伺服器不認識或者不支援對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。HTTP伺服器至少應該實現GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP伺服器還能夠擴充套件自定義的方法。
GET和POST的區別:
1.GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的資料放在HTTP包的Body中。
2.GET提交的資料大小有限制,最多隻能有1024位元組(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制。
3.GET方式需要使用Request.QueryString來取得變數的值,而POST方式通過Request.Form來獲取變數的值。
4.GET方式提交資料,會帶來安全問題,比如一個登入頁面,通過GET方式提交資料時,使用者名稱和密碼將出現在URL上,如果頁面可以被快取或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該使用者的賬號和密碼。
HTTP應用
- 斷點續傳的實現原理
HTTP協議的GET方法,支援只請求某個資源的某一部分
在連線斷開重連時,客戶端只請求該資源未下載的部分,而不是重新請求整個資源,來實現斷點續傳。
客戶端通過併發的請求相同資源的不同片段,來實現對某個資源的併發分塊下載。從而達到快速下載的目的。目前流行的FlashGet和迅雷基本都是這個原理。
- 多執行緒下載的原理
下載工具開啟多個發出HTTP請求的執行緒; 每個http請求只請求資原始檔的一部分
之後合併每個執行緒下載的檔案。
- http代理
http代理伺服器 代理伺服器英文全稱是Proxy Server,其功能就是代理網路使用者去取得網路資訊。形象的說:它是網路資訊的中轉站。 代理伺服器是介於瀏覽器和Web伺服器之間的一臺伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求,Request訊號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的資訊並傳送給你的瀏覽器
http代理伺服器的主要功能:
1.突破自身IP訪問限制,訪問國外站點
2.訪問一些單位或團體內部資源
3.突破中國電信的IP封鎖
4.提高訪問速度
5.隱藏真實IP
- 虛擬主機
HTTP代理
這裡詳細說一下HTTP代理,上面已經說了代理的主要功能
代理伺服器的工作流程:
- 使用者向代理髮起TCP連線;
- 代理接收使用者的連線,雙方建立連線;
- 使用者向代理髮送HTTP請求,請求內容和沒有HTTP代理的內容完全相同;
- 代理解析HTTP請求;
- 代理向伺服器發起TCP連線;
- 伺服器接收代理的連線;
- 代理向伺服器傳送HTTP請求(這個HTTP請求是基於使用者的HTTP請求,可能會有修改)
- 伺服器傳送響應給代理;
如果不使用代理的話,HTTP的請求報文裡會有一個
Connection: Keep-Alive
如果使用代理的話,HTTP的請求報文裡Connection
就變了
Proxy-Connection: Keep-Alive
HTTP 代理存在兩種形式:普通模式、隧道代理
-
普通模式
原理:HTTP 客戶端向代理伺服器傳送請求報文,代理伺服器需要正確地處理請求和連線(例如正確處理 Connection:keep-alive),同時向目標伺服器傳送請求,並將收到的響應轉發給客戶端。 -
隧道代理
原理:HTTP 客戶端通過HTTP的CONNECT方法請求隧道代理,建立一條到達任意目的伺服器和埠的TCP連線,並對客戶端和伺服器之間的後繼資料進行盲轉發。
正向代理和反向代理
代理可以分為正向代理和反向代理兩種。
正向代理需要客戶端來配置,一般來說我們會通過瀏覽器或者作業系統提供的工具或者介面來配置。這個時候,代理對客戶端不是透明的,客戶端需要知道代理的地址並且手動配置。配置了代理,瀏覽器在傳送請求的時候會對報文做特殊的修改。
反向代理對客戶端是透明的,也就是說客戶端一般不知道代理的存在,認為自己是直接和伺服器通訊。我們大部分訪問的網站就是反向代理伺服器,反向代理伺服器會轉發到真正的伺服器,一般在反向代理這一層實現負載均衡和高可用的功能。而且這裡也可以看到,客戶端是不會知道真正伺服器端的 ip 地址和埠的,這在一定程度上起到了安全保護的作用。
HTTP狀態響應碼
1**(資訊類):表示接收到請求並且繼續處理
100——客戶必須繼續發出請求
101——客戶要求伺服器根據請求轉換HTTP協議版本
2**(響應成功):表示動作被成功接收、理解和接受
200——表明該請求被成功地完成,所請求的資源傳送回客戶端
201——提示知道新檔案的URL
202——接受和處理、但處理未完成
203——返回資訊不確定或不完整
204——請求收到,但返回資訊為空
205——伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案
206——伺服器已經完成了部分使用者的GET請求
3**(重定向類):為了完成指定的動作,必須接受進一步處理
300——請求的資源可在多處得到
301——本網頁被永久性轉移到另一個URL
302——請求的網頁被轉移到一個新的地址,但客戶訪問仍繼續通過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發出新的Request。
303——建議客戶訪問其他URL或訪問方式
304——自從上次請求後,請求的網頁未修改過,伺服器返回此響應時,不會返回網頁內容,代表上次的文件已經被快取了,還可以繼續使用
305——請求的資源必須從伺服器指定的地址得到
306——前一版本HTTP中使用的程式碼,現行版本中不再使用
307——申明請求的資源臨時性刪除
4**(客戶端錯誤類):請求包含錯誤語法或不能正確執行
400——客戶端請求有語法錯誤,不能被伺服器所理解
401——請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
HTTP 401.1 - 未授權:登入失敗
HTTP 401.2 - 未授權:伺服器配置問題導致登入失敗
HTTP 401.3 - ACL 禁止訪問資源
HTTP 401.4 - 未授權:授權被篩選器拒絕
HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗
402——保留有效ChargeTo頭響應
403——禁止訪問,伺服器收到請求,但是拒絕提供服務
HTTP 403.1 禁止訪問:禁止可執行訪問
HTTP 403.2 - 禁止訪問:禁止讀訪問
HTTP 403.3 - 禁止訪問:禁止寫訪問
HTTP 403.4 - 禁止訪問:要求 SSL
HTTP 403.5 - 禁止訪問:要求 SSL 128
HTTP 403.6 - 禁止訪問:IP 地址被拒絕
HTTP 403.7 - 禁止訪問:要求客戶證書
HTTP 403.8 - 禁止訪問:禁止站點訪問
HTTP 403.9 - 禁止訪問:連線的使用者過多
HTTP 403.10 - 禁止訪問:配置無效
HTTP 403.11 - 禁止訪問:密碼更改
HTTP 403.12 - 禁止訪問:對映器拒絕訪問
HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
HTTP 403.15 - 禁止訪問:客戶訪問許可過多
HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經到期或者尚未生效
404——一個404錯誤表明可連線伺服器,但伺服器無法取得所請求的網頁,請求資源不存在。eg:輸入了錯誤的URL
405——使用者在Request-Line欄位定義的方法不允許
406——根據使用者傳送的Accept拖,請求資源不可訪問
407——類似401,使用者必須首先在代理伺服器上得到授權
408——客戶端沒有在使用者指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——伺服器上不再有此資源且無進一步的參考地址
411——伺服器拒絕使用者定義的Content-Length屬性請求
412——一個或多個請求頭欄位在當前請求中錯誤
413——請求的資源大於伺服器允許的大小
414——請求的資源URL長於伺服器允許的長度
415——請求資源不支援請求專案格式
416——請求中包含Range請求頭欄位,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭欄位
417——伺服器不滿足請求Expect頭欄位指定的期望值,如果是代理伺服器,可能是下一級伺服器不能滿足請求長。
5**(服務端錯誤類):伺服器不能正確執行一個正確的請求
HTTP 500 - 伺服器遇到錯誤,無法完成請求
HTTP 500.100 - 內部伺服器錯誤 - ASP 錯誤
HTTP 500-11 伺服器關閉
HTTP 500-12 應用程式重新啟動
HTTP 500-13 - 伺服器太忙
HTTP 500-14 - 應用程式無效
HTTP 500-15 - 不允許請求 global.asa
Error 501 - 未實現
HTTP 502 - 閘道器錯誤
HTTP 503:由於超載或停機維護,伺服器目前無法使用,一段時間後可能恢復正常