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

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

一、HTTP原理


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


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




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


image.png


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


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


image.png


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


(Http服务器模拟返回)

image.png

image.png




<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;

}

服务器端的显示结果…

image.png



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


2.1 HTTP请求报文(Header部分)


image.png




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)


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

image.png



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


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



2.2 HTTP响应报文(Header部分)

image.png



[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


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


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


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

image.png


相关文章
|
5月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
602 130
|
8月前
|
Web App开发 网络协议 应用服务中间件
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
HTTP/2 是 HTTP/1.1 的重要升级,通过多路复用、头部压缩、服务器推送等特性显著提升性能与效率。本文详细解析了 HTTP/2 的优势、配置方法及实际应用,涵盖 Nginx/Apache/IIS 配置、curl 测试工具使用,并对比 HTTP/1.1 指出其优化点。同时提醒需注意 HTTPS 支持、客户端兼容性等问题,助你高效掌握并运用 HTTP/2 技术。
945 5
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
|
11月前
|
JSON API 网络架构
HTTP常见的请求方法、响应状态码、接口规范介绍
本文详细介绍了HTTP常见的请求方法、响应状态码和接口规范。通过理解和掌握这些内容,开发者可以更好地设计和实现W
1836 83
|
6月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
7月前
|
缓存 JavaScript 前端开发
Vue 3 HTTP请求封装导致响应结果无法在浏览器中获取,尽管实际请求已成功。
通过逐项检查和调试,最终可以定位问题所在,修复后便能正常在浏览器中获取响应结果。
309 0
|
9月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
912 20
|
10月前
|
人工智能 网络协议 API
开发效率翻倍!Apipost这些协议调试秘籍,从HTTP到金融报文全搞定
Apipost是一款强大的API研发管理工具,支持多种协议与数据格式,包括HTTP(s)、WebSocket、SSE、gRPC、TCP及金融协议(如ISO 8583、FIX)。它内置国密算法库,提供HTTP文件秒传、全局参数配置等实用功能。在SSE调试中,可轻松处理AI模型流式响应;WebSocket与Socket.IO实现高效实时通信;GraphQL支持可视化Query编写;TCP模块解决金融报文编码难题;gRPC则具备服务反射与流式调试能力。Apipost不仅简化了多协议切换的复杂性,还自动生成文档,显著提升开发效率,让开发者专注于核心业务逻辑。
|
API 数据安全/隐私保护
Haskell中的HTTP请求:代理与响应状态检查
Haskell中的HTTP请求:代理与响应状态检查
194 13
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。
1516 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block  解决办法:Hbase侧配置的dfs.socket.timeout值过小,与DataNode侧配置的 dfs.socket.timeout的配置不一致,将hbase和datanode的该配置调成大并一致。
941 0

热门文章

最新文章