HTTP协议-报文解析
概述
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息的组成:
- 开始行(对于请求消息,开始行就是请求行;对于响应消息,开始行就是状态行)
- 消息报头(可选)
- 空行(只有CRLF的行)
- 消息正文(可选)组成。
一、请求报文
http请求由四部分组成:
- 请求行
- 消息报头/请求头
- 空行
- 请求正文
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 | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | HTTP/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响应由四部分组成:
- 状态行
- 消息报头/响应头
- 空行
- 响应正文
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 两者区别
- 请求数据的形式
- GET:请求的数据会附在URL之后,以 ? 分割URL和传输数据,多个参数用 & 连接。
- POST:把提交的数据放置在是HTTP包的请求数据中,即请求正文。
- 传输数据的大小
- GET:特定浏览器和服务器对URL长度有限制,GET提交时,传输数据就会受到URL长度的限制。
- POST:由于不是通过URL传值,理论上数据不受限。
- 安全性
POST的安全性要比GET的安全性高。
HTTP协议-报文解析相关推荐
- ModbusTCP协议报文解析
ModbusTCP协议报文解析 报文格式 交互(通信)标识:2个字节 为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文. 协议标识:2个字节 表示该条指令遵循Modbus ...
- rtsp协议报文解析-首部字段解析
前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...
- 西门子PLC的S7协议报文解析说明
我们以S7的1500系列来查看握手和读取.写入[字Word或者位Bit]命令报文 以下报文不做说明时都是十六进制字节. 西门子PLC需要连接成功后发送两次握手命令方可进行读写通信. 西门子PLC的S7 ...
- HTTP 协议报文解析
本篇主要是为了记录HTTP中报文的格式,以便针对报文进行解析.首先会介绍基础的HTTP报文,之后会介绍 文件上传时的数据报文格式. HTTP基础报文格式 按照HTTP报文类型进行介绍,HTTP报文类型 ...
- SL651协议报文解析(一)
相关所需功能码枚举类请看上篇文章呦~ 先上一些报文方便大家测试解析: 下方都是一些上行报文,如需下行可以私信我 测试报: 7E 7E 10 00 51 14 19 10 00 7B 2F 00 08 ...
- matlab里的xcp报文,xcp协议报文解析
AAddddiittiioonnaall ssooffttwwaarree XCP ((sseerrvviicceess)) ttoo bbee iinntteeggrraatteedd iinn t ...
- HTTP协议报文解析
HTTP(HyperText Transfer Protocol,超文本传输协议) HTTP是一个应用层协议,虽然在2015年已推出HTTP/2版本,并被主要的web浏览器和web服务器支持.但目前使 ...
- TFTP协议报文解析
IP数据报文: IP首部 + UDP报文 UDP报文: UDP首部 + TFTP数据报文 TFTP数据报文: 操作码 + 文件名 + 0 + 模式 + 0 TFTP报文: 2字节 x字节 1字节 x字 ...
- rtsp协议格式解析
前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...
- hj212协议如何和php通讯,HJ212数据传输标准报文解析
HJ212分为2005年(HJ/T212-2005)和2017年(HJ212-2017)的版本,略有不同. 网上没找到非常官方的渠道下载,在这贴一份2017年版本的下载地址 TCP/IP通讯包组成 名 ...
最新文章
- 【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质示例 )
- 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
- linux: 批量修改文件夹及文件夹下文件的名字
- Kinect for Windows SDK开发初体验(二)操作Camera
- linux gpsd 授时原理,app/ntp/gps/README.md · 王者归来/ITTS - Gitee.com
- 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
- js控制按钮n秒后可用
- 大数据分析要避免哪些错误
- [HNOI2016]网络
- 单目标跟踪 Siamese系列网络:SiamFC、SiamRPN、one-shot跟踪、one-shotting单样本学习、DaSiamRPN、SiamRPN++、SiamMask
- 震惊:爱测未来技术嘉年华竟然这些免费送
- 在linux虚拟机中进行jdk1.8的安装与环境变量的配置
- 破解 excel 表格加密 高版本不行
- 算法 所有奇数长度子数组的和
- 32位汇编语言学习笔记(43)-- 生成随机数
- 计算机毕业设计JAVA汽车配件管理系统mybatis+源码+调试部署+系统+数据库+lw
- 网新恒天php,网新恒天,为德邦快递插上数字化翅膀
- 百度翻译金山词霸API
- 大咖面对面 | Crypto C唐晗:元宇宙是加密艺术的最佳生存空间
- 监控平台bosun快速入门
热门文章
- QQxml红包跳转群代码
- php 如何在h5页面中调取手机摄像头,HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题...
- 51单片机8位数码管时钟c语言,51单片机8位数码管电子时钟(完结)
- 微商新手如何选产品?史上最详细操作指南!
- VS创建和使用C++动态链接库教程
- idea 中代码大小写切换快捷键
- 给华南x99打鸡血BIOS教程
- jmeter使用手册
- win7sp1怎么共享计算机,win7怎么升级到sp1?win7可以直接升级win7 sp1版本吗
- 聊天软件开发_3_数据库表设计