HTTP協議學習

2021-09-06 18:02:12 字數 3729 閱讀 8760

面試過程中又乙個常見的問題,http協議,因為做伺服器開發如果用http協議的話,現在各種開源軟體都封裝好了,python中只需要簡單的繼承定義好的類,重寫get或者post等方法,幾行**就可以搭建起來乙個簡單的http伺服器,導致底層對程式設計師來說都是透明的了。但是面試中追求這個底層的問題還不少,所以最近入手了一本據說一天入門http協議的書籍《**http》閱讀一番,才覺http協議原來是這個樣子~這裡總結一下自己的學習心得吧。

現在理解http協議其實只是一些規定好的通訊標準,其實傳送的均為字串,去處理字串即可。(不知道這句話能不能理解,後面會再次解釋一下)。

http協議在tcp/ip協議棧中屬於應用層協議,如果基於ssl或者tsl,這個協議就演變為更加安全的https協議。預設http埠號80,https預設埠號443。

與http協議協同工作的重要協議dns,tcp,ip等協議,其中dns同為應用層協議。

http協議規定,請求從客戶端發出,最後伺服器端響應該請求並返回。這是目前http協議的規定,伺服器不支援主動響應,所以目前的http協議版本都是基於請求,然後響應的這種模型。

另外,http協議是一種無狀態的應用層協議,即使同乙個客戶端的兩次連續請求,在協議規定中也沒有對應關係。所以為了解決無狀態的這個問題,存在其他的技術解決方案進行補充。

http請求報文和響應報文:

請求報文: 請求方法 , 請求uri , 協議版本 , 可選的請求首部欄位和內容實體。(嚴格定義的字串)

響應報文:協議版本 , 狀態碼 , 用以解釋狀態碼的原因短語 , 可選的響應首部字段以及實體主體。(嚴格定義的字串)

http請求,響應的模擬

telenet 開啟方法 控制面板-程式-window程式開啟與關閉-開啟telnet客戶端,這樣就能夠在cmd中使用telnet命令了。使用起來不是很方便。

異或是利用wireshark直接去抓取你訪問某個**整個過程的資料報也可以觀察~。以下是抓取的請求www.baidu.com的資料報。

整個請求,響應過程包過濾後如下:

其中可以可到tcp的三次握手,以及請求,響應的過程。但是其中有幾個包內容是tcp segment of a reassembled pdu不是很清楚,可以看到,tcp每次傳送均有響應的ack回應。具體的tcp得參考tcp協議的知識。

另外http1.0和http1.1的有乙個主要區別就是http1.1引入了持續連線的概念,不然完成一次請求必然導致tcp三次握手成本太高,引入持續連線的概念提高傳輸的效率。

http請求支援的方法

get   請求獲取request-uri所標識的資源

post 在request-uri所標識的資源後附加新的資料

head 請求獲取由request-uri所標識的資源的響應訊息報頭

put    請求伺服器儲存乙個資源,並用request-uri作為其標識

delete 請求伺服器刪除request-uri所標識的資源

options 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求

trace   請求伺服器回送收到的請求資訊,主要用於測試或診斷

connect 隧道機制

http的狀態響應碼

1xx:指示資訊,請求收到,繼續處理

2xx:成功,操作成功收到,分析,接受

3xx:完成請求必須進一步處理,重定向

4xx:請求包含乙個錯誤語法,不能完成。指示客戶端錯誤

5xx:伺服器執行乙個有效請求失敗,指示服務端錯誤

其他http重要的知識就是報頭資訊中的具體字段資訊:

報頭欄位的格式為 (名字)「:」(空格)(值);

通用報頭字段:

cache-control

date

connection

請求報頭字段:

accept

accept-charset

accept-encoding

accept-language

authorization

host

user-agent

響應報頭字段:

location

server

實體報頭字段:

content-encoding

content-language

content-length

content-type

last-modified

expires

最後貼出自己利用winsock實現的測試http內容的簡單程式:

實現流程圖如下:

//tcp 客戶端

#include #include #include #include #include #include using namespace std;

#pragma comment(lib,"ws2_32.lib")

#define port 8080

#define backlog 10

int main(void)

socket server_s;

if( ( server_s = socket(af_inet,sock_stream,0) ) == invalid_socket )

sockaddr_in server_s_addr;

server_s_addr.sin_family = af_inet;

server_s_addr.sin_port = htons(port);

server_s_addr.sin_addr.s_addr = inaddr_any;

if( bind(server_s,(sockaddr *)&server_s_addr,sizeof(server_s_addr)) )

if( listen(server_s,backlog) )

while(true)

cout<

cout<

//receive

char buf[1024];

int readlen = -1;

while(readlen < 0)

readlen = recv(accept_socket,buf,sizeof(buf),0);

buf[readlen] = '\0';

cout<

closesocket(accept_socket);

}}

HTTP協議學習

1 什麼是http協議?http是超文字傳輸協議,是基於tcp ip協議之上實現的用於客戶端和伺服器之間資料傳輸的一種協議 2 什麼是http協議的無狀態?怎麼解決http協議的無狀態?解決 使用cookie或者session來保持會話 3 http支援的方法有哪些?一共有8種請求方法 get 獲取...

HTTP 協議學習

摘自 http簡介 http,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網 www world wide web 伺服器傳輸超文字到本地瀏覽器的傳送協議。http是乙個基於tcp ip通訊協議來傳遞資料 過程 http協議工作於客戶端 服務端架構為上。...

HTTP協議學習

http,全稱為 hypertext transfer protocol,即為超文字傳輸協議。是網際網路應用最為廣泛的一種網路協議,所有的 www 檔案都必須遵守這個標準。它有以下特點 request 請求行 request line 請求頭部 header 空行和請求資料四個部分組成。respon...