標籤:版本號碼 方法 方式 不同的 一個 擴充 state 表示 適用於
接下來,我們開始http部分的開發。
在此之前。有必要先學習一下HTTP協議~
http1.1 的rfc文檔:http://www.ietf.org/rfc/rfc2616.txt
簡單介紹
超文字傳輸通訊協定 (HTTP)(Hypertext Transfer Protocol。簡稱HTTP)是應用程式層協議,是一種請求/響應式的協議,即一個client與server建立串連後,向server發送一個請求,server接到請求後。給予相應的響應資訊。
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.1
● GET:當client要從server中讀取某個資源時,使用GET 方法。
GET 方法要求server將URL 定位的資源放在響應報文的資料部分。回送給client。即client向server請求某個資源。使用GET 方法時,請求參數和相應的值附加在 URL 後面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始。傳遞參數長度受限制。
比如,/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。
【slighttpd】基於lighttpd架構的Server項目實戰(6)—預備知識之Http