http協議的最新版本是1.1。是一種無狀態協議。
無狀態協議是指web瀏覽器與web伺服器之間不需要建立持久鏈結。當客戶端向伺服器端傳送請求(request)時,伺服器響應客戶端的請求(response),鏈結就被關閉了,在伺服器端不保留鏈結的有關資訊。也就是說http請求只能由客戶端發起伺服器端不能主動向客戶端傳送資料。
不知道大家有沒看過《記憶碎片》,這部電影裡面的男主角患了罕見的短期記憶喪失症,也就是同乙個人,上次一起打過招呼,下次遇上了也不認識。但是他借助於紙跟筆,以及身上的紋身讓他去記住一些東西。這好比在我們web開發中的cookie
及session
。就是因為http得了臉盲症cookie
和session
才會應運而生。
http遵循請求(request)/應答(response)模型
post /login.php http/1.1 //請求行
host: www.jiejieyh.cn //請求頭
//空白行,代表請求頭結束
username=admin&password=12345 //請求正文
請求行
http請求的第一行即為請求行,請求行有三部分組成
第一部分說明了該請求是post請求
第二部分說明請求的是該網域名稱根目錄下的login.php
第三部分說明使用的http協議版本
請求頭第二行至空白行為http中的請求頭
host代表請求的主機位址
user-agent 代表瀏覽器標識
請求頭由客戶端自行設定
請求正文
http請求的最後一行為請求正文,請求正文是可選的。最常出現在post請求方法中。
//空白行代表相應頭結束
//響應正文或者叫訊息主題
...響應行
http響應的第一行為響應行,其中有http版本,狀態碼、以及訊息「ok」
響應頭第二行至末尾空白行為響應頭,由伺服器向客戶端傳送。
響應正文
響應頭之後是響應正文,伺服器向客戶端傳送的資料
get方法用於獲取請求頁面的指定資訊(以實體的格式)
使用head方法伺服器不能在響應裡返回訊息主體,其它與get相同。此方法常用來測試超文字的有效性、可訪問性和最近的改變。
攻擊者編寫掃瞄工具時,常用此方法,因為只測試資源是否存在,而不用返回訊息主體。速度一定是最快的
post方法與get方法相似,最大的區別在於get方法沒有請求內容,而post是有請求內容的。
post請求最多用於向伺服器傳送大量的資料。get雖然也能傳送資料,但是有長度限制。
get請求將傳送的資料顯式在瀏覽器端,而post則不會。安全性相對對對對高一點...
put方法用於請求伺服器把請求中的實體儲存在請求資源下,如果請求資源已經在伺服器中存在則覆蓋,不存在將會建立這個資源。資料為請求正文
put /input.txt
host:www.jiejieyh.cn
12346
這段http put請求將會在主機根目錄下建立input.txt,內容為123456。不用想,通常情況下通過請求寫入檔案,伺服器都會禁止的。
delete 方法用於請求源伺服器刪除指定的資源,伺服器一搬會關閉此方法。
trace方法用於激發乙個遠端的應用層的請求訊息迴路。也就是說回顯伺服器收到的請求。trace方法允許客戶端去了解資料被請求鏈的另一端接收的情況,並且利用那些資料資訊去測試或診斷,此方法非常少見。
http 1.1協議規範保留了connect方法,用於能動態切換到隧道的**。
options方法是用於請求獲得由url標識的資源在請求/響應的通訊過程中可以使用的功能選項。通過這個方法,客戶端可以在採取具體資源請求之前,決定對該資源採取何種必要措施。或者了解伺服器的效能。
客戶端發出請求後,伺服器接收處理完成後會 向客戶端傳送響應資訊,其中http響應中的第一行中,最重要的一點就是http的狀態碼
http/1.1 200 ok
此時的狀態碼為200,在http協議中表示請求成功
http的狀態碼由3位數字組成,第一位數字定義了響應的類別且有只有以下5種:
http訊息稱為http頭,由4部分組成 請求頭、響應頭、普通頭、實體頭。
請求頭只出現在http請求中,請求報頭允許客戶端向伺服器傳遞請求的附加資訊和客戶端自身的資訊。
host:主要用於指定被請求的internet主機和埠號 host:www.jiejieyh.cn:801
user-agent:請求報頭域允許客戶端將它的作業系統、瀏覽器和其它屬性告訴伺服器 user-agent:my privacy
referer:referer包含乙個url,代表當前訪問的url的上乙個url,也就是說使用者是從什麼地方來到本頁面。
referer:www.jiejieyh.cn/register.php
cookie:cookie是非常重要的請求頭,它是一段文字,常用來表示請求者的身份等。
x-forward-for:即xxf頭,它代表請求端的ip,可以有多個,中間以逗號隔開
accept:用於指定客戶端接收那些mime型別的資訊,如accept:text/html,表明客戶端希望接收html文字。
accept-charset:用於指定客戶端接收的字符集例如:accept-charset:utf-8,gb2312。如果在請求訊息中沒有設定這個域,預設是任何字符集都可以接收。
server:伺服器所使用的web伺服器名稱,如server:apache/1.3.6(unix),攻擊者可以通過此頭探測web伺服器名稱。建議在伺服器端進行修改此頭的資訊
set-cookie:向客戶端設定cookie,通過檢視此頭可以清楚地看到伺服器向客戶端傳送的cookie資訊
last-modified:伺服器通過這個頭告訴瀏覽器,資源最後修改時間
location:伺服器通過這個頭告訴瀏覽器去訪問哪個頁面,瀏覽器接收到這個響應之後,通常會立刻訪問location頭所指向的頁面。這個頭通常配合302狀態碼使用。
refresh:伺服器通過refresh頭告訴瀏覽器定時重新整理瀏覽器
請求和響應訊息都可以傳送乙個實體頭。實體頭定義了關於實體正文和請求所標識的資源的元資訊。元資訊也就是實體內容的屬性,包括實體資訊型別、長度、壓縮方法、最後一次修改時間等。
content-type:用於向接收方指定實體的介質型別。
content-encoding:用作**型別的修飾符,它的值指示了已經被應用到實體正文的附加內容編碼,因而要獲得content-type報頭域中所引用的**型別,必須採用相應的解碼機制。
content-length:用於指明實體正文的長度,以位元組方式儲存的十進位制數字來表示。
last-modified:用於指示資源的最後修改日期和時間。
Linux下http協議實現
include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...
Linux下http協議實現
include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...
Linux下http協議實現 C
include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...