Http協議基礎知識的點點滴滴

2021-08-29 20:37:03 字數 3206 閱讀 3295

http協議作為網路傳輸的基本協議,有著廣泛的應用。http協議的完整內容很多,但是其核心知識卻又簡單精煉。

http協議:訊息的分類

· 請求訊息

· 響應訊息

http協議:特點

· 無連線:無連線的含義是限制每次連線只處理乙個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間

· 無狀態:指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

http協議:訊息的基本格式

· 首行

· 頭部(header)

· 正文(body)

==頭部==用來指出http訊息的一些屬性,它們有固定的格式;==正文==部分是傳輸的實際內容,它們的格式是任意的,通常用content-type頭來指定。==首行==在請求訊息和響應訊息中具體格式略有區別,它們表示的按理說應該是http訊息最基本的部分。不論是http請求還是http響應,首行都是有的,否則會出現不可饒恕的解析錯誤;然而頭部和正文是可選的,不過實際過程中,多多少少都要包含一些基本的頭。

首行和頭部都是以==ascii==編碼,正文部分的編碼任意了。在實際的開發中,傳送的文字訊息時常會碰到亂碼的問題。通常約定以utf-8格式進行編碼和解碼。

http訊息是基於tcp協議的上層應用協議。tcp協議是網路流協議的一種。抽象地講,就是從一台主機乙個位元組乙個位元組有序地傳輸到另一台主機。對於http協議來說,自然保持了這種有序性,即按照首行、頭部、正文的順序進行傳輸。首行和頭部都是ascii文字流,正文部分是位元組流。乙個特殊的控制結構crlf用來控制每個部分的結束。

crlf是回車符和換行符的意思,它們是兩個特殊的ascii字元。cr是回車符(\r),在ascii中的編碼是13;lf是換行符(\n),在ascii中的編碼是10.

http請求報文示例:

get /******.html http/1.1crlf ----- 首行

accept: text/htmlcrlf --

accept-language: zh-cncrlf

accept-encoding: gzip, deflatecrlf -- 頭部

user-agent: mozilla/4.0crlf

host: localhost:8080crlf

connection: keep-alivecrlf --

crlf ----- 空白行表示頭部的結束

----- 接下來的內容是正文部分

可以清楚地看到,第一行是首行,以crlf標誌其結束;接下來是頭部,含有多個訊息頭,每行定義乙個訊息頭,以crlf標誌其結束;乙個單獨的crlf(緊接著上乙個crlf)表示整個頭部的結束,接下來是正文部分。在這個示例中,正文部分為空

它們在訊息實體中是連續的片段,並不像**中所示那樣有換行的結構。換句話說,原始的訊息應該是如下形式:

http請求

之前已經說過,http請求訊息分為三個部分:

· 請求行

· 請求頭部

· 請求正文

其中請求頭部的格式我們已經見過。請求行的基本格式為:

方法 路徑 版本

例如下面的例子:

就有對應關係:

· 方法:get

· 路徑:/******.html

· 版本:http/1.1

http請求:方法

首先列出最常用的http方法:

· get

· post

· put

· patch

· delete

· head

· options

每個http方法,都是有一些http協議要求的。比如說get方法請求的資源,瀏覽器端一般都會有快取,下次請求的時候可能從快取中去取就夠了,伺服器不用再重**送相同的資源了;但是伺服器如果將獲取資源的介面的方法定義為post,那麼瀏覽器端就不會再對資源進行快取了,即使每次取到的都是同樣地內容,都會請求伺服器重新傳送一遍。所以說,將請求資源的介面的方法定義為post而不是get,就是一種不合理的設計。

再比如,get方法的請求訊息是不能定義訊息體的,head方法的請求其響應訊息是不包含訊息體的,這些都是http協議對於http方法的約束

http請求:路徑

路徑的基本格式一般是:

basic-path[?query-string]

問號後面的部分就是query-string。它的格式是任意的,只要客戶端和伺服器約定好一定的形式即可。這個部分一般是請求引數的附加。之前說過,get方法是不包含請求體的,所以get方法的http請求想要附加引數只能使用這種方式。當然其他方法也是可以使用這種方式附加引數,只要伺服器同意就可以了。query-string的格式任意,但在客戶端和伺服器之間也有預先定好的約定,即鍵值對的形式。query-string可以表示成一系列鍵值對的集合,用以下方式表示:

k1=v1k2=v2k3=k4

在這裡,分隔不同的鍵值對,=表示鍵和值得關係。可以看到一共有四個鍵值對關係,它們是:

· k1: v1

· k2: v2

· k3: 空字串

· k4: 起碼該鍵被定義了

一般來說,鍵值對要寫成k=v的形式,但是k=和僅僅乙個k都是允許的,前者表示鍵k的值是空字串,後者表示鍵k被定義了,但是其值是什麼並不關心。

http請求頭

http請求頭格式與之前所說的訊息頭格式沒什麼兩樣,就是以冒號分隔的鍵值對。http請求頭中,既包含預定義的頭(如content-type、content-length等),也支援自定義頭。

http訊息頭大全

http響應

http響應訊息的基本格式也是一樣的,包含三個部分:

· 響應行

· 響應頭部

· 響應正文

響應行的基本格式是:

版本號 狀態碼 狀態文字

例如下面的響應行:

其對應關係為:

· 版本號:http/1.1

· 狀態碼:200

· 狀態文字:ok

C 的點點滴滴

函式傳值有三種方式 按值傳遞 pass by value 按位址傳遞 pass by address 和按引用傳遞 pass by reference 不同的是,按值傳遞方式中,函式部分不能改變主函式中實參的值。而按位址傳遞和按引用傳遞均可以改變主函式中實參的值。按值傳遞,實參和形參均為同一型別的物...

點點滴滴的積累

大學本科的四年裡,感覺過的很平庸。沒有學到什麼東西,就畢業了,那是放縱的大學生活。2005年,研2 時,因為要做畢業課題,我開始學習程式設計 因為師兄們畢業走了,我只能自己看書。當你知道該幹什麼,又沒人帶你的時候那是乙個痛苦的過程。半年mfc學到了一點皮毛,然後半年時間一直用在cplusplus上。...

實習的點點滴滴

markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細語法參考幫助?本編輯器支援markdown extra,擴充套件了很多好用的功能。具體請參考...