http協議簡析及C 實現HTTP請求

2021-08-18 06:33:42 字數 4601 閱讀 6461

http是超文字傳輸協議,無狀態協議(不同批次無法相互識別),無連線協議,工作在應用層,用於完成從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳輸協議,完成了文件的快速傳輸,還能確定傳輸文件的哪一部分,以及控制哪一部分內容首先顯示。

整個http過程由請求和響應構成,a通常承載與tcp協議上。

http完整流程包括四部分:

1.客戶機與伺服器建立連線;2.客戶機傳送請求給伺服器;3.伺服器接收到客戶端的請求,發出響應;4.客戶端收到請求並處理。

http請求由三部分組成:請求行,首部,請求正文。

請求報文格式為:請求行+首部+空行+實體組成

響應報文格式為:狀態行+首部+空行+實體組成

<1>請求行以方法開頭,以空格分開,緊隨其後的是路徑和版本(包括http請求的種類,請求資源的路徑,協議的版本號),

格式為:method request-url http-version clrf

method為請求方法(get,post等),request-url是統一的資源識別符號,http-version為http協議的版本,crlf為回車和換行(回車和換行只能出現在結尾,不能再其他地方出現)。

請求方法有:

get請求伺服器的文件;post向伺服器傳送資訊;

put從伺服器向客戶端傳送文件;delete為刪除web網頁;

trace為把到達的請求回送;head為請求關於文件的資訊,但不是文件本身;options詢問關於可用的選項;

<2>請求首部為http的頭部資訊,每乙個用\r\n分割;

常用的首部有:

-----connection:允許客戶端和伺服器指定與請求/響應連線有關的選項(長連線,短連線等)

-----data:提供日期和時間標誌

-----mime-version:給出了傳送端使用的mime版本

-----client-ip:描述客戶端機器的ip

-----from:提供了客戶端使用者的e-mail位址

-----host:給出請求的主機名和埠號

-----referer:提供了包含當前請求的url的文件的url

-----cookie:向伺服器傳送乙個令牌

<3>請求正文為傳送給伺服器的查詢資訊(使用get時,body是空的,get只能讀取,而post可以寫入資訊);

"get / http/1.1\r\nhost:www.dytt8.net\r\nconnection:close\r\n\r\n"---請求行\r\n請求首部1\r\n請求首部2\r\n\r\n報文實體內容

響應報文

響應報文也包括請求行,請求首部,空行,實體

請求行格式為:http版本+狀態碼+短語+\r\n  短語與狀態碼相對應

請求首部格式為:一系列首部名稱:值\r\n的組合

請求實體為:服務端真正返回的資訊

狀態編碼為:

100-199指定客戶端響應的一些動作,請求已被服務接收 200-299表示請求被接受,處理成功 

300-399表示已經移動的檔案,重定向,需進一步處理

400-499指定客戶端的錯誤,有語法錯誤無法實現 500-599指定服務端的錯誤,伺服器未能實現合法的請求

http1.1之後使用了長連線,長連線使資料傳輸完成後繼續保持tcp連線不間斷,等待相同網域名稱繼續使用這個通道進行資料傳輸,http1.0使用首部connection:keep-alive進行長連線的試驗,http1.1之後使用connection:close來告訴服務端不使用長連線。但是使用了connection:keep-alive這個首部並不代表採用長連線,

在短連線中:每乙個請求/響應都需要建立一次tcp連線(三次握手),

長連線模式下:判斷資料接收完成的方法有 --1--伺服器關閉連線;--2--首部content-length判斷是否傳輸完畢,指定了實體正文的長度。

cookie:通過在客戶端記錄資訊確定使用者身份,是客戶端儲存使用者資訊的一些機制,用於記錄使用者資訊,每次http請求,都會傳送響應的cookie到服務端;伺服器單從網路請求無法確定使用者身份,客戶端請求伺服器,如果伺服器需要記錄使用者的狀態,就通過response向客戶端瀏覽器頒發cookie,瀏覽器將其儲存起來,再次訪問時會攜帶cookie資訊,伺服器就能通過該資訊辨識客戶端,進一步可以修改cookie的內容。

session:通過服務端的記錄確定使用者身份,是在服務端儲存到資料結構,用來追蹤使用者的狀態。cookie是通過通行證來檢查客戶身份,session是通過檢查伺服器端的客戶明細表來確定客戶身份,他是客戶第一次請求時建立的。一般在瀏覽完的一定時間內被伺服器銷毀。

tcp連線的三次握手:

第一次握手:建立連線時客戶端傳送syn(同步序列編號)包到伺服器,進入syn_send狀態,等待伺服器的確認;

第二次握手:伺服器收到syn包,確認客戶的syn包(通過傳送ack的方式,ack=syn+1),並自己傳送乙個syn包到客戶端,伺服器進入syn_recv狀態;

第三次握手:客戶端收到伺服器的syn+ack包,自己向服務端傳送確認ack包,ack=syn+1;傳送完畢進入establish狀態,服務端收到確認後也進入到establish狀態,完成三次握手,客戶端開始傳送資料到服務端;

採用三次握手是為了避免已失效的連線請求被服務端收到,服務端誤以為新連線到來,傳送確認ack和syn到客戶端,這是客戶端收到就可以不作出響應,也就沒有新的連線建立。

tcp斷開的四次握手:

第一次握手:主動關閉的一方a向對方b傳送fin訊息報文,想要關閉連線;

第二次握手:對方b收到這個fin標誌後先向主機a傳送確認序號ack(為了避免對方多次傳送fin訊息),然後通知自己對方要關閉連線;

第三次握手:主機b處理完成,向a傳送fin訊息,表示自己也願意關閉這個連線;

第四次握手:主機a收到fin報文,向b傳送乙個ack確認訊息,並進入time_wite狀態,時間滿後自己關閉;

a需要在傳送後等待2msl的時間,一方面是為了怕自己傳送的ack b收不到,b會再次傳送fin+ack,這樣如果提前關閉可能b一直在發這個東西,另一方面避免已經失效的連線請求再次出現,經過2msl的時間,所以自己時間內產生的報文都將消失。

c++傳送http請求:

1.初始化套接字:

wsadata wsadata;

if (wsastartup(makeword(2, 2), &wsadata) == 0)

return true;

else

2.傳送請求:

//step2:通過網域名稱解析主機資訊

//包括主機名,別名,位址型別,位址長度和位址列表

struct hostent *hp = gethostbyname(host.c_str());//返回的結構記錄了主機的資訊

if (hp == null)

int timeout = 60000; //3s

int m = setsockopt(sock, sol_socket, so_sndtimeo, (char*)&timeout, sizeof(timeout));

int n = setsockopt(sock, sol_socket, so_rcvtimeo, (char*)&timeout, sizeof(timeout));

//step5:向socket傳送請求

//準備http請求

//請求資料

if (socket_error == send(sock, request.c_str(), request.size(), 0))

cout <<"訪問 "<0)

if (len - bytesread < 100)

cout << "*";

} buff[bytesread] = '\0';//新增結束標誌

res = buff;

readsize = bytesread;

//step7:關閉socket

closesocket(sock);

cout << endl;

cout << "獲取 " << host + resource << " 資料成功" << endl;

return true;

HTTP 協議簡析

http是乙個屬於應用層的面向兌現的協議,由於其簡捷 快速的方式,適用於分布式超 資訊系統。它與1990年提出。目前使用的版本是http 1.1版本。http協議 協議是指兩台計算機之間進行通訊必須共同遵守的規定或者規則。超文字傳輸協議是一種通訊協議,它允許將超文字標記語言文件從web伺服器傳送到客...

HTTP協議 簡析

http 超文字傳輸協議 hypertext transfer protocol 是網際網路上應用最為廣泛的一種網路協議,是所有的www檔案都必須遵守的標準。http協議是乙個基於tcp協議,屬於應用層的,物件導向的,無狀態的,無連線的協議。其簡單快捷,客戶向伺服器請求服務時,只需要傳送請求方法和路...

簡析HTTP協議(一)

首先說說協議 協議就是要通訊的雙方制定的,都需要用到的規定。比如南方人和北方人,各說各的家鄉話,雙方都聽不懂,無法交流,但如果他們約定好都說普通話,那交流就不成問題了。說普通話 就是這兩個人制定的協議。百科裡的說法 協議是用來描述程序之間資訊交換資料時的規則術語。其實就是網路上的各台計算機之間進行通...