以前写过一篇博客,叫做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. Hadoop:什么是Hadoop??

    官方讲解: Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件.Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据). ...

  2. buu SCTF Who is he

    1. 下载好附件,发现是unity的题目,找到assembly.dll,用dnspy直接打开干,在引用下面就是实际的代码 2.找到了核心代码,发现逻辑也挺简单的, 输入的text,要和一串字符串进行b ...

  3. linux学习之路第三天

    开机,重启和用户登陆注销 关机&重启命令 shutdown shutdown -h now :表示立即关机 shutdown -h 1 :表示一分钟后关机 shutdown -r now :表 ...

  4. ctf Decode

    这题其实没啥好说的,就是直接解,听学长说好像网上有现成的轮子可以用,我太年轻了,手动写了个decode函数. 也成功得到了flag.嘿嘿开心

  5. LeetCode周赛5214

    我去,暴力超时,没啥人情味了.难受,一看答案,结果是dp的题目... 思路分析: 1.用个表记录下每个数当前的最大长度,同时是等差,说明有上一个数,那么当前的长度就是上一个数最大加一

  6. php微信jsapi支付 支付宝支付 两码合一

    产品开会提出了这样的需求:一个二维码可以微信支付也可以支付宝支付 经过自己的钻研以及询问技术高人(本人代码一般般)和网上搜索 最终实现其功能  我用微信jsapi 和 支付宝网页支付 其实并不怎么难: ...

  7. 多es 集群数据迁移方案

    前言 加入新公司的第二个星期的星期二 遇到另一个项目需要技术性支持:验证es多集群的数据备份方案,需要我参与验证,在这个项目中需要关注到两个集群的互通性.es集群是部署在不同的k8s环境中,K8s环境 ...

  8. 重置networker9.0密码

    一.重置Networker 9.0密码 下面所有步骤在Networker服务器上操作 1.创建"mypassword_in.txt"文件 在服务器C盘根目录下创建一个 " ...

  9. ms17-010 永恒之蓝漏洞复现(CVE-2017-0143)

    0x01 首先对目标机的开放端口进行探测,我们可以使用探测神器nmap 发现开放的445端口,然后进行下一步的ms17-010的漏洞验证 0x02 打开MSF美少妇神器,用search命令搜索ms17 ...

  10. 「CF555E」 Case of Computer Network

    「CF555E」 Case of Computer Network 传送门 又是给边定向的题目(马上想到欧拉回路) 然而这个题没有对度数的限制,你想歪了. 然后又开始想一个类似于匈牙利的算法:我先跑, ...