zoukankan      html  css  js  c++  java
  • HTTP协议详解

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
    HTTP协议的主要特点可概括如下:
    1.支持客户/服务器模式。

    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常       用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

     http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

    浏览器访问服务器的简单流程:
     
     
     
     
    我们举一个简单的例子,例如我们在浏览器的地址栏中输入http://www.baidu.com时,会出现百度的首页;按F12可以查看请求和响应;
     

     
     
     
    二、HTTP协议数据包的抓取
     
    如果需要抓取HTTP协议的数据包,可以使用HttpWatch或者Fiddler
    HttpWatch支持IE和FireFox
    Fiddler则支持各种浏览器,因为其抓取的所有的http协议数据包
    我们使用Fiddler抓一下HTTP的请求和响应
     
     
    三、使用Fiddler抓取我们自己写的简单页面
     



    使用Fiddler抓取的请求报文
     
    使用Fiddler抓取的响应报文
     
     
     
     
    四、HTTP协议详解
     
     
     
    1、一个典型的请求:

    POST http://localhost:8080/Servlet02/login HTTP/1.1  ---> 请求首行
    Host: localhost:8080          ---> 请求头
    Connection: keep-alive
    Content-Length: 28
    Cache-Control: max-age=0
    Origin: http://localhost:8080
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
    Content-Type: application/x-www-form-urlencoded
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Referer: http://localhost:8080/Servlet02/login.html
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.8
    ---> 请求空行

    userName=Shelley&userPwd=123 ---> 请求正文


    2、Request请求的部分:


    请求首行(必须有):POST http://localhost:8080/Servlet02/login HTTP/1.1


             |-- 方法:GET、POST、HEAD、DELETE、PUT、TRACE、OPTIONS
             |-- 请求 URL
             |-- 协议名称/版本号


    请求头(一般来说都有):
    Host: localhost:8080                    //要访问的服务器 : 服务器名:端口号
                           Connection: keep-alive               // 保持连接,是 HTTP/1.1 版本特有,1.0版本每次都需要建立一个连接,1.1 是对1.0的优化
                           Content-Length: 28                     // 指请求正文的长度(byte)
                           User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36                                                       //客户端的信息
    Content-Type: application/x-www-form-urlencoded     // 请求正文类型
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8   //能接收的响应正文类型:MIME
    Referer: http://localhost:8080/Servlet02/login.html        //指明请求由哪个路径发起(来源统计、防止盗链)
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.8


    请求空行:分隔请求头和请求正文的作用。因为每次请求的请求头的数量可能不一样,所以需要这样空行来标识请求头结束


    请求正文:只有POST请求才会有请求正文。如果是GET方式,会把参数放到查询字符串去。
    userName=Shelley&userPwd=123 

     
     
    GET跟POST的区别:GET的参数会作为URL的Q ueryString提交,而POST的参数会作为请求正文提交
     
     
     
    五、更深层次解读HTTP协议
     
     
     
     
    请求首行、请求空行和请求正文
     
    GET:请求方式
    http://localhost...:请求路径
    HTTP/1.1:请求协议以及版本,1.1与1.0之间的区别在于1.0一次请求一次连接,1.1可以多次连接,默认保持3000ms
    请求空行:作为请求头与请求正文之间的空行
    请求正文:如果请求方式为POST则有请求正文,正文中包含的就是请求的参数,如果请求方式为get则没有正文,参数可以通过URL传递
     
    请求头详解:
    HOST:请求主机名与端口号
    Connection:保持连接,与http的协议版本相关,如果是1.0,则没有。
    Content-Length:正文长度
    User-Agent:用户代理,指的是用户所使用的机器与浏览器信息,如果见过显示你系统与浏览器的信息的图片,甚至你所在位置,   天气预报,没错,就是用这个,以及访问IP来制作的。
    Content-Type:表单数据类型。
    Accept:接受资源类型,可以有多个,有优先级。
    Referer:请求来源网站,可以使用在搜索统计,防盗链等。
    Accept-Encoding:代表可以接受的压缩类型,早期传输速度很慢时,文本压缩率高,通常会做压缩。
    Accept-Language:接收语言类型。
    Cookie:网站服务器在客户端保存的相关信息。与信息泄露相关。
     
     
     
     
     
     
    响应首行、响应空行、响应正文
    HTTP/1.1:协议号/版本
    200 OK:状态码 描述。
    常见响应状态码:
    状态码、描述:
    200:成功
    404:资源找不到
    500:服务器错误
    302:重定向
    304:缓存获取
    响应空行:分割作用
    响应正文:网页的html文档
     
    响应头详解:
    Server:服务器信息
    Accept-Ranges:断点下载相关属性,bytes如果有值,则从对应位置开始下载
    ETag:URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。
    LastModified:最后修改时间,和缓存相关,与返回码304相关
    Content-type:响应正文类型
    Content-Length:正文长度
    Date:返回时间
    Expires:-1/Cacje-Control:no-cache/Pragma:no-cache:不缓存,有多个原因是因为不同浏览器设置不同。
    Refresh:自动刷新响应,各种广告。
    Set-Cookie:往客户端写入cookie。

    HTTP协议相关技术补充

        1、基础:
        高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等
    中介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel),一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。
         代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。
    网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
    网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
        通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。

    2、协议分析的优势—HTTP分析器检测网络攻击
    以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。
    HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定

    3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击
    使用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,例如ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。这种攻击方法基本不会留下痕迹。
    http://www.cnpaf.net/Class/HTTP/0532918532667330.html

    4、利用HTTP协议的特性进行拒绝服务攻击的一些构思
    服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYNFlood攻击(SYN洪水攻击)。
    而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。
    19端口在早期已经有人用来做Chargen攻击了,即Chargen_Denial_of_Service,但是!他们用的方法是在两台Chargen 服务器之间产生UDP连接,让服务器处理过多信息而DOWN掉,那么,干掉一台WEB服务器的条件就必须有2个:1.有Chargen服务2.有HTTP 服务
    方法:攻击者伪造源IP给N台Chargen发送连接请求(Connect),Chargen接收到连接后就会返回每秒72字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。

    5、Http指纹识别技术
       Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识别.
          要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服务器,用户可以在源代码里修改Banner信息,然 后重起Http服务就生效了;对于没有公开源代码的Http服务器比如微软的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的.另外一种模糊Banner信息的方法是使用插件。
    常用测试请求:
    1:HEAD/Http/1.0发送基本的Http请求
    2:DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求
    3:GET/Http/3.0发送一个非法版本的Http协议请求
    4:GET/JUNK/1.0发送一个不正确规格的Http协议请求
    Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它可以被用来收集和分析不同Http服务器产生的签名。

    6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。
    HTTP1.1中提供了这种持续连接的方式,而下一代HTTP协议:HTTP-NG更增加了有关会话控制、丰富的内容协商等方式的支持,来提供
    更高效率的连接。

  • 相关阅读:
    spring下配置shiro
    web.xml文件配置说明
    spring中配置缓存—ehcache
    applicationContext.xml配置简介
    spring task定时器的配置使用
    spring配置数据库连接池druid
    Mybatis使用pageHelper步骤
    mybatis-generator和TKmybatis的结合使用
    PHP删除一个目录下的所有文件,不删除文件夹
    nodejs学习
  • 原文地址:https://www.cnblogs.com/jack1989/p/7519735.html
Copyright © 2011-2022 走看看