以前写过一篇博客,叫做HTTP的报文分析:https://blog.csdn.net/ZripenYe/article/details/119593269但是感觉还是不太深入、不够全面,顶多了解个大概。
所以这篇博客更深入,更全面,篇幅自然也更长。


参考书目《Web安全深度剖析》张炳帅

随着时代的反正,C/S模式,即客户端/服务器模式逐渐转变为,B/S模式,即浏览器/服务器模式,现在目前我们大多数访问应用都是在一个浏览器上完成的。
当客户端与web服务器交互的时候,依托于HTTP请求。


HTTP协议解析

  • 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
  • HTTP允许将HTML从web服务器发送到web浏览器

发起HTTP请求

  • 如何发起一个HTTP请求?只需要输入一个URL,并且按回车就可以发送HTTP请求了。
  • 统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址)俗称网页地址,简称网址,是因特网上标准的资源的地址(Address),如同在网络上的门牌。
  • 统一资源定位符的标准格式如下:
[协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
比如:
http://www.abc.com:8888/post/max.php?id=33
  • 我们可以借助浏览器发送HTTP请求,不借助浏览器也可以,比如Linux下的curl命令。严格来说,浏览器也是HTTP工具的一种

  • Windows中没有curl,需要下载curl.exe也可以达到命令行访问url

  • 也可以使用python爬虫脚本来实现url的访问,比如:https://blog.csdn.net/ZripenYe/article/details/119463072

  • 脱离浏览器观察服务器响应的数据,你可以发现,就某些方面而言,浏览器只不过多了HTML渲染功能而已。

HTTP协议详解

  • 目前普遍使用的时HTTP1.1的版本
  • HTTP是一个无状态的协议。
  • 无状态是指Web浏览器和Web服务器之间不需要建立持久的链接
  • 就意味着客户端发送请求到服务器发送响应之后,连接就被关闭了,在服务器端不保留连接的有关信息。
  • 也就是说,HTTP请求只能由客户发起,服务器不能主动发起
  • HTTP遵循请求(Request)和响应(Response)模型:

HTTP的请求与响应:

HTTP的请求
  • HTTP的请求有三部分:请求行(请求方法)、请求头(消息报头)、请求正文。
  • HTTP请求报文的第一行即为请求行由三部分组成:
    • 第一部分说明这是:POST请求
    • 第二部分说明是请求该域名根目录下的 login.php文件
    • 第三部分说明这是HTTP 1.1版本
  • 第二行到空白处即为请求头,也称作消息头,一般含有很多元素
    • HOST代表请求的主机地址
    • Uer-Agent代表浏览器的标识。请求头由客户端自行决定,后面会详细解释各个元素
  • 空白之后是请求正文,请求正文是可选的,它最常出现在POST请求中
HTTP的响应
  • HTTP响应也由三部分组成:响应行、响应头(消息报头)、响应正文(消息主题)
  • 第一行是响应行,由HTTP版本、状态码、以及消息“OK”
  • 第二行到空白行是响应头,由服务器向客户端发送
  • 从空白到结尾叫响应正文,是服务器向客户端发送的HTML代码

HTTP请求方法

HTTP请求方法非常多,常见的有GET和POST

GET方法
  • get方法用于获取请求页面的指定信息,以实体的格式。
  • 如果请求资源为非HTML,那么返回的是web容器解析之后的HTML源代码,而不是源文件。
  • 比如请求index.jsp,返回的不是index.jsp源文件,而是解析之后的源代码
  • 如下HTTP请求:
  • 可以看到,使用GET请求index.php,并且id的参数为1.
  • 在服务器端脚本中可以选择性接收这些参数,意思就是,如果你是index.php/id=1&name=a,有可能没有接收name元素的代码,服务器就不会理会你多加入的内容,并且去查询数据,以完成一次HTTP请求。
HEAD方法
  • HEAD方法不会返回消息主体,其余和GET一样
  • 这种方法一般用来测试链接的有效性、可访问性和最近的改变
  • 不用返回消息主题,使得报文的大小减少,加快的响应速度,效率更高
POST方法
  • POST方法与GET方法类似,但是GET方法没有请求内容,而POST方法有请求内容。
  • POST请求多用于向服务器发送大量的数据。
  • GET虽然也能发送,但是URL的长度是有限制的,并且GET发送的数据会显示在浏览器端,而POST不会,所以POST的安全性更高
  • 例如,下面是一个经典的POST请求:
  • 这个POST请求传递了参数user和pw
PUT方法
  • PUT方法用于把请求中的实体存储在请求资源下

    • 如果请求资源在服务器中存在,则替换
    • 如果请求资源在服务器中不存在,则创建这个资源
  • 如这个粗糙的图所示,PUT会请求input.txt,如果存在,则修改,不存在,创建input.txt,内容是123456
  • 因为这个可以直接在服务器上创建文件,服务器一般会关闭PUT方法,防止恶意攻击
DELETE方法
  • 请求删除服务器的指定资源
  • 一般几乎不可能在公网上看到能开这个方法的服务器
TRACE 方法
  • 很少见
  • 用来回显服务器收到的请求
  • 就是一般用来了解服务器另一端的情况,利用这些数据进行诊断
CONNECT方法
  • HTTP 1.1 保留CONNECT方法
  • 用于能动态切换到隧道的代理
OPTION方法
  • 请求获得URL标识的资源在请求/响应的通信过程中 可以使用的功能选项
  • 少见

更多方法请百度搜索,(谁知道CTF会出什么稀奇古怪的题目呢)

HTTP状态码

状态码用来描述服务器的响应信息,非常重要
有以下5种状态码:

  • 1xx:提示,表示已经成功接收,范围是100~101
  • 2xx:成功,服务器成功处理请求:范围200~206
  • 3xx:重定向,表示告诉浏览器访问的资源被移动,并告诉浏览器新的位置,这个时候浏览器将对新位置发送请求:范围 300~305
  • 4xx:错误,各种各样的错误出现,常见的是URL错误:范围: 400~415
  • 5xx:Web服务器错误,4开头的错误来源是用户,5开头的来源一般都是服务器本身,范围 500~505

常见状态码:

  • 200:请求成功,万事大吉
  • 302:重定向
  • 404:请求资源不存在
  • 400:请求有语法错误,服务器无法解析
  • 401:没有权限的请求
  • 403:服务器接收到请求,但是拒绝服务
  • 500:服务器内部错误
  • 503:服务器当前不能处理请求,可能过段时间恢复正常。

HTTP消息

HTTP消息又称HTTP头:分别有请求头、响应头、普通头和实体头,从名称上看我们可以知道它所处位置:

请求头:

请求头只在HTTP请求种,向服务器传递请求的附加信息和客户本身信息

  • Host:Host请求报头域主要用于被请求资源的Internet主机和端口号,比如www.abc.com:8080
  • User-Agent: 将客户自身的操作系统,浏览器和其他属性告诉服务器。服务器可以针对这些信息做出响应(或者记录)
  • Referer:这个值是一个URL,代表当前访问URL的上一个URL,也就是说,客户是从什么地方来到的本页面,比如一个购物网站,用户可能是从登录页面来的,那么 Referer:www.shop.com/login.php
  • Cookie:表示身份,老生常谈了
  • Range:Range表示可以请求的实体部分内容,多线程下载会用到此请求头。
  • x-forward-for :即xxf头,它代表请求端的IP,可以有多个,以逗号隔开,比较重要
  • Accept:指定客户端接收哪些MIME类型的信息,比如Accept:text/html 表示客户端希望接收HTML脚本
  • Accpet-Charset :指定客户端接收的字符集,比如值为utf-8.如果没有设置,说明任何字符集都可以被接收
响应头
  • Sever :服务器使用的呃Web服务器名称,比如值为Apache或者Nginx
  • Set-cookie:向客户端设置Cookie,通过此头,可以清楚得看到服务器向客户端发送的Cookie
  • Last-Modified:告诉浏览器,资源的最后修改时间
  • Location:服务器通过这个头告诉浏览器去访问哪个页面,然后浏览器接收到后会立即去访问那个页面,和状态码302重定向搭配使用。
  • Refresh:告诉浏览器定时刷新浏览器
普通头

这些报头域用于所有的请求和响应消息,但是并不用于被传输的实体,只用于传输的消息。例如

  • Date:表示消息产生的时间
  • Connection:允许发送指定连接的选项
  • Cache-Control:指定缓存指令
    普通报头了解就可
实体头:

请求和响应报文都可以传送一个实体头
实体头定义了关于实体正文和请求所标识的资源的元信息。
元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等等
常见的实体头如下:

  • Content-Type:用于向接收方指示实体的介质类型。
  • Content-Encoding:指示已经被应用到实体的附加内容的编码
  • Content-Length:用于指明实体正文的长度,以字节的方式存储十进制数字表示
  • Last-Modified:指示资源最后一次修改的日期和时间

深入理解HTTP请求流程的更多相关文章

  1. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  2. 使用反向代理的http的请求流程

    此文章主要为刚接触反向代理的小伙伴梳理请求流程,以便更好的理解反向代理是何时工作的 流程 由于浏览器是有缓存的,所以本地的hosts文件的信息也会在浏览器端缓存 当客户端发起一个新的请求(例如:输入的 ...

  3. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  4. flask源码剖析--请求流程

    想了解这篇里面的内容,请先去了解我另外一篇博客Flask上下文 在了解flask之前,我们需要了解两个小知识点 偏函数 import functools def func(a1,a2): print( ...

  5. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程1

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  6. DRF之REST规范介绍及View请求流程分析

    编程是数据结构和算法的结合,而在Web类型的App中,我们对于数据的操作请求是通过url来承载的,本文详细介绍了REST规范和CBV请求流程. 编程是数据结构和算法的结合,小程序如简单的计算器,我们输 ...

  7. 《浏览器工作原理与实践》<03>HTTP请求流程:为什么很多站点第二次打开速度会很快?

    一个 TCP 连接过程包括了建立连接.传输数据和断开连接三个阶段. 而 HTTP 协议,正是建立在 TCP 连接基础之上的.HTTP 是一种允许浏览器向服务器获取资源的协议,是 Web 的基础,通常由 ...

  8. Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例

    前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web 应用),这便是SpringMVC:Spring MVC是Spri ...

  9. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

随机推荐

  1. php 经典的算法题-偷苹果

    有5个人偷了一堆苹果,准备在第二天分赃.晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了.没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的 ...

  2. vm虚拟机无法与本地ping通

    打本地靶场,发现无法找到localhost,而且也ping不通,当时挺迷的,所以百度了一下方法,以下是内容: 一.解决方式 1. 2.点击设置 3. 4. 点击nat模式 5. 通了, 二.nat模式 ...

  3. 《PHP安全编程系列》系列分享专栏

    PHP安全编程系列收藏夹收藏了有关PHP安全编程方面的知识,对PHP安全编程提供学习参考 <PHP安全编程系列>已整理成PDF文档,点击可直接下载至本地查阅https://www.webf ...

  4. buu [V&N2020 公开赛]strangeCpp

    拖入ida,静态调试一下,本来想动调的,发现一直缺dll.没办法,只能头铁,静态 找到主函数,然后并没有发现什么,找了半天,没结果,后面也是看了大佬wp,才找到解决方式,感觉这种只能通过动调来找到关键 ...

  5. 入门Kubernetes-minikube本地k8s环境

    前言: 在上一篇 结尾中使用到了minikube方式来做k8s本地环境来学习k8s. 那么这篇先了解下minikube及使用 一.Minikube 简介 minikube 在 macOS.Linux ...

  6. 团队开发day09

    web端的数据成功存储,但是和android端的数据获取到的数据不适配, 进行数据之间的适配. 遇到问题:在安卓中glide不能解析png图片,于是修改二进制流的转化,将png先转化为jpg 再存入到 ...

  7. [009] - JavaSE面试题(九):集合之Set

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [009] - JavaSE面试题(九):集合之Set 第1问:List和Set的区别? List ...

  8. POJ 树的直径和重心

    树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...

  9. C标准库学习

    前言 C标准库源码可通过下列两个网站进行查看:The GNU C Library.Welcome to uClibc-ng! - Embedded C library 以下学习记录也是以这两个网站提供 ...

  10. 开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

    写在前面 聊一聊MyBatis是如何使用装饰者模式的,顺便回顾下缓存的相关知识,可以看看右侧目录一览内容概述. 装饰者模式 这里就不了它的概念了,总结下就是套娃.利用组合的方式将装饰器组合进来,增强共 ...