01 概述

客户端与服务器端之间的通信,通过HTTP协议,以HTTP报文的形式来实现数据的交互。

HTTP报文是HTTP通信时发送的数据块,本文主要从以下几个方面介绍HTTP报文:HTTP报文结构、方法、状态码、首部。

02 报文结构

HTTP报文由三部分组成:状态行(请求行 | 响应行)、首部主体。也有些书籍说是由首部和主体两部分组成,状态行包含在首部中,但绝大多数的说法是由三部分组成。

 
 

HTTP报文可以分为请求报文和响应报文;请求报文向服务器传达请求,响应报文将请求的结果返回给客户端。以下两图,分别是请求报文以及响应报文的结构图。

 
 
 
 

HTTP报文以状态行开始,跟在后面的是HTTP首部,首部由多个首部字段构成,每行一个首部字段;HTTP首部后是一个空行,然后是报文主体。

可以看到,状态行和首部中的每行都是以回车符(\r,%0d,CR)和换行符(\n,%0a,LF)结束,这是因为HTTP规范中行应该使用CRLF结束。另外,首部和主体之间由一空行隔开,或者可以理解为HTTP首部的最后一个字段有两个CRLF。

与状态行和首部不同的是,主体是可选的,也就是说报文中不一定要有主体;另外状态行和首部是ASCII文本,主体可包含文本或二进制数据。

以上就是HTTP报文的大概结构,下面分别对这三部分进行简要描述。

状态行

HTTP报文以状态行开始,请求报文中的状态行叫请求行,响应报文中的状态行叫响应行。

请求行由请求方法URL协议版本组成,这些字段都由空格分隔。

 
 

请求行表明要对哪个资源执行哪个方法,具体有哪些请求方法,文章后面会详细介绍。

响应行由协议版本状态码原因短语(状态码描述)组成。这些字段同样都由空格分隔。

 
 

响应行表明了服务器对请求的处理结果,由状态码体现。值得注意的是,原因短语是数字状态码的可读版本,描述数字状态码的含义,便于人理解,只对人有意义,因此以下两种响应行都会被当作成功处理。

HTTP/1.0200NOT OK

HTTP/1.0200OK

HTTP协议将状态码分成了5类,在下面的章节中会详细介绍。

另外请求行和响应行中都包含HTTP版本号,其格式为

HTTP/<major>.<minor>

major是主版本号,minor是次版本号,使用版本号的目的是规范双方之间通信的格式。

首部

HTTP首部由多个首部字段构成,旨在向报文中添加一些通信过程中所需的重要信息。具体细节文章后面会介绍。

主体

报文主体包含了HTTP所要传输的内容,但并不是所有的报文都有主体。

03 方法

状态行部分讲到请求行中包含请求方法字段,请求方法告诉服务器要做什么。下图是HTTP规范中目前已定义的方法,红框中的是比较常用的方法。

 
 

注意,不是所有的服务器都会实现这些方法,一般都会实现GET和POST方法。另外,请求方法需要大写。

GET

GET:获取/查询资源。是最常用的HTTP方法,常用于请求URL指定的资源,服务端经过处理将资源返回给客户端。

比如访问百度首页,请求包如下,百度的服务器收到请求后,将百度首页返回给浏览器。

 
 

有时请求会传递一些参数给服务器,在GET方法中,这些参数会被包含在URL中,放在文件路径后面,用“ ? ”分隔,被称为查询字符串。查询字符串以键值对的形式存在,每个参数的键和值用“=”连接,不同参数之间用“&”符号连接。(详情请看URL格式)

百度搜索google,抓包可以发现,google被当成了word参数的参数值,放在请求行的URL字段中。

 
 

特意将请求报文全选,大家可以看到,首部字段下方有一空行,然后空行下面有一光标,这再次体现了HTTP报文的结构,也告诉大家,GET请求是不包含请求主体的。

POST

POST:传输实体主体。常用于向指定资源发送数据,指定的资源会对数据进行处理,然后将处理结果返回给客户端。数据被包含在请求主体中,一般用于表单提交、文件上传等。

 
 

以上是登录时的请求包,请求主体中包含了用户名、密码、验证码、是否记住用户名的参数数据,服务器接收到请求后,会交给index.php文件去处理,然后会返回一个处理结果,可能是登录失败,也可能是跳转到系统内部。

可以看到,这些数据的格式和查询字符串的格式一致,Content-Type字段值为application/x-www-form-urlencoded,这是POST提交数据的几种格式之一,POST提交数据的几种格式会在以后的文章中介绍。

当然,GET方法也可以用来传输数据,但是首先URL的长度受浏览器、服务器、操作系统影响,其次是GET方法提交的参数都会在地址栏中显示出来,不安全,因此涉及到大量数据、敏感数据的时候,一般采用POST方法。

HEAD

HEAD:获取报文首部。HEAD方法和GET方法很像,但服务器接收到HEAD请求时,在响应中只会返回报文首部,不会返回报文主体。常用于测试请求资源是否存在或是否被修改。

 
 

GET请求,除了返回报文首部,还返回了主体,经浏览器解析,成为我们眼中的百度首部。

 
 

HEAD请求,只返回首部,没有主体。

OPTIONS

OPTIONS:查询资源支持的方法。用于查询URL指定的资源支持哪些方法,资源支持哪些方法,会在响应包的Allow字段中显示。

 
 

PUT

PUT:传输文件。服务器会将请求主体的内容保存到URL指定的资源位置,包含两种情况:URL指定的资源不存在和URL指定的资源存在。

 
 

如果URL指定的资源不存在,服务器会新建一个文件,将请求主体中的内容保存到新建的文件里,响应码为201。

 
 

如果URL指定的资源存在,服务器会重置文件内容,用请求主体中的内容覆盖原文件内容,响应码为200或204。

需要注意的是,PUT方法自身不带验证机制,任何人都可以执行,存在安全问题,所以网站一般不会使用PUT方法。

DELETE

DELETE:删除文件,删除URL指定的资源,和PUT相反。

 
 

文件删除成功,响应码为204。

 
 

若删除的文件不存在,响应码为404。

和PUT一样,DELETE方法同样不带验证机制,所以网站一般也不使用DELETE方法。

TRACE

TRACE:路径追踪。主要用于诊断,让服务器将收到的请求放在响应主体中,环回给客户端,这样客户端就可以判断发出的请求是否被请求/响应链(在客户端和服务器端之间,请求可能会经过代理、网关、防火墙等应用程序)篡改。

TRACE请求不能带有实体的主体部分,TRACE响应的实体主体包含服务器收到的请求。

 
 

以上都是方法没被禁用时的响应,如果方法被禁用,响应码为405。

 
 

HTTP是可扩展的。除了使用HTTP/1.1规范中定义的方法,有的扩展还定义了一些新的方法,被称为扩展方法。

以下是WebDAV HTTP扩展包含的方法。

 
 

04 状态码

请求方法告诉服务器要做什么,状态码则告诉客户端,服务器对请求的处理结果:是正常处理了请求,还是出现了错误。HTTP状态码被分成了以下5类。

 
 

1xx——信息提示

1xx响应表明服务器端正在处理客户端发过来的请求。

 
 

2xx——成功

2xx响应表明服务器端正常处理了客户端发过来的请求。

 
 

常用的有:

200(成功)、201(已创建)、204(无内容)、206(部分内容)

3xx——重定向

3xx响应表明客户端请求的资源的位置发生了改变,要完成请求,需进一步操作。

 
 
 
 

常用的有:301(永久移动)、302(临时移动)

4xx——客户端错误

4xx响应表明客户端发过来的请求有问题,服务器无法处理。

 
 
 
 

常用的有:

400(语法错误)、401(未认证)、403(禁止访问)、404(未找到)、405(方法禁用)

5xx——服务器错误

5xx响应表明服务器自身出了问题,处理不了客户端发过来的请求。

 
 
 
 

常用的有:500(服务器错误)、502(网关错误)

05 首部

HTTP首部由多个首部字段构成,旨在向报文中添加一些通信过程中所需的重要信息。

从本质上来说,首部字段是名/值对,由字段名和字段值组成,中间用冒号“ : ”隔开,字段值前可包含一个空格。每一行一个首部字段,由CRLF结束行。注意,首部应该以空行(单个CRLF)结束,即使没有主体。

首部字段名: 字段值

根据用途,HTTP首部字段被分为4类:通用首部、请求首部、响应首部、实体首部。

首部字段不一定都是HTTP/1.1规范定义的,其中,HTTP/1.1规范中定义的首部字段只有47种。下列表格中的都是HTTP/1.1规范定义的首部字段。

通用首部

请求报文和响应报文都可以使用的首部。

 
 

请求首部

请求报文使用的首部。

 
 

响应首部

响应报文使用的首部。

 
 
 
 

实体首部

实体使用的首部。

 
 

HTTP首部除了使用HTTP/1.1规范中定义的首部字段,还会使用其他RFC中定义的首部字段,比如Cookie、Set-Cookie等。

作者:安全小白团
链接:https://www.jianshu.com/p/30330e9fdae4
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

(前言一)HTTP报文的更多相关文章

  1. fiddler抓手机报文的配置指南

    前言 1.fiddler大名鼎鼎的抓包工具,而且支持重发,自动解码报文之类. 2.做爬虫时经常遇到需要抓移动端(手机/pad等)报文的情况. 网上各种资料比较,下面这篇是最准确的,转载自csdn:ht ...

  2. Java 用HTTP的方式发送JSON报文请求

    前言: 项目调用第三方接口时,通常是用socket或者http的通讯方式发送请求:http 为短连接,客户端发送请求都需要服务器端回送响应,请求结束后,主动释放链接.Socket为长连接:通常情况下S ...

  3. Jaxb对xml报文头的小修小改

    前言: 也是在实际工作中, 借助jaxb来实现xml到java对象的映射转换. 在实际应用中, 也遇到了一些有趣好玩的东西, 权当记录下来. 本文主要讲解jaxb如何生成约定的xml报文头的实现思路, ...

  4. 计算机网络 之 TCP协议报文结构

    前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱.于是上网查找大量的资料,期间偶然发现了roc大神的博客,很喜欢他简明易懂的博文风格.本文受roc的< ...

  5. TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握

    如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...

  6. 使用FreeHttp任意篡改http报文 (FreeHttp使用及实现说明)

    本文转自:https://www.cnblogs.com/lulianqi/p/10428551.html 前言 FreeHttp是一个Fiddler插件借助FreeHttp您可按照您自己的设定修改请 ...

  7. 欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等

    前言 – Fins欧姆龙这个协议网上极少有相关的模拟器.Tcp的这一块倒是有但是Udp的基本都是不可用 1. Fins协议结构也很简单 协议分为两种 一种tcp一种udp 2. Tcp比Udp的报文会 ...

  8. 借助FreeHttp任意篡改Websocket报文(Websocket改包)

    前言 作为Web应用中最常见的数据传输协议之一的Websocket,在我们日常工作中也势必会经常使用到,而在调试或测试中我们常常也有直接改变Websocket数据报文以确认其对应用的影响的需求,本文将 ...

  9. 为何GRE可以封装组播报文而IPSEC却不行?

    Author       : Email         : vip_13031075266@163.com Date          : 2021.01.24 Copyright : 未经同意不得 ...

随机推荐

  1. Mysql 常用数据库操作

    一.数据库操作: 1.查看数据库: >SHOW DATABASES; 2.创建数据库: >CREATE DATABASE db_name; //db_name为数据库名 3.使用数据库: ...

  2. C# 数据操作系列 - 7. EF Core 导航属性配置

    在上一篇,大概介绍了Entity Framework Core关于关系映射的逻辑.在上一篇中留下了EF的外键映射没有说,也就是一对一,一对多,多对一,多对多的关系等.这一篇将为大家细细分析一下,如何设 ...

  3. 「雕爷学编程」Arduino动手做(18)---太阳能电池模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  4. noi7219 复杂的整数划分问题

    noi7219 复杂的整数划分问题 #include <bits/stdc++.h> using namespace std; ; int dp1[maxn][maxn], dp2[max ...

  5. flask之jinjia2模板语言

    flask_jinjia2.py ''' flask中的jinjia2模板语言(和django中模板类似): (1)模板变量{{ }} (2)模板标签{% %} ①for循环遍历 {% for foo ...

  6. js 获取table tr td内的select 和input text

    $("#TableList tr").each(function () {                //for (var i = 1; i <= AM_index; i ...

  7. 王艳 201771010127《面向对象程序设计(java)》第十六周学习总结

    一:理论部分 1.程序:是一段静态的代码,它是应用程序执行的蓝本. 2.进程:是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 3.多线程:是进程执行过程中产生的多条执行线索. ...

  8. 蓝桥杯 试题 历届试题 发现环 并查集+dfs

    问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使 ...

  9. 学习ASP.NET Core(08)-过滤搜索与分页排序

    上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志:本章我们将介绍过滤与搜索.分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的使用 ASP.NET Core 3 ...

  10. shiro的使用详解~

    在家无聊复习一下shiro 打开了之前的项目,由于lombok插件安装不了,不知道idea抽什么风所以get,set方法报错了,将就一下 只看shiro的使用,配置在shiro分类中有 登录方法 pa ...