HTTP协议-报文解析

2023-05-16

概述

HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息的组成:

  1. 开始行(对于请求消息,开始行就是请求行;对于响应消息,开始行就是状态行)
  2. 消息报头(可选)
  3. 空行(只有CRLF的行)
  4. 消息正文(可选)组成。

一、请求报文

http请求由四部分组成:

  1. 请求行
  2. 消息报头/请求头
  3. 空行
  4. 请求正文

1.1 请求行

Method Request-URI HTTP/Version CRLF

(1) Method

HTTP请求方法

请求方法描述
GET请求获取Request-URI所标识的资源
POST在Request-URI所标识的资源后附加新的数据
HEAD请求获取由Request-URI所标识的资源的响应消息报头
PUT请求服务器存储一个资源,并用Request-URI作为其标识
DELETE请求服务器删除Request-URI所标识的资源
TRACE请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求

(2) Request-URI

URI完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头

(3) HTTP/Version

协议/版本

1.2 请求头

Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Host、User-Agent等。

1.3 请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。

二、响应报文

http响应由四部分组成:

  1. 状态行
  2. 消息报头/响应头
  3. 空行
  4. 响应正文

2.1 状态行

HTTP/Version Status-Code Reason-Phrase CRLF

(1) HTTP/Version

协议/版本

(2) Status-Code Reason-Phrase

HTTP状态码

状态码分类描述
1xx指示信息–表示请求已接收,继续处理
2xx成功–表示请求已被成功接收、理解、接受
3xx重定向–要完成请求必须进行更进一步的操作
4xx客户端错误–请求有语法错误或请求无法实现
5xx服务器端错误–服务器未能实现合法的请求
状态码列表描述
200 OK客户端请求成功
400 Bad Request客户端请求有语法错误,不能被服务器所理解
401 Unauthorized请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden
404 Not Found请求资源不存在,eg:输入了错误的URL
500 Internal Server Error服务器发生不可预期的错误
503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常

2.2 响应头

Location、Server、WWW-Authenticate等

2.3 响应正文

响应头和响应正文之间是一个空行,这个行非常重要,它表示响应头已经结束,接下来的是响应正文。

三、消息报头

包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由 “名字:值” 组成,消息报头域的名字是 大小写无关 的。

3.1 普通报头

Connection 报头域允许发送指定连接的选项。

  • Connection:keep-alive 指定连接是连续的。

  • Connection:close 通知服务器,在响应完成后,关闭连接。

Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
Cache-Control:no-cache

  • 请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached。
  • 响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

Date 普通报头域表示消息产生的日期和时间。

3.2 请求报头

Host 发送请求时,该报头域是必需的。 用于指定被请求资源的主机和端口号,通常从HTTP: URL中提取出来的。

  • 在浏览器中输入:http://www.guet.edu.cn/index.html
    浏览器发送的请求消息中,就会包含Host请求报头域,如下:
    Host:www.guet.edu.cn
    此处使用缺省端口号80,若指定了端口号,则变成:
    Host:www.guet.edu.cn: 端口号

Accept 用于指定客户端接受哪些类型的资源。

  • Accept:image/gif 客户端希望接受GIF图象格式。
  • Accept:text/html 客户端希望接受html文本。
  • Accept:*/* 客户端接受任何 MIME 类型的资源。

Accept-Charset 用于指定客户端接受的字符集。

  • Accept-Charset:iso-8859-1,gb2312
  • 如果没有设置这个域,缺省是任何字符集都可以接受。

Accept-Encoding 类似于Accept,用于指定可接受的内容编码。

  • Accept-Encoding:gzip.deflate
  • 如果没有设置这个域,服务器假定客户端对各种内容编码都可以接受。

Accept-Language 类似于Accept,用于指定一种自然语言。

  • Accept-Language:zh-cn
  • 如果没有设置这个域,服务器假定客户端对各种语言都可以接受。

Authorization 用于证明客户端有权查看某个资源。

  • 当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

User-Agent 允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的。

  • User_Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36

3.3 响应报头

Location 用于重定向接收者到一个新的位置。

  • 客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。

Server 表示服务器用来处理请求的软件信息。

  • Server: Apache-Coyote/1.1
  • Server: nginx
  • User-Agent 请求报头域是相对的,Server 表示发送服务器端软件的信息,后者表示发送客户端软件(浏览器)和操作系统的信息。

WWW-Authenticate 服务器对客户端的认证信息,必须被包含在401(未授权的)响应消息中

  • WWW-Authenticate: Basic realm="Basic Auth Test!"
  • Authorization 请求报头域是相关的,当客户端收到401响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了 Authorization 报头域的请求。

3.4 实体报头

Content-Length 用于描述消息实体的传输长度。

  • Content-Length: 1000
  • 仅仅是表示消息实体正文的长度,不包括实体报头的长度。

Content-Encoding 表示已经被应用到实体正文的编码方式,被用作媒体类型的修饰符。

  • Content-Encoding: gzip
  • 如果实体正文采用了编码方式存储,在使用之前必须进行解码,解码后才能获得 Content-Type 报头域中所引用的媒体类型。

Content-Type用于指明发送给接收者的实体正文的媒体类型。

  • Content-Type: application/json;charset=GB18030
  • Content-Type对照表

Transfer-Encoding 表示描述消息实体的传输编码方式

  • Transfer-Encoding: chunked 能够自解释报文是否传输完毕。如果有做该设置,则必须忽略 Content-Length 头部。
    格式:len1\r\ndata1\r\nlen2\r\ndata2\r\n…0\r\n\r\n 长度是以字符串形式传输,表示十六进制数据。

Content-Language 描述了资源所用的自然语言

  • Content-Language: da 实体内容仅打算提供给丹麦的阅读者。
  • 如果没有设置这个域,实体内容将提供给所有语言的阅读者。

Last-Modified 用于指示资源最后的修改日期。

Expires 用于表示消息实体过期的日期时间。

  • 通常,代理服务器或浏览器会缓存一些页面。
    当用户再次访问这些页面时,直接从缓存中加载并显示给用户,这样缩短了响应的时间,减少服务器的负载。
    为了让代理服务器或浏览器在一段时间后更新页面,我们可以使用Expires实体报头域指定页面过期的时间。
    当用户又一次访问页面时,如果Expires报头域给出的日期和时间比Date普通报头域给出的日期和时间要早(或相同),那么代理服务器或浏览器就不会再使用缓存的页面而是从服务器上请求更新的页面。
    不过要注意,即使页面过期了,也并不意味着服务器上的原始资源在此时间之前或之后发生了改变。

四、请求方法之GET与POST

4.1 GET方法

GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始。
地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。

4.2 POST方法

POST方法可以允许客户端给服务器提供信息较多。
POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。

4.3 两者区别

  1. 请求数据的形式
  • GET:请求的数据会附在URL之后,以 ? 分割URL和传输数据,多个参数用 & 连接。
  • POST:把提交的数据放置在是HTTP包的请求数据中,即请求正文。
  1. 传输数据的大小
  • GET:特定浏览器和服务器对URL长度有限制,GET提交时,传输数据就会受到URL长度的限制。
  • POST:由于不是通过URL传值,理论上数据不受限。
  1. 安全性
    POST的安全性要比GET的安全性高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP协议-报文解析 的相关文章

随机推荐

  • 嵌入式控制器EC是如何运行起来的

    EC的作用在本文中就不谈了 xff0c 百度里面可以找到很多 xff0c 反正像笔记本这样的移动设备 xff0c 都需要EC来做相关的控制 xff0c 具体可以自己去百度 这里主要介绍EC是如何运行起来的 xff0c 其实和CPU是如何运行
  • 如何在C/C++中利用变量来创建变化长度的数组

    在C C 43 43 中可以直接使用 xff1a int a n 创建长度为n的整型数组 xff0c 这种定义数组的方法需要事先确定好数组的长度 xff0c 即 n 必须为常量 xff0c 这意味着 xff0c 如果在实际应用中无法确定数组
  • Host是如何与EC通信的(BIOS通过ACPI协议对EC RAM进行读写)

    文章目录 一 EC RAM是什么 二 使用步骤 1 高级配置和电源接口 ACPI 规范 2 EC RAM读写过程 总结 一 EC RAM是什么 EC提供256字节的可被系统读写的RAM空间 EC的资源 包括电池信息 EC版本等信息 在该RA
  • PX4之飞行控制框架

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • 使用树莓派学习Linux驱动开发-02 面向对象/分层/分离驱动设计思想编写LED驱动程序

    系列文章目录 此博客内容根据韦东山嵌入式Linux驱动开发课程书写而来 将课程中用到的代码移植到树莓派4B板子 文章目录 系列文章目录 前言 一 驱动设计思想 分离 二 示例代码 三 操作步骤如下 前言 在上一篇内容中 书写了一个设备驱动程
  • 0.嵌入式控制器EC实战 Embedded Controller开发概述

    文章目录 1 嵌入式控制器EC概述2 EC芯片框图 xff08 IT8502为例 xff09 3 General Purpose I O Port GPIO 4 SMBus xff08 System Management Bus xff0c
  • 12.嵌入式控制器EC实战 SMBus概述

    文章目录 SMBus概述 ACPI规范中的函数返回值含义 SMBus h中的宏定义含义 EC中SMBus各个读写函数分析 bRWSMBus读写函数 在嵌入式控制器EC中 SMBus的起到的作用有两个 第一个是通过SMBus读取智能电池中的相
  • Win10下开机自动启动运行bat脚本并打开cmd运行命令

    场景 xff1a 本菜鸟有一台工作站安装了windows10操作系统 xff0c 机器设置的是开机自动启动 xff0c 但是维护人员无法一直在机房 xff0c 一旦机房断电重启就会导致工作站中运行的程序无法重新启动 xff0c 需要维护人员
  • 银河麒麟V10系统 syslog和kern.log文件过大问题解决,定时清理日志文件

    文章目录 1 新建clear log sh脚本文件 2 设置cron任务 3 解决不执行的方法 需求 在使用银河麒麟V10系统时 var log kern log 和 var log syslog两个文件随着使用的时间增长会一直增大 最后可
  • 2.龙芯2k1000 linux3.10内核编译过程

    龙芯2k1000 linux3 10内核编译过程 文章目录 龙芯2k1000 linux3 10内核编译过程 xff08 一 xff09 在Ubuntu环境下载并配置交叉编译链 xff08 二 xff09 下载linux3 10内核源码 x
  • Vulkan实战之逻辑设备和队列

    文章目录 介绍指定要创建的队列指定使用的设备特性创建逻辑设备检索队列句柄最终代码 介绍 在选择要使用的物理设备之后 xff0c 我们需要设置一个逻辑设备来与它接口 逻辑设备创建过程类似于实例创建过程 xff0c 并描述了我们想要使用的特性
  • Vulkan实战之Window surface

    文章目录 创建window surface查询演示支持创建surface队列最终代码 由于Vulkan是一个平台无关的API xff0c 因此它不能自己直接与窗口系统接口交互 为了在Vulkan和窗口系统之间建立连接并将结果显示到屏幕上 x
  • 飞腾UEFI配置GPIO—飞腾FT2000/4 (D2000/8) GPIO引脚配置及使用

    文章目录 一 FT2000 4 GPIO介绍 GPIO 接口信号说明 专用GPIO GPIO0 A1 GPIO0 A7 SCI 介绍 二 UEFI下配置GPIO相关寄存器 GPIO相关相关引脚功能配置说明 UEFI配置GPIO相关代码 UE
  • stm32-sbus数据接收,并通过CAN转发给车辆控制

    1 xff09 串口程序 代码如下 xff1a span class token macro property span class token directive hash span span class token directive
  • 基于stm32的无线多点温度采集系统设计

    本科时候做过关于ds18b20温度传感器的课程设计 xff0c 当时好像是先用单片机A采集温度 xff0c 其中用矩阵键盘设置报警值 xff0c 然后通过232串口将温度值传给单片机B xff0c 单片机B上的数码管显示 xff0c 同时单
  • 无刷电机和桨叶的选择

    无刷电机和桨叶的选择 无刷电机的kv值越高 就要配越小的螺旋桨 简单说 高kv配小桨 低kv配大桨 无刷电机KV值定义为 转速 V xff0c 意思为输入电压增加1伏特 xff0c 无刷电机空转转速增加的转速值 由此无刷电机电压的输入与电机
  • Intel RealSense Win10+QT+Cmaker 开发环境搭建

    文章目录 一 Intel RealSense SDK开发工具下载安装二 QT 43 CMaker配置Intel RealSense SDK2 0开发环境 一 Intel RealSense SDK开发工具下载安装 从官方github上下载S
  • NVIDIA Jetson不同系列对比

    文章目录 一 NVIDIA Jetson介绍二 NVIDIA Jetson模组比较 一 NVIDIA Jetson介绍 NVIDIA Jetson 是世界领先的平台 xff0c 适用于自主机器和其他嵌入式应用程序 该平台包括 Jetson
  • SLAM笔记五——EKF-SLAM

    上一节主要讲解了EKF的基本原理 xff0c 这一次主要关注如何将EKF算法应用在SLAM上 EKF SLAM 现在的问题就是解决下面这个概率分布的估计问题 xff1a 阴影部分为未知 这里我们需要确定均值和方差到底是什么 xff1f 假设
  • HTTP协议-报文解析

    概述 HTTP xff08 超文本传输协议 xff09 是一个基于请求与响应模式的 无状态的 应用层的协议 xff0c 常基于TCP的连接方式 HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成 请求消息和响应消息的组成 xff1