HTTP(超文本傳輸協議)入門

  一、Web/HTTP服務器和客戶端html

  1)Web/HTTP服務器nginx

  Web內容都是存儲在Web服務器上的。Web服務器使用HTTP協議,所以常常被稱爲HTTP服務器。如下簡單介紹兩種HTTP服務器:數據庫

  (1)Apache:目前世界上最普遍使用的HTTP服務器軟件。apache

  安裝:sudo apt-get install apache2小程序

  啓動:一般地,apache2不能直接啓動,而是藉助於其餘工具,如sudo service apache2 start或sudo apache2ctl start或sudo /etc/init.d/apache2 start。瀏覽器

  ps的結果顯示,以root啓動了一個進程(父進程,默認綁定80端口),以www-data用戶啓動了兩個子進程(能夠用ps -eLf觀察到一大堆「線程」,圖略):緩存

  

  在瀏覽器輸入localhost:80能夠訪問服務器的主頁(默認是/var/www/html/index.html的內容)。也能夠用telnet localhost 80與服務器交互。安全

  特性:開源、功能強大、靈活,能夠在不少平臺與環境中工做。性能優化

  不一樣的平臺和環境每每須要不一樣的特性,或以不一樣的方式來實現效率的最大化。Apache經過模塊化的設計適應各類環境。經過在編譯或運行時指定哪些模塊加載到服務器中,來選擇服務器的特性。使用apache2 -l輸出編譯到服務器中的模塊列表(不包括使用LoadModule配置項指定的動態加載的模塊):服務器

  

  如圖,從*-enabled目錄咱們能夠得到當前正在使用的模塊和配置等信息,它們都連接到*-available/中相應的文件

    

  如下介紹其中的一些模塊:

  I、Apache 2.0擴展此模塊化設計到最基本的Web服務器功能。它提供了能夠選擇的多處理模塊(Multi-Processing Module,MPM),用來綁定到網絡端口上,接受請求,以及調度子進程處理請求。

  不一樣系統的默認MPM可能不一樣,如Windows是mpm_winnt,而Unix是prefork、worker或event,取決於平臺特性。

  MPM很像其餘Apache模塊。主要區別是,在任什麼時候間,有且只有一個MPM模塊加載到服務器中。

  將MPM編譯成動態模塊以後,能夠經過LoadModule配置項選擇具體的MPM模塊,而不用從新編譯服務器程序。

  主要的MPM模塊有:

  • mpm_worker_module(worker):實現了一個混合的多進程多線程Web服務器。與基於進程的服務器相比,它經過線程來處理大量請求時,能夠消耗更少的系統資源。另外,多進程的設計也在很大程度上保證了和基於進程的服務器同樣的穩定性。
    對擴展性要求更高的站點能夠選擇使用線程的MPM,即worker或event(見下文)。
    一個父進程負責發起多個子進程。每一個子進程建立ThreadsPerChild個worker線程,還有一個監聽線程,它監聽鏈接請求,並把鏈接傳遞給worker線程。
    Apache維護一個空閒worker線程的池。它會評估全部進程中空閒線程的總數,並經過fork或kill進程,使這個總數保持在MinSpareThreads和MaxSpareThreads範圍內。
    其餘配置項:StartServers(指定開始時啓動的子進程數)、MaxClients(指定可啓動線程的最大總數)等。
  • mpm_prefork_module(prefork):實現了一個無線程、預分支(pre-forking)的Web服務器。它適用於那些對可靠性要求較高或須要避免使用線程以兼容非線程安全庫的站點。
    一個父進程負責發起子進程,而子進程監聽鏈接並處理請求。Apache老是維護着幾個空閒的子進程。
  • mpm_event_module(event):worker的一個試驗性變體。

  II、log_config_module(mod_log_config):負責記錄(logging)發往服務器的請求的模塊。

  III、so_module(mod_so):負責在啓動或重啓時加載可執行代碼和模塊到服務器的模塊。

  (2)nginx(engine  X):小巧高效可擴展的HTTP/反向代理/郵件代理服務器。

  安裝:sudo apt-get install nginx-full

  啓動:sudo nginx

  

  可見,nginx以root啓動了master進程(其PID寫在/run/nginx.pid),以www-data啓動了4個worker進程。另外,master進程在80端口上監聽。這些配置能夠在/etc/nginx/nginx.conf中指定。

  訪問:http://localhost:80

  選項:-V:顯示版本和配置選項;-c conf:指定配置文件;-t:測試配置文件;-s signal:給master進程發送「信號」,以控制nginx的行爲。各個「信號」的含義以下:

  stop:快速關閉;quit:「優雅地」關閉,會等待worker進程完成對當前請求的響應(至關於kill -s QUIT);reload:從新加載已修改的配置文件。若成功(配置文件語法沒問題),master進程會開啓新的worker進程,並要求舊的worker進程中止接受新鏈接,且在完成對當前請求的響應後退出;若失敗,master進程會回滾並繼續使用舊的配置;reopen:從新打開log文件。

  2)Web/HTTP客戶端

  最多見的HTTP客戶端就是Web瀏覽器。

 

  二、資源

  1)媒體類型:HTTP爲Web傳輸對象打上的MIME類型。MIME(多用途因特網郵件擴展)用來描述並標記多媒體內容。

  Web服務器在響應報文的首部指定MIME類型(如Content-type: image/jpeg,表示一種主要的對象類型和一個特定的子類型),瀏覽器會查看本身是否知道如何處理。

  2)URI、URL與URN

  (1)URI(統一資源標識符):服務器資源名。它在世界範圍內惟一標識並定位信息資源。URI有兩種形式,分別稱爲URL和URN。

  (2)URL(統一資源定位符):幾乎全部的URI都是URL。它描述了一臺特定服務器上某資源的特定位置。大部分URL都遵循一種標準格式,包含三個部分:方案(訪問資源所使用的協議,一般是HTTP) + 服務器的因特網地址 + Web服務器上的某個資源。

  如下是幾個例子:

  I、http://www.joes-hardware.com/specials/saw-blade.gif

  使用HTTP協議 -> 進入www.joes- hardware.com -> 獲取名爲/specials/saw-blade.gif的資源

  II、http://www.joes-hardware.com/inventory-check.cgi?item=12731

  相似於I。這是一個查看庫存條目#12731是否有現貨的程序的URL。

  III、ftp://joe:tools4u@ftp.joes-hardware.com/locking-pliers.gif:使用FTP協議。

  (3)URN(統一資源名):形如urn:ietf:rfc:2141。仍處於試驗階段。做爲特定內容的惟一名稱使用,與目前的資源所在地無關(能夠將資源四處搬移)。經過URN,還能夠用同一個名字經過多種網絡協議來訪問資源。

 

  三、事務:一個HTTP事務由一條請求命令和一個響應結果組成。這種通訊是經過HTTP報文進行的。

  應用程序完成一項任務時一般會發布多個HTTP事務,如請求一個包含豐富圖片的頁面時,一個事務獲取描述頁面佈局的HTML「框架」,另外的事務獲取每一個圖片、Java小程序等。

  1)HTTP方法:HTTP支持的幾種請求命令。它告訴服務器要執行什麼動做。每條HTTP請求報文都包含一個方法。一些經常使用的HTTP方法:

  (1)GET:從服務器向客戶端發送命名資源。

  (2)PUT:未來自客戶端的數據存儲到一個命名的服務器資源中去。

  (3)DELETE:從服務器中刪除命名資源。

  (4)POST:將客戶端數據發送到一個服務器網關應用程序。

  (5)HEAD:僅發送命名資源響應中的HTTP首部。

  2)狀態碼:每條HTTP響應報文返回時都會攜帶一個狀態碼。狀態碼是一個三位數字的代碼,告知客戶端請求是否成功,或者是否須要採起其餘動做。常見的狀態碼如200(OK。文檔正確返回)、302(Redirect。到其餘地方去獲取資源)、404(Not Found。沒法找到這個資源)。狀態碼會伴隨一條解釋性文本。

 

  四、報文:HTTP服務器和客戶端經過HTTP報文進行通訊。

  HTTP報文(除主體外)是由一行行的純文本組成,方便調試。它由起始行、首部字段和可選主體三部分組成:

  1)起始行(第一行):說明要作些什麼(如GET /test/hi-there.txt HTTP/1.0),出現了什麼狀況(如HTTP/1.0 200 OK)。

  2)首部字段:名字和值的集合。名字和值中間以冒號分隔。首部以一個空行結束。

  3)可選主體:主體能夠包含文本數據和二進制數據。

 

  五、鏈接:HTTP是應用層協議。它把網絡通訊的具體細節都交給了通用、可靠的因特網傳輸協議TCP/IP。

 

  六、協議版本。目前仍在使用的版本:

  1)HTTP/0.9:HTTP的1991原型版本。有不少嚴重的設計缺陷。只支持GET方法,不支持多媒體內容的MIME類型、各類HTTP首部,或者版本號。

  2)HTTP/1.0:第一個普遍使用的版本。添加了版本號、各類HTTP首部、一些額外的方法,以及對多媒體對象的處理。這使得包含生動圖片的Web頁面和交互式表格成爲可能。

  3)HTTP/1.0+:爲知足快速擴張且在商業上十分紅功的萬維網的須要,添加了不少特性,包括持久的keep-alive鏈接、虛擬主機支持,以及代理鏈接支持,成爲非官方的事實標準。這種非正式的HTTP擴展版本一般稱爲HTTP/1.0+。

  4)HTTP/1.1:重點關注的是校訂HTTP設計中的結構性缺陷,明確語義,引入重要的性能優化措施,並刪除一些很差的特性。它還包含了對20世紀90年代末正在發展中的更復雜的Web應用程序和部署方式的支持。HTTP/1.1是當前使用的版本。

  5)HTTP-NG(HTTP/2.0):HTTP/1.1後繼結構的原型建議,重點關注性能的大幅優化,以及更強大的服務邏輯遠程執行框架。

 

  七、Web的結構組件(除Web瀏覽器和Web服務器以外的一些Web應用程序):

  1)代理:位於客戶端和服務器之間的HTTP中間實體。

  HTTP代理服務器是Web安全、應用集成以及性能優化的重要組成模塊。出於安全考慮,一般會將代理做爲轉發全部Web流量的可信任中間節點使用。代理還能夠對請求和響應進行過濾。

  2)緩存:HTTP的倉庫,使經常使用頁面的副本能夠保存在離客戶端更近的地方。

  Web緩存或代理緩存是一種特殊的HTTP代理服務器,能夠將通過代理傳送的經常使用文檔複製保存起來。下一個請求同一文檔的客戶端就能夠享受緩存的私有副本所提供的服務了。客戶端從附近的緩存下載文檔會比從遠程Web服務器下載快得多。

  HTTP定義了不少功能,使得緩存更加高效,並規範了文檔的新鮮度和緩存內容的隱私性。

  3)網關:鏈接其餘應用程序的特殊Web服務器。一般用於將HTTP流量轉換成其餘的協議(如一個HTTP/FTP網關經過HTTP請求接收對FTP URI的請求 -> 經過FTP協議獲取文檔 -> 將獲得的文檔封裝成HTTP報文,發送給客戶端)。

  網關接受請求時就好像本身是資源的源端服務器同樣。客戶端可能並不知道本身正在與一個網關進行通訊。

  4)隧道:對HTTP通訊報文進行盲轉發的特殊代理。它一般用來在一條或多條HTTP鏈接上轉發非HTTP數據,轉發時不會窺探數據。

  HTTP隧道的一種常見用途是經過HTTP鏈接承載加密的安全套接字層(SSL)流量,這樣SSL流量就能夠穿過只容許Web流量經過的防火牆了。如圖,HTTP/SSL隧道收到一條HTTP請求,要求創建一條到目的地址和端口的輸出鏈接,而後在HTTP信道上經過隧道傳輸加密的SSL流量,這樣就能夠將其盲轉發到目的服務器上去了。

  

  5)用戶Agent代理:表明用戶發起HTTP請求的Web客戶端程序(如Web瀏覽器、爬蟲)。

 

  八、cookie:當前識別用戶,實現持久會話的最好方式。

  1)分類

  (1)會話cookie:記錄了用戶訪問站點時的設置和偏好。用戶退出瀏覽器時,會話cookie就被刪除了。例如,若是設置了Discard參數,或者沒有設置Expires或Max-Age參數來講明擴展的過時時間,則爲會話cookie。

  (2)持久cookie:存儲在硬盤上。一般會用它維護某個用戶會週期性訪問的站點的配置文件或登陸名。和會話cookie的惟一區別是它們的過時時間。

  2)工做原理:

  用戶訪問Web站點時,Web服務器經過Set-Cookie響應首部將cookie返回給用戶。瀏覽器將其存儲在cookie數據庫中。當用戶再次訪問同一站點時,瀏覽器取出該服務器對應的那些cookie,並在Cookie請求首部中將其傳回去。服務器根據cookie識別用戶、跟蹤會話狀態等。

  所以,能夠把cookie當作由客戶端維護的狀態片段。

  應用:不少Web站點都會與第三方廠商達成協議,由其來管理廣告。這些廣告被作得像Web站點的一個組成部分,並且它們確實發送了持久cookie。用戶訪問另外一個由同一廣告公司提供服務的站點時,(因爲域是匹配的)瀏覽器就會再次回送早先設置的持久cookie。

  3)其餘屬性(過濾器)

  (1)域(Domain)屬性:控制哪些站點能夠看到該cookie。好比:

# 用戶訪問.airtravelbargains.com結尾的站點時,瀏覽器纔會發送Cookie: user="mary17"
Set-Cookie: user="mary17"; domain="airtravelbargains.com"

  (2)路徑(Path)屬性。

  好比,www.airtravelbargains.com將http://www.airtravelbargains.com/autos/用於汽車租賃,它用一個cookie記錄用戶喜歡的汽車尺寸:

Set-Cookie: pref=compact; domain="airtravelbargains.com"; path=/autos/

  當用戶訪問http://www.airtravelbargains.com/specials.html時,只會發送user="mary17"這個cookie;但訪問http://www.airtravelbargains.com/autos/cheapo/index.html時,會發送user="mary17"和pref=compact兩個cookie。

  4)版本

  (1)cookies版本0(有時也稱Netscape cookies,最初由網景定義):定義了Set-Cookie響應首部、Cookie請求首部以及用於控制cookie的字段。以下:

# expires:指定cookie的實際生存期。過時則再也不存儲或發送它。格式如"Wednesday, 09-Nov-99 23:12:40 GMT",GMT爲惟一合法時區。不指定則cookie在會話結束時過時
# secure:若指定該關鍵字,則只有在HTTP使用SSL安全鏈接時才發送這個cookie
Set-Cookie: name=value [; expires=date] [; path=path] [; domain=domain] [; secure]
Cookie: name1=value1 [; name2=value2] ...

  (2)cookies版本1(RFC 2965):是對cookies版本0的擴展,但應用不如後者普遍。它引入了Set-Cookie2首部和Cookie2首部,但它也能與版本0進行互操做。

  RFC 2965 cookie的主要改動:爲每一個cookie加上解釋性文本;容許在瀏覽器退出時,不考慮過時時間而將cookie強制銷燬;用相對秒數而不是絕對日期來表示cookie的Max-Age;經過URL端口號,而不只是域和路徑來控制cookie;經過Cookie首部回送域、端口和路徑過濾器(如有);爲實現互操做性使用的版本號(Cookie2: $Version="1");在Cookie首部從名字中區分出附加關鍵字的$前綴(如Cookie2: ID="29046"; $Domain=".joes-hardware.com"; $Path="/tools")。

 

 

 

  參考資料:

  《HTTP權威指南》

  http://httpd.apache.org/docs/2.2/

 

不斷學習中。。。

相關文章
相關標籤/搜索