【slighttpd】基於lighttpd架構的Server項目實戰(6)—預備知識之Http

接下來,咱們開始http部分的開發。瀏覽器

在此以前。有必要先學習一下HTTP協議~緩存

http1.1 的rfc文檔:http://www.ietf.org/rfc/rfc2616.txtmarkdown

簡單介紹

超文本傳輸協議(Hypertext Transfer Protocol。簡稱HTTP)是應用層協議,是一種請求/響應式的協議,即一個client與server創建鏈接後,向server發送一個請求,server接到請求後。給予相應的響應信息。cookie

HTTP 請求報文

HTTP 請求報文由請求行、請求頭部、空行 和 請求體 4 個部分組成:網絡

| 請求方法 | URL | 協議版本號 | ->請求行
| 請求頭部(Request Header) |
| 空行 |
| body |

【請求行】:由方法字段、URL 字段 和HTTP 協議版本號字段 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;併發

樣例:
GET /index.jsp?id=100&op=bind HTTP/1.1less

● GET:當client要從server中讀取某個資源時,使用GET 方法。jsp

GET 方法要求server將URL 定位的資源放在響應報文的數據部分。回送給client。即client向server請求某個資源。使用GET 方法時,請求參數和相應的值附加在 URL 後面,利用一個問號(「?」)表明URL 的結尾與請求參數的開始。傳遞參數長度受限制。post

好比,/index.jsp?學習

id=100&op=bind。

● POST:當client給server提供信息較多時可以使用POST 方法,POST 方法向server提交數據。比方完畢表單數據的提交。將數據提交給server處理。GET 通常用於獲取/查詢資源信息,POST 會附帶用戶數據,通常用於更新資源信息。

POST 方法將請求參數封裝在HTTP 請求數據中,以名稱/值的形式出現,可以傳輸大量數據;

● PUT:用於改動某個內容。

● DELETE:刪除某個內容。

● CONNECT:用於代理進行傳輸。如使用SSL;

● OPTIONS:詢問可以運行哪些方法;

● PATCH:部分文檔更改;

● PROPFIND, (wedav):查看屬性;

● PROPPATCH, (wedav): 設置屬性;

● MKCOL, (wedav):建立集合(目錄);

● COPY, (wedav):拷貝;

● MOVE, (wedav):移動;

● LOCK, (wedav):加鎖。

● UNLOCK (wedav):解鎖。

● TRACE:用於遠程診斷server。

● HEAD:類似於GET, 但是不返回body信息。用於檢查對象是否存在,以及獲得對象的元數據;

【請求頭部】:請求頭部由key/value對組成,每對一行,keyword和值用英文冒號「:」分隔。請求頭部通知server有關於client請求的信息。典型的請求頭有:

● User-Agent:產生請求的瀏覽器類型;

● Accept:client可識別的響應內容類型列表;星號 「 * 」 用於按範圍將類型分組。用 「 */* 」 指示可接受全部類型,用「 type/* 」指示可接受 type 類型的全部子類型;

● Accept-Language:client可接受的天然語言;

● Accept-Encoding:client可接受的編碼壓縮格式;

● Accept-Charset:可接受的應答的字符集;

● Host:請求的主機名,贊成多個域名同處一個IP 地址,即虛擬主機;

● connection:鏈接方式(close 或 keepalive);

close:告訴 WEB server或者代理server,在完畢本次請求的響應後,斷開鏈接,不等待本次鏈接的興許請求了。
keepalive:告訴WEBserver或者代理server,在完畢本次請求的響應後,保持鏈接。等待本次鏈接的興許請求;

● Cookie:存儲於client擴展字段。向同一域名的服務端發送屬於該域的cookie;

【空行】:最後一個請求頭以後是一個空行。發送回車符和換行符,通知server下面再也不有請求頭;

【請求包體】:請求包體不在 GET 方法中使用。而是在POST 方法中使用。POST 方法適用於需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型 Content-Type 和包體長度 Content-Length。

HTTP響應報文

HTTP 響應報文由狀態行、響應頭部、空行 和 響應包體 4 個部分組成:

| 協議版本號 | 狀態碼 | 狀態碼描寫敘述 | ->狀態行
| 響應頭(Response Header) |
| 空行 |
| 響應正文 |

【狀態行】:狀態行由 HTTP 協議版本號字段、狀態碼和狀態碼的描寫敘述文本 3 個部分組成,他們之間使用空格隔開;

● 狀態碼由三位數字組成。第一位數字表示響應的類型,常用的狀態碼有五大類例如如下所看到的:

1xx:表示server已接收了client請求,client可繼續發送請求;

2xx:表示server已成功接收到請求並進行處理;

3xx:表示server要求client重定向;

4xx:表示client的請求有非法內容;

5xx:表示server未能正常處理client的請求而出現意外錯誤;

● 狀態碼描寫敘述文本有例如如下取值:

200 OK:表示client請求成功;

400 Bad Request:表示client請求有語法錯誤,不能被server所理解;

401 Unauthonzed:表示請求未經受權,該狀態代碼必須與 WWW-Authenticate 報頭域一塊兒使用;

403 Forbidden:表示server收到請求,但是拒絕提供服務,通常會在響應正文中給出不提供服務的緣由;

404 Not Found:請求的資源不存在,好比。輸入了錯誤的URL;

500 Internal Server Error:表示server發生不可預期的錯誤,致使沒法完畢client的請求;

503 Service Unavailable:表示server當前不可以處理client的請求,在一段時間以後,server可能會恢復正常;

【響應頭部】:請求頭部由key/value對組成,每對一行,keyword和值用英文冒號「:」分隔。部分例如如下:

● Location:用於重定向接受者到一個新的位置。好比:client所請求的頁面已不存在原先的位置,爲了讓client重定向到這個頁面新的位置。server端可以發回Location響應報頭後使用重定向語句,讓client去訪問新的域名所相應的server上的資源;

● Server:Server 響應報頭域包括了server用來處理請求的軟件信息及其版本號。它和 User-Agent 請求報頭域是相相應的,前者發送server端軟件的信息,後者發送client軟件(瀏覽器)和操做系統的信息。

● Vary:指示不可緩存的請求頭列表;

● Connection:鏈接方式;
(close:鏈接已經關閉;
keepalive:鏈接保持着,在等待本次鏈接的興許請求; )

● Keep-Alive:假設瀏覽器請求保持鏈接。則該頭部代表但願WEB server保持鏈接多長時間(秒);好比:Keep-Alive:300;

● WWW-Authenticate:WWW-Authenticate響應報頭域必須被包括在401 (未受權的)響應消息中,這個報頭域和前面講到的Authorization 請求報頭域是相關的。當client收到 401 響應消息,就要決定是否請求server對其進行驗證。假設要求server對其進行驗證。就可以發送一個包括了Authorization 報頭域的請求;

【空行】:最後一個響應頭部以後是一個空行,發送回車符和換行符,通知server下面再也不有響應頭部。

【響應包體】:server返回給client的文本信息;

HTTP 無狀態性

HTTP 協議是無狀態的(stateless)。也就是說。同一個client第二次訪問同一個server上的頁面時,server沒法知道這個client之前訪問過,server也沒法分辨不一樣的client。

HTTP 的無狀態特性簡化了server的設計。使server更easy支持大量併發的HTTP 請求。

HTTP 持久鏈接

HTTP1.0 使用的是非持久鏈接,主要缺點是client必須爲每一個待請求的對象創建並維護一個新的鏈接。即每請求一個文檔就要有兩倍RTT 的開銷。因爲同一個頁面可能存在多個對象。因此非持久鏈接可能使一個頁面的下載變得十分緩慢,而且這樣的短鏈接添加了網絡傳輸的負擔。

HTTP1.1 使用持久鏈接keepalive。所謂持久鏈接,就是server在發送響應後仍然在一段時間內保持這條鏈接,贊成在同一個鏈接中存在屢次數據請求和響應,即在持久鏈接狀況下,server在發送完響應後並不關閉TCP 鏈接,而client可以經過這個鏈接繼續請求其它對象。

HTTP/1.1 協議的持久鏈接有兩種方式:

● 非流水線方式:客戶在收到前一個響應後才幹發出下一個請求;

● 流水線方式:客戶在收到 HTTP 的響應報文以前就能接着發送新的請求報文。

好啦~http的基本知識就介紹到這裏,接下來咱們將針對http來爲咱們的server加入功能,對於http的解析部分,我不打算本身寫,將使用一個第三方的解析庫http-parser。

相關文章
相關標籤/搜索