HTTP 网络协议请求的消息结构,具体详解(2024-04-25)

embedded/2024/9/20 7:36:11/ 标签: 网络协议, http, 网络

一、简介

HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

HTTP 消息是客户端和服务器之间通信的基础,它们由一系列的文本行组成,遵循特定的格式和结构。


二、消息分类

HTTP消息分为两种类型:请求消息和响应消息。

一个 HTTP 客户端是一个应用程序(Web 浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。

一个 HTTP 服务器 同样也是一个应用程序(通常是一个 Web 服务,如 Nginx、Apache 服务器或 IIS 服务器等),通过接收客户端的请求并向客户端发送 HTTP 响应数据。

https://img-blog.csdnimg.cn/img_convert/38f386e48db0f5ef7a96378090343b22.jpeg" width="567" />

https://img-blog.csdnimg.cn/direct/0a51acfe2fe14c868ca2a3c388c5804d.png" width="619" />

 


三、客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

https://img-blog.csdnimg.cn/img_convert/b799ad3f83ec38d9deba579a8ad2a5ae.png" width="466" />

  • 请求行(Request Line):(也称请求起始行)由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

    • 方法Method:如 GET、POST、PUT、DELETE等,指定要执行的操作。
    • 请求 Request-URl(统一资源标识符):请求的资源路径,通常包括主机名、端口号(如果非默认)、路径和查询字符串。
    • HTTP-Version 版本:如 HTTP/1.1 或 HTTP/2。
    • CRLF:表示回车和换行

    请求行的格式示例:GET /index.html HTTP/1.1

  • 请求头(Request Headers):

    • 包含了客户端环境信息、请求体的大小(如果有)、客户端支持的压缩类型等。
    • 常见的请求头包括HostUser-AgentAcceptAccept-EncodingContent-Length等。
  • 空行

    • 请求头和请求体之间的分隔符,表示请求头的结束。
  • 请求体(可选):

    • 在某些类型的HTTP请求(如 POST 和 PUT)中,请求体包含要发送给服务器的数据。

https://img-blog.csdnimg.cn/direct/d0b4a0a0725244a9ba5c52459cd52289.png" width="628" />

 

https://img-blog.csdnimg.cn/direct/c7b9b8472d5e40c2952b0456ba7432dd.png" width="617" />

 

https://img-blog.csdnimg.cn/direct/74ab51fec69e4b1788a00415c7e3f71d.png" width="648" />

 

https://img-blog.csdnimg.cn/direct/ef7fbf909cc544f28d0b92053889ed65.png" width="636" />

 

https://img-blog.csdnimg.cn/direct/916c529d5c6247e38da9370f0f126831.png" width="622" />

 

 


四、服务器响应消息

HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

https://img-blog.csdnimg.cn/img_convert/0faa1bf12225dde9d75d5351c6a56533.jpeg" width="683" />

  • 状态行(Status Line):

    • HTTP 版本:与请求消息中的版本相匹配。
    • 状态码:三位数,表示请求的处理结果,如 200 表示成功,404 表示未找到资源。
    • 状态信息:状态码的简短描述。

    状态行的格式示例:HTTP/1.1 200 OK

  • 响应头(Response Headers):

    • 包含了服务器环境信息、响应体的大小、服务器支持的压缩类型等。
    • 常见的响应头包括Content-TypeContent-LengthServerSet-Cookie等。
  • 空行

    • 响应头和响应体之间的分隔符,表示响应头的结束。
  • 响应体(可选):

    • 包含服务器返回的数据,如请求的网页内容、图片、JSON数据等。

https://img-blog.csdnimg.cn/direct/cedade2ab3fb400a8d0bc92832714f1c.png" width="1008" /> 

https://img-blog.csdnimg.cn/direct/0d77cef1fa3d4c1a8a9721619bb84a7e.png" width="1003" /> 


五、HTTP 协议的 8 种请求类型介绍

HTTP 协议中共定义了八种方法或者叫“动作”来表明对 Request-URI 指定的资源的不同操作方式,具体介绍如下:

  •  OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
  •  HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  •  GET:向特定的资源发出请求。
  •  POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  •  PUT:向指定资源位置上传其最新内容。
  •  DELETE:请求服务器删除 Request-URI 所标识的资源。
  •  TRACE:回显服务器收到的请求,主要用于测试或诊断。
  •  CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

虽然 HTTP 的请求方式有 8 种,但是我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。

(1)GET

get是最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。

GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。

使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制

例如,/index.jsp?id=100&op=bind,这样通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友

以用google搜索domety为例,Request格式如下:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1    
Accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword,application/x-silverlight,application/x-shockwave-flash, */*    
Referer:<a href="http://www.google.cn/">http://www.google.cn/</a>    
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate    
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
Host:<a href="http://www.google.cn">www.google.cn</a>    
Connection: Keep-Alive    
Cookie:PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r   

可以看到,GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址链接如下:

<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">请求地址
</a>  

地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。

另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别2048个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式,应换为POST请求方式。

URL数据长度

Http协议规范中对于get方法提交的URL数据长度并没有明确的限制

目前说的get提交方式有长度限制,是特定的浏览器及服务器对它的限制。各种浏览器和服务器的最大处理能力如下:


浏览器:

IE浏览器(Microsoft Internet Explorer): 对url长度限制是2083(2K+53)个字符,超过这个限制,则自动截断(若是form提交则提交按钮不起作用,没有任何反应)。

Safari:url最大长度限制为80000个字符。

Opera:url最大长度限制为190000个字符。

Chrome:url最大长度限制为8182个字符。超过最大限制服务器会返回414错误。

Firefox:对Firefox浏览器url的长度限制为:65536个字符。

所以,大多数浏览器的限制在2k-8k之间,更老的版本浏览器甚至只支持255 bytes。


服务器:

Apache:能接受url长度限制为8192字符

Microsoft Internet Information Server(IIS):n能接受最大url的长度为16384个字符。

tomcat:中通过较多的Connector参数控制url长度限制:


maxParameterCount:GET和POST请求参数个数,默认是10000


maxPostSize:POST请求数据最大值

nginx可以通过修改配置来改变url请求串的url长度限制:
client_header_buffer_size 默认值:1k
large_client_header_buffers默认值:4k或8k

大多数Web服务器的限制为8192字节(8KB),通常可以在服务器配置中的某个位置进行配置


理论上讲:

post:是没有大小限制的。

Http协议规范:也没有进行大小限制,起限制作用的是服务器处理程序的处理能力。

Tomcat:默认post长度为2M,可通过修改conf/server.xml中的“maxPostSize=0”来取消对post大小的限制

(2)POST

对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。

POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。

还以上面的搜索domety为例,如果使用POST方式的话,格式如下:

POST /search HTTP/1.1    
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*    
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>    
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate    
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
Host: <a href="http://www.google.cn">www.google.cn</a>    
Connection: Keep-Alive    
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_rhl=zh-CN&source=hp&q=domety

可以看到,POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。

POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

(3)HEAD

HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。


六、实例

下面实例是一点典型的使用 GET 来传递数据的实例:

客户端请求:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive

服务端响应:

HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8<!DOCTYPE html>
<html>
<head><title>Example Page</title>
</head>
<body><h1>Hello, World!</h1><!-- The rest of the HTML content -->
</body>
</html>

在实际应用中,HTTP 消息可以包含更多的头字段,并且请求体和响应体的大小会根据传输的数据而变化。

GET实例

//请求首行GET /hello/index.jsp HTTP/1.1  //请求头信息,因为GET请求没有正文
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98//空行
//因为GET没有正文,所以下面为空

POST实例

// 请求首行POST /hello/index.jsp HTTP/1.1 //请求头信息
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost/hello/index.jsp
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
Content-Type: application/x-www-form-urlencoded 
Content-Length: 14 // 这里是空行
//POST有请求正文
username=hello


http://www.ppmy.cn/embedded/16456.html

相关文章

网络安全之防范钓鱼邮件

随着互联网的快速发展&#xff0c;新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势&#xff0c;利用网络钓鱼进行欺骗的行为越来越猖獗&#xff0c;对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件&#xff0c;而邮件标题和内容&#xff0c;…

【线性代数 C++】结合逆矩阵的克拉默法则

1 原理 对于 n n n个变量、 n n n个方程的线性方程组 { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ ⋯ ⋯ a n 1 x 1 a n 2 x 2 ⋯ a n n x n b n , (1) \begin{cases} a_{11}x_1a_{12}x_2\cdots a_{1n}x_nb_1 \\ a_{21}x_1a_{22}…

设计模式:迪米特法则(Law of Demeter,LoD)介绍

迪米特法则&#xff08;Law of Demeter&#xff0c;LoD&#xff09;&#xff0c;也称为最少知识原则&#xff08;Least Knowledge Principle&#xff0c;LKP&#xff09;&#xff0c;是面向对象设计原则之一&#xff0c;它强调一个对象应该对其他对象有尽可能少的了解&#xff…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

unity中压缩文件与解压文件

今天研究了一下在unity中 把文件压缩后转二进制发送到服务器并从服务器下载后解压使用文件&#xff0c;废话不多说直接上代码&#xff0c;zip压缩插件是用的dotnetzip插件&#xff0c;网上可以搜索下载这个dll private static void GetPathMeshData_ZIP(Milling_ProjectData da…

kotlin根据文件的filePath转化为uri

方法实现 使用File类来创建一个文件对象&#xff0c;然后通过FileProvider来获取文件的URI import android.content.Context import android.net.Uri import androidx.core.content.FileProvider import java.io.Filefun getFileUri(context: Context, filePath: String): Ur…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器&#xff1a;iOS上的复古游戏天堂 在数字时代&#xff0c;我们有时会怀念起那些早期的电子游戏&#xff0c;它们简单、纯粹&#xff0c;带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升&#xff0c;但那种复古的感觉却始终无法替代。幸运的是&a…

【漏洞复现】用友政务财务系统 FileDownload 任意文件读取漏洞

0x01 产品简介 用友政务财务系统是面向政府部门、事业单位、非赢利组织的全方位业务管理信息化解决方案提供商。该系统具备一系列的功能特点,能够满足不同规模和类型企业的财务管理需求。 0x02 漏洞概述 用友政务财务系统存在任意文件读取漏洞,未授权的攻击者可以通过该漏…

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器&#xff0c;在item中添加了很多的控件&#xff0c;这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候&#xff0c;及容易不小心就把数据给修改了而不自知。所有&#xff0c;我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言

为什么java语言不适合作为aps算法的开发语言 主要两个原因 1 java的list在特定位置插入&#xff0c;其实是重新生成一个新list,而不像c就是指针操作 2 数据量大&#xff0c;运行时间长&#xff0c;会跑崩 所以商业aps产品&#xff0c;都是清一色的用c写aps算法 先进制造…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…

mybatis-plus 动态表名简易使用

场景&#xff1a;由于有些表是分表的&#xff0c;需要给表名添加后缀才能正确地访问表&#xff0c;如sys_user_2024_01 代码 依赖版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><ve…

mysql机试题笔记425

题目 Sql题&#xff0c;有一个学生信息表&#xff0c; stu_info_table(stu_id, name, class) 和一张学生成绩表 stu_score_table(stu_id, course_id, score) 和一张课程表 stu_course(course_id, course_name)因为有可能存在挂科&#xff0c;所以在学生成绩表中&#xff0c; 一…

Swift 中如何四舍五入

在 Swift 中&#xff0c;你可以使用不同的方法来进行四舍五入操作&#xff0c;具体取决于你的需求和场景。以下是几种常见的方法&#xff1a; round()函数 round()函数可以对浮点数进行四舍五入&#xff0c;并返回最接近的整数。 let number 3.75let roundedNumber round(n…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

代码随想录训练营Day 32|Python|Leetcode|● 738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解题思路&#xff1a; 对于所给数字进行str()并从后向前…

[ACTF2020 新生赛]BackupFile 1 [极客大挑战 2019]BuyFlag 1 [护网杯 2018]easy_tornado 1

目录 [ACTF2020 新生赛]BackupFile 1 1.打开页面&#xff0c;叫我们去找源文件 2.想到用disearch扫描&#xff0c;发现源文件index.php.bak 3.访问这个文件&#xff0c;下载一个文件&#xff0c;用记事本打开 4.翻译php代码 5.构造payload url/?key123&#xff0c;得到fl…

MemFire案例-政务应急物联网实时监测预警项目

客户背景 党的十八大以来&#xff0c;中央多次就应急管理工作做出重要指示&#xff1a;要求坚持以防为主、防抗救相结合&#xff0c;全面提升综合防灾能力&#xff1b;坚持生命至上、安全第一&#xff0c;完善安全生产责任制&#xff0c;坚决遏制重特大安全事故。 面对新形势…

Amazon Bedrock的尝鲜体验

在当今数字化飞速发展的时代&#xff0c;云计算已经成为企业和个人用户不可或缺的资源。Amazon Bedrock&#xff0c;作为亚马逊云服务&#xff08;AWS&#xff09;的一项创新产品&#xff0c;为广大用户提供了一个全新的云端服务体验。下面是对Amazon Bedrock的简单体验。 作为…