WEB應用之http協議和httpd閒聊

  什麼是web?在平常生活中咱們經常聽到web這個詞,它究竟是什麼呢?今天咱們來聊一聊web應用http協議;相信生活在現在互聯網時代的咱們,http這個協議應該對咱們不是很陌生吧!好比雙十一雙十二咱們去某寶、某東去搶購商品,它背後就是用一堆web服務器經過http協議或https協議在給咱們提供服務;簡單點說web服務就是一個C/S架構,服務端提供服務,客戶端經過http協議或https協議進行訪問,拿到服務端對應的資源,這就是web服務;所謂C/S架構就是客戶端和服務端架構;對於服務端一側在iso七層網絡模型中應用層協議存在的意義是實現某一具體應用,一般狀況下他們都會向內核空間註冊一衆所周知的服務端口,並監聽在某一地址,或多個地址上,對外提供服務;這也一般是C/S架構的軟件服務工做的特色;而http協議就是工做在應用層的80端口對外提供服務;對於客戶端一側就沒有監聽這一說了,一般狀況下客戶端也是工做在應用層或者咱們能夠這樣理解,它實際不是工做在應用層;咱們知道網絡資源對於計算機來講只有內核的特權指令纔可以操做,而對於普通用戶來講,內核的功能咱們必須在用戶空間提供一應用程序,經過應用程序對內核提供的API進行系統調用,從而實現操做網絡資源的能力;實現客戶端的軟件有不少,圖形界面下常見的瀏覽器chrome呀,firefox呀,ie等等,這些程序都是web服務的客戶端,固然除此以外,像在Linux字符界面的web客戶端有,wget、curl、elinks等等;這些客戶端在用戶空間訪問服務端時,會隨機向內核註冊一端口,而後把本身的請求信息經過封裝應用層首部,傳輸層,網絡層,數據鏈路層,物理層,最後經過網卡發送給服務端,服務端收到客戶端的請求會對客戶端封裝的報文,層層拆除,從而拿到客戶端的請求,拿到客戶端的請求後,而後封裝響應報文,封裝響應報文的過程相似客戶端封裝請求報文,先封裝應用層首部,而後傳輸層,網絡層,數據鏈路層,物理層,而後發送給客戶端;客戶端拿到報文後,層層拆封裝,最終拿到服務端的響應;這就是http協議的一次事務過程,無外乎就是客戶端請求,服務端響應;php

  提示:以上是以太網的封裝報文和解封裝報文的一個過程,http協議是應用層協議,一般狀況下應用層就是上面三層;應用層是工做在用戶空間的,而下面四層是工做在內核空間,一般咱們把下面四層稱爲通訊子網層;這也是咱們以前的iptables裏面常常提到的內核空間功能必需要由用戶空間程序對內核發起系統調用纔可以操做內核空間功能,因此像iptables、ipvsadm這類工具咱們不稱他們叫服務,而是工具的緣由;同理像web客戶端咱們一般也只是叫它是工具,而不叫服務;一般所謂服務就是須要向內核註冊一端口,而後監聽在某一地址上,咱們把這種工做在用戶空間(或者內核空間的功能)的程序叫服務,簡單點講服務須要被監聽,之因此要被監聽是由於通訊的須要;css

  IPC(Inter-Process Communication,進程間通訊),所謂進程間通訊就是兩個進程互相交換數據;進程間通訊的方式有不少,好比內存共享、內存映射、BSD socket等等;其中最爲常見的一種BSD socket,它容許位於不一樣主機(固然同一主機也是能夠的,只不過同一主機用這種socket機制顯得不那麼高效)上的進程之間進行通訊;什麼叫socket?相信懂點網絡編程的人都聽過這個詞吧! 所謂socket就是IP加端口,對於套接字能夠分TCP套接字、udp套接字、raw套接字,它們一般狀況下是經過socket API(封裝了內核中的socket通訊相關的系統調用)來建立不一樣的套接字類型;如SOCK_STREAM就是表示TCP套接字,SOCK_DGRAM就表示UDP套接字,SOCK_RAW就表示raw套接字;根據套接字所使用的地址格式,咱們又能夠分爲IPV4的套接字、ipv6套接字和unix_sock(同一主機上的不一樣進程間基於socket套接字通訊使用的一種地址);例如AF_INET就表示ipv4格式的套接字,AF_INET6就表示ipv6套接字格式,AF_UNIX就表示unix_sock套接字格式;其中前二者用於網絡通訊,一般是位於不一樣主機間進程通訊,然後者unix_sock用於同一主機的兩個進程通訊較爲常見;後者就是咱們常見的sock文件,例如mysql客戶端鏈接本地服務端就是用的這種機制;html

  瞭解上面的底層通訊原理,咱們再來聊聊今天的主題http吧mysql

  http是hyper text transfer protocol的簡寫,它是應用層協議,默認工做在tcp協議的80端口,屬於文本協議;在http協議0.9版本中,它就只能用於傳輸html文本,也是在互聯網上使用的最原始的版本,功能至關簡陋;1.0版本引進了cache機制,MIME機制和更多的method,使得http協議一會兒被普遍使用,MIME是多用途互聯網郵件擴展類型,它的主要做用是讓一些非文本格式的附件可以經過互聯網互相傳輸,而且在接收方接收後可以將其還原成原有格式的附件的機制,什麼意思呢?它可以讓一些非文本格式的附件在經過互聯網傳輸後還原成原來格式的附件的一種機制;這使得http協議能夠傳輸非文本格式的數據,好比圖片、視頻、音樂等;所謂method就是客戶端請求服務端資源時數據傳輸請求的方法,在0.9版本http協議只支持GET這一種方法,在1.0版本中http協議支持了更多的請求方法,如GET、PUT、POST、DELETE、HEAD等等;在這以後有1.1版本,它主要是在1.0版本上加強了緩存功能;隨後就是2.0,2.0主要是在1.1版本上作了不少優化,使得原有1.1本版的諸多性能問題得以解決,如今主流使用的http協議版本是1.1和2.0版本;nginx

  http工做模式web

  http的工做模式很是簡單,在上面咱們也提到過,不外乎就是客戶端請求,服務端響應;其中咱們把請求報文叫作http request響應報文叫作http response;對於客戶端的一次請求和服務端的一次響應響應咱們把這一過程叫作http協議的一次事務;sql

  web資源:web resourcechrome

  web資源分靜態資源和動態資源,所謂靜態資源就是無需服務端作額外的處理的資源,咱們叫靜態資源,什麼意思呢?客戶端請求的資源,在服務端是什麼樣經過http協議傳輸後到客戶端上就是什麼樣,咱們就把這種不須要服務端額外處理的資源叫靜態資源,常見的靜態資源有.jpg, .png, .gif, .html, txt, .js, .css, .mp3, .avi等;所謂動態資源就與之相反,客戶端請求的資源一般是須要被程序執行或處理後,而後把執行結果或處理後的結果發送給客戶端,咱們把這種須要服務端經過某一執行程序做出處理的資源叫動態資源;常見的有.php.jsp.asp等;這裏還須要注意一點的是,咱們日常看到的網頁資源每每不是單獨的一個資源,它多是有不少資源組成,有動態的,也有靜態的,每一個資源都須要單獨請求,以下所示;apache

  提示:能夠看到咱們訪問一個頁面的背後實際上是有不少資源組成;編程

  資源的標識機制:URL

  所謂資源標識符就是用於描述服務器某特定資源的位置;簡單點就是用於告訴服務端客戶端要訪問的資源;一般狀況下URL由協議加「://」加服務器地址(能夠是域名,或主機名)[:port](若服務端工做在非標準端口,咱們還須要指定端口)而後加資源路徑或資源名稱(這裏的資源路徑指的是web服務的根路徑開始,而非文件系統的根路徑)例如http://www.test.com/index.html這就是一個URL,客戶端介入這樣一個URL對應的服務端就知道客戶端請求的資源是www.test.com這臺主機上的index.html文件,服務端就會把對應目錄下的文件響應給客戶端;對於服務端它怎麼去本身的文件系統上找index.html這個文件,一般狀況下是經過咱們對服務端定義的documentroot來決定的,在nginx中咱們能夠經過root指令來指定虛擬主機的根目錄對應文件系統路徑的映射;

  一次完整的http請求處理過程一般是有如下幾步來完成:

  (1) 創建或處理鏈接:接收請求或拒絕請求;
  (2) 接收請求:接收來自於網絡上的主機請求報文中對某特定資源的一次請求的過程;

  http的響應模型,http的響應模型主要有單進程I/O模型、多進程、複用I/O模型和服用多進程模型,其中單進程I/O模型就是啓動一個進程處理用戶的請求,這意味着,一次只能處理一個請求,多個請求被串行響應;多進程I/O模型表示由父進程並行啓動多個子進程,每一個子進程進行相應一個用戶請求;複用單進程I/O模型有兩個模式,多線程模式和事件驅動模式,前者表示一個進程生成N個線程,一個線程處理一個請求;而事件驅動模式中一個進程直接處理N個請求,沒有線程的說法;複用多進程I/O模型中,啓動多個進程,每一個進程生成n個線程,每一個線程處理一個請求,響應的請求數量是進程數量乘每一個進程生成的線程數;
  (3) 處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理

    元數據:請求報文首部
    <method> <URL> <VERSION>
    HEADERS 格式 name:value
    <request body>

      ……

    示例:

  (4) 訪問資源:獲取請求報文中請求的資源;服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源;資源放置於本地文件系統特定的路徑:DocRoot

    示例:若是咱們將web資源根目錄映射成文件系統上的/var/www/html,即www.test.com/   ---->>  /var/www/html,用戶訪問www.test.com/index.html,就至關於訪問文件系統上的/var/www/html/index.html,一般狀況下web服務器資源路徑映射方式有4種,第一種是經過定義docroot來指定,第二種是alias別名來指定,第三種是虛擬主機的docroot第四種是用戶家目錄的docroot

  (5) 構建響應報文:一旦Web服務器識別除了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體;

    響應實體:若是事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中一般包括:描述了響應主體MIME類型的Content-Type首部,描述了響應主體長度的Content-LengthContent-Type首部和實際報文的主體內容

    示例:

  (6) 發送響應報文:Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能仍保持打開狀態,在這種狀況下,服務器要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了;
  (7) 記錄日誌:最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務;

   HTTP服務器應用

  http服務器程序有httpd、nginx、lighttpd等nginx相關使用和說明可參考本人前面的博客https://www.cnblogs.com/qiuhom-1874/category/1646010.html;接下來咱們着重來講說httpd;

  httpd是20世紀90年代初,國家超級計算機應用中心NCSA開發,1995年開源社區發佈apache(a patchy server)它是一款高度模塊化,支持動態加卸載模塊,支持多路處理模塊,所謂多路處理模塊就是httpd的三種響應模型;

  第一種是prefork多進程模型,每一個進程響應一個請求,一個主進程,主進程程負責生成子進程以及回收子進程、套接字的建立和接收請求並將其派發給某個子進程處理;n個子進程(一個子進程中生成一個線程處理一個請求),子進程主要用於處理請求;工做模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;最大空閒和最小空閒;

  第二種是worker多進程多線程模型,在這種模型中每一個線程處理一個用戶請求;一樣的它也會由一個主進程負責生成子進程,套接字的建立和接收請求並將請求派發給某個子進程進行處理;n個子進程,和上面的profork不一樣的是,這裏的子進程主要負責生成多個線程,而每一個線程處理一個請求;這樣一來在這種模型中併發響應數量就是n個子進程乘每一個子進程生成的M個線程;

  第三種是event:事件驅動模型,多進程模型,一個主進程生成m個子進程,每一個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力

以上就是httpd的一些簡單介紹,在後續的文章中我會持續更新httpd的其餘用法和配置指令的說明,有感興趣的朋友能夠關注關注,共同探討;

相關文章
相關標籤/搜索