天天看點

HTTP工作原理及HTTP請求、響應封包解讀

一、HTTP原理

1.HTTP工作原理(執行個體分析):

<1> http用戶端與http伺服器建立TCP連接配接;

<2> http用戶端通過浏覽器向http伺服器80端口發送HTTP連接配接請求;

<3>如果http伺服器允許通路,則傳回連接配接确認,雙方建立HTTP連接配接;

<4>. http用戶端發送HTTP頁面請求(Http Analyzer V5分析結果)

HTTP工作原理及HTTP請求、響應封包解讀

<5>. http伺服器尋找該HTTP檔案,如果找到則傳回該檔案的超文本。http用戶端的浏覽器對接收到的超文本進行解析,翻譯成格式化的頁面,顯示給使用者;

(Http伺服器模拟傳回)

HTTP工作原理及HTTP請求、響應封包解讀
HTTP工作原理及HTTP請求、響應封包解讀

<6>. http伺服器發送完HTTP内容後,斷開HTTP連接配接;

<7>. 雙方斷開TCP連接配接;

/*-----------------------------------------------
-------------HTTPServer---------------------
------------------------------------------------*/
#include <winsock2.h>
#include <stdio.h>
 
int main(void) 
{
    //----------------------
    // Initialize ......
    int len = 0;
    char buff[4096];
    char msgret[4096];
    memset( msgret, 0x00, sizeof(msgret) );
 
    
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
        printf("Error at WSAStartup()\n");
        return 1;
    }
 
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("10.166.178.225");
    service.sin_port = htons(80);
    
    if (bind( ListenSocket, 
        (SOCKADDR*) &service, 
        sizeof(service)) == SOCKET_ERROR) {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen( ListenSocket, 1 ) == SOCKET_ERROR) 
    {
        printf("Error listening on socket.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
 
    //----------------------
    // Accept the connection.
    SOCKET AcceptSocket;
    printf("Waiting for client to connect...\n");
 
    while(1)
    {
        AcceptSocket = accept( ListenSocket, NULL, NULL );        
        if (AcceptSocket == INVALID_SOCKET)
        {
            printf("accept failed: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        } 
        else 
        {
            printf("Client connected.\n");
            memset( buff, 0x00, sizeof(buff) );
            len = recv(AcceptSocket, buff, 4096, 0);
            printf( "msg recv:\n%s\n", buff );
 
            sprintf( msgret, "HTTP/1.1 200 OK\n"
                "Date: Fri, 02 Mar 2012 01:59:03 GMT\n"
                "Server: Apache"
                "Location: http://www.sina.com.cn/\n"
                "Cache-Control: max-age=60\n"
                "Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"
                "Vary: Accept-Encoding\n"
                "Content-Length: 231\n"
                "Content-Type: text/html; charset=iso-8859-1\n"
                "X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"
                "Connection: close\n\n"
                "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
                "<html><head>\n"
                "<title>title test</title>\n"
                "</head><body>\n"
                "<h1>test body</h1>\n"
                "<h2>test sub body</h2>\n"
                "<p>My First Test!</p>\n"
                "</body></html>" );
                len = send( AcceptSocket, msgret, sizeof(msgret), 0 );
                if( len <= 0 )
                {
                    printf( "send failed\n" );
                }
        }//end else
    }//end while
 
    
    // No longer need server socket
    closesocket(ListenSocket);    
    WSACleanup();
    return 0;
}           

伺服器端的顯示結果…

HTTP工作原理及HTTP請求、響應封包解讀

2.HTTP請求(request)&響應(response)封包解讀(Http Analyzer V5分析結果)

2.1 HTTP請求封包(Header部分)

HTTP工作原理及HTTP請求、響應封包解讀

GET請求:是以實體的方式得到由請求URL所指定資源的資訊,如果請求URL隻是一個資料産生過程,那麼最終要在響應實體中的是處理過程的結果所指向的資源,而不是處理過程的描述。GET是向伺服器發索取資料的一種請求。

[1]GET /HTTP/1.1

[2]Accept:image/gif, Image/x-xbitmap, image/jpeg, Image/pjpeg,  application/x-shockwave

-flash, application/x-silverlight,application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword,  /  //用戶端可識别的内容類型清單。

[3]Accept-Language:zh-cn 用戶端所能解釋的語言:簡體中文

[4]UA-CPU: x86(上面未展現出來)

[5]Accept-Encoding:gzip, deflate  //用戶端可以解釋的類型

[6]User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.3; .NET CLR2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET 4.0C; .NET4.0E)

 //用戶端浏覽器型号(同下)

HTTP工作原理及HTTP請求、響應封包解讀

[7]Host: 10.166.178.225送出請求頁面(用本地機器測試,即為本地IP位址;此處可以是網站域名如:www.dlut.edu.cn)。

[8]Connection:Keep-Alive TCP連接配接保持打開。

2.2 HTTP響應封包(Header部分)

HTTP工作原理及HTTP請求、響應封包解讀
1

HTTP/1.1 200 OK

[2]Date: Fri, 02Mar 2012 01:59:03 GMT

[3]Server:ApacheLocation:

http://www.sina.com.cn

[4]Cache-Control:max-age=60

[5]Expires: Fri,02 Mar 2012 02:00:03 GMT

[6]Vary: Accept-Encoding

[7]Content-Type:text/html; charset=iso-8859-1

[8]X-Cache:MISS from xd33-82.HP08040021.sina.com.cn

[9]Connectionclose

該響應資訊也以對應的4部分組成:

協定狀态描述,HTTP/1.1表示協定版本,200 OK表示伺服器已經成功處理了用戶端發出的請求。200表示HTTP的應答碼成功。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:

1XX-資訊類(Information),表示收到Web浏覽器請求,正在進一步的進行中

2XX-成功類(Successful),表示使用者請求被正确接收,了解和處理例如:200 OK

3XX-重定向類(Redirection),表示請求沒有成功,客戶必須采取進一步的動作。

4XX-用戶端錯誤(Client Error),表示用戶端送出的請求有錯誤 例如:404 NOT Found,意味着請求中所引用的文檔不存在。

5XX-伺服器錯誤(Server Error)表示伺服器不能完成對請求的處理:如 500

響應報頭:跟請求報頭一樣,它指出伺服器的功能,辨別出響應資料的細節。

空行:也是屬于響應報頭和響應正文之間必須存在的一個空行,表示響應報頭結束,接下來是響應正文

響應正文:也就是伺服器傳回的網頁内容。

HTTP工作原理及HTTP請求、響應封包解讀

作者:銘毅天下

原文:

https://blog.csdn.net/laoyang360/article/details/8280478

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀