HTTP工作原理及HTTP请求、响应报文解读

一、HTTP原理

1.HTTP工作原理(实例分析):

<1> http客户端与http服务器建立TCP连接


<2> http客户端通过浏览器向http服务器80端口发送HTTP连接请求;


<3>如果http服务器允许访问,则返回连接确认,双方建立HTTP连接;

<4>. http客户端发送HTTP页面请求(Http Analyzer V5分析结果


<5>. http服务器寻找该HTTP文件,如果找到则返回该文件的超文本。http客户端的浏览器对接收到的超文本进行解析,翻译成格式化的页面,显示给用户;

Http服务器模拟返回



<6>. http服务器发送完HTTP内容后,断开HTTP连接;

<7>. 双方断开TCP连接;

[cpp]  view plain copy
  1. <span style="font-size:14px;">/*----------------------------------------------- 
  2. -------------HTTPServer--------------------- 
  3. ------------------------------------------------*/  
  4. #include <winsock2.h>  
  5. #include <stdio.h>  
  6.   
  7. int main(void)   
  8. {  
  9.     //----------------------  
  10.     // Initialize ......  
  11.     int len = 0;  
  12.     char buff[4096];  
  13.     char msgret[4096];  
  14.     memset( msgret, 0x00, sizeof(msgret) );  
  15.   
  16.       
  17.     //----------------------  
  18.     // Initialize Winsock.  
  19.     WSADATA wsaData;  
  20.     int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
  21.     if (iResult != NO_ERROR) {  
  22.         printf("Error at WSAStartup()\n");  
  23.         return 1;  
  24.     }  
  25.   
  26.     //----------------------  
  27.     // Create a SOCKET for listening for  
  28.     // incoming connection requests.  
  29.     SOCKET ListenSocket;  
  30.     ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
  31.     if (ListenSocket == INVALID_SOCKET) {  
  32.         printf("Error at socket(): %ld\n", WSAGetLastError());  
  33.         WSACleanup();  
  34.         return 1;  
  35.     }  
  36.       
  37.     //----------------------  
  38.     // The sockaddr_in structure specifies the address family,  
  39.     // IP address, and port for the socket that is being bound.  
  40.     sockaddr_in service;  
  41.     service.sin_family = AF_INET;  
  42.     service.sin_addr.s_addr = inet_addr("10.166.178.225");  
  43.     service.sin_port = htons(80);  
  44.       
  45.     if (bind( ListenSocket,   
  46.         (SOCKADDR*) &service,   
  47.         sizeof(service)) == SOCKET_ERROR) {  
  48.         printf("bind() failed.\n");  
  49.         closesocket(ListenSocket);  
  50.         WSACleanup();  
  51.         return 1;  
  52.     }  
  53.       
  54.     //----------------------  
  55.     // Listen for incoming connection requests.  
  56.     // on the created socket  
  57.     if (listen( ListenSocket, 1 ) == SOCKET_ERROR)   
  58.     {  
  59.         printf("Error listening on socket.\n");  
  60.         closesocket(ListenSocket);  
  61.         WSACleanup();  
  62.         return 1;  
  63.     }  
  64.   
  65.     //----------------------  
  66.     // Accept the connection.  
  67.     SOCKET AcceptSocket;  
  68.     printf("Waiting for client to connect...\n");  
  69.   
  70.     while(1)  
  71.     {  
  72.         AcceptSocket = accept( ListenSocket, NULL, NULL );        
  73.         if (AcceptSocket == INVALID_SOCKET)  
  74.         {  
  75.             printf("accept failed: %d\n", WSAGetLastError());  
  76.             closesocket(ListenSocket);  
  77.             WSACleanup();  
  78.             return 1;  
  79.         }   
  80.         else   
  81.         {  
  82.             printf("Client connected.\n");  
  83.             memset( buff, 0x00, sizeof(buff) );  
  84.             len = recv(AcceptSocket, buff, 4096, 0);  
  85.             printf( "msg recv:\n%s\n", buff );  
  86.   
  87.             sprintf( msgret, "HTTP/1.1 200 OK\n"  
  88.                 "Date: Fri, 02 Mar 2012 01:59:03 GMT\n"  
  89.                 "Server: Apache"  
  90.                 "Location: http://www.sina.com.cn/\n"  
  91.                 "Cache-Control: max-age=60\n"  
  92.                 "Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"  
  93.                 "Vary: Accept-Encoding\n"  
  94.                 "Content-Length: 231\n"  
  95.                 "Content-Type: text/html; charset=iso-8859-1\n"  
  96.                 "X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"  
  97.                 "Connection: close\n\n"  
  98.                 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"  
  99.                 "<html><head>\n"  
  100.                 "<title>title test</title>\n"  
  101.                 "</head><body>\n"  
  102.                 "<h1>test body</h1>\n"  
  103.                 "<h2>test sub body</h2>\n"  
  104.                 "<p>My First Test!</p>\n"  
  105.                 "</body></html>" );  
  106.                 len = send( AcceptSocket, msgret, sizeof(msgret), 0 );  
  107.                 if( len <= 0 )  
  108.                 {  
  109.                     printf( "send failed\n" );  
  110.                 }  
  111.         }//end else  
  112.     }//end while  
  113.   
  114.       
  115.     // No longer need server socket  
  116.     closesocket(ListenSocket);    
  117.     WSACleanup();  
  118.     return 0;  
  119. }</span>  

服务器端的显示结果


2.HTTP请求(request)&响应(response)报文解读Http Analyzer V5分析结果

2.1 HTTP请求报文(Header部分)


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)

 //客户端浏览器型号(同下)


[7]Host: 10.166.178.225提交请求页面(用本地机器测试,即为本地IP地址;此处可以是网站域名如:www.dlut.edu.cn)。

[8]Connection:Keep-Alive TCP连接保持打开

 

2.2 HTTP响应报文(Header部分)


[1](Status-Line)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

响应报头:跟请求报头一样,它指出服务器的功能,标识出响应数据的细节。

空行:也是属于响应报头和响应正文之间必须存在的一个空行,表示响应报头结束,接下来是响应正文

响应正文:也就是服务器返回的网页内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值