HTTP协议学习(1)

旧城冷巷雨未停 提交于 2019-11-30 13:20:10

1. HTTP首部信息格式

    1. 简介:HTTP,即超文本传输协议,是TCP/IP协议模型中的一个应用层协议,用于描述浏览器与服务器之间进行交流的数据的固定格式。浏览器以固定格式将数据打包发送给服务器,服务器以这个固定格式对数据包进行拆包,或者相反进行。HTTP协议中的首部信息为两种,一种是HTTP请求,另一种是HTTP响应。

    2. HTTP协议的请求:客户端发送请求对应的数据格式,请求首部信息包括两部分,主要是请求行、请求头。请求体是数据部分。

  • 请求行:第一个红框内的内容,包括请求方式(get、post等方式),请求地址以及使用的HTTP协议版本。在Restful标准中,每一种请求方式都有着其特殊含义,比如get表示获取资源、post表示发送文本数据、put表示发送文件、delete表示删除文件等等,但开发中我们还是只用到了get以及post
    • get:能传输的数据大小会受到限制,而且传输的参数列表会显示在地址栏,安全性较低。
    • post:能传输的数据大小不会受到限制,传输的参数列表不会显示在地址栏,安全性较高。
  • 请求头:第二个红框内的内容就是请求头,以键值对形式存在,部分请求头字段如下
    • Accept :表示浏览器可以接受的数据形式。
    • Accept-Encoding:浏览器接受的编码格式
    • Content-Type:表示请求中发送的数据类型
    • Accept-Language:浏览器接受的语言类型。
    • User-Agent:当前浏览器版本。通过该请求头可以获取浏览器的版本。
    • Host:接受请求的服务器的ip地址与端口
    • Connection:该请求头表示是否保持TCP连接,默认都会设置为Keep-Alive,因为如果每一个HTTP请求都要建立一次TCP连接的话,代价非常巨大。
    • Referer:该请求头的值会记录这次请求的来源,或者说请求网址,比如说从百度中搜索淘宝后,点击淘宝会进入淘宝页面,Referer 请求头就会记录这次的请求是由那里发起的,这个可以用于防盗链,通过判断该请求头的值,也就是来判断发起该请求的网址来判断是否允许该请求的通过。如果是直接通过浏览器地址栏输入地址,那么该请求头的值就是请求的地址。
    • If-Modified-Since:与304状态码、响应头一起使用,用来控制本地缓存的使用。
    • Keep-Alive:表示TCP连接保持时间
    • Cache-control:控制缓存行为
  • 请求空行:第三个红框,这是必须存在的一个空行
  • 请求正文:提交的请求中包含需要发送给服务端的数据(文本或者文件)。

    3. HTTP协议的响应:服务端做出响应对应的数据格式。响应首部信息为响应行和响应头

  • 响应行:第一个蓝框就是响应行,包括了HTTP协议版本和响应状态码,常见状态码所代表信息如下
    • 100-199:表示请求接收成功,客户端必须继续提交下一次请求才能完成整个处理过程。
    • 200-299:表示成功接受请求并完成一次处理过程。常用200,表示一个请求对应一个响应成功。
    • 300-399:为完成请求,客户端需要进一步细化请求,例如请求重定向用302表示,返回302状态码,同时返回重定向的地址,浏览器自动向该地址发起请求,然后接受重定向地址发回的响应;或304表示服务器资源未改动,通知客户端在本地缓存中查找资源并使用。
    • 400-499:客户端请求出错,常见404表示请求路径无效或找不到请求的资源、400表示请求的格式错误(请求错误)、403表示请求的资源被服务器拒绝访问。
    • 500-599:服务端出错,常用500表示服务器运行出现错误;503表示服务不可用,一般是服务端处于超负载或者停机处理,无法处理请求;
  • 响应头:第二个蓝框就是响应头,包括了一系列的响应头键值对,部分响应头比如
    • Location:该响应头的值就是重定向的地址,与302状态码共同完成重定向。其值的形式如  http://www.baidu.com
    • Last-Modified:该响应头的值表示服务器端被请求资源的最后一次的修改时间,并且保存在浏览器中。请求头中的If-Modified-Since值就是上一次访问时该资源的最后修改时间值,该响应头和请求头If-Modified-Since以及304状态码一起使用,通过这三个值的配合使用可以使浏览器使用本地缓存的文件资源;其值的形式如 
      Last-Modified    Wed, 11 Jul 2018 14:08:18 GMT
    • Refresh:设置该响应头可用于定时页面刷新,或者定时跳转,其值的形式如  1;url=http://www.baidu.com
    • Content-Disposition:用于文件下载
    • 下面三个响应头是一起使用的,用于禁止浏览器的缓存项。
      • Expires     -1
      • Cache-Control     no-cache
      • Pragma      no-cache
  • 响应空行:无用,但是必须有
  • 响应体:就是服务器直接返回的数据资源,比如js文件、html、图片等。

2. HTTP与HTTPS

    1. HTTP存在的问题:通信安全问题,HTTP中的通信时直接明文传输数据,不进行任何加密措施,相当于数据裸奔与网络之中,所以其对于密码、个人信息之类的数据绝对不能用HTTP协议进行传输。

    2. 为了改善HTTP协议的通信安全问题,就出现了HTTPS协议,该协议就是在HTTP协议的基础上,添加一种加密协议对HTTP通信线路进行加密。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL(安全套接层)或TLS(安全层传输协议)协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

即:HTTPS = HTTP + SSL/TLS。SSL或TLS协议主要是建立一条安全的通信线路,还有另一种方式就是仅对传输的数据内容加密,虽然可以保证数据内容无法被他人解析,但无法阻止他人对数据内容的拦截以及修改,所以不使用这种方式。

 

    3. 使用HTTP协议主要有以下三种通信不安全的情况:

(1)通信内容被窃听,对于互联网中的数据其实全都是可以被监听的,完全可以实现针对某个网段的数据包(帧)抓取,然后再将抓取的数据包交给抓包软件进行解析即可,如果内容不加密就可以获取到数据内容。

(2)无法验证通信方的身份,通信方可能伪装身份。接收请求的服务器可能是一个伪装的服务器,并不是请求的真正目标服务器;无法确定服务端返回的响应是否到达了真正的客户端,有可能是伪装的客户端;无法确定对方是否具有访问权限,因为有些特殊的资源是特殊用户的访问权限;无法判断请求来自于谁;即使无意义的请求也会全部接受,无法拒绝海量的DOS攻击。

(3)无法验证传输数据的完整性,有可能数据已被篡改。

3.长连接和短连接

    1. HTTP 对 TCP 连接的使用,分为两种方式:俗称“短连接”和“长连接”(“Keep-Alive”或“Persistent Connection”)
(1)长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive。如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Connection: close。TCP的保活功能主要为服务器应用提供,试图在服务端器端检测到半开放的连接,并根据响应决定是否关闭连接

(2)短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。双方任意都可以发起close操作,不过一般都是client先发起close操作。短连接的优点是管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。

    2. 长连接的数据传输完成识别:判断传输数据是否达到了Content-Length指示的大小;动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。

    3. 长连接的过期时间:

keepalive_timeout 20; --长连接timeout
keepalive_requests 8192; --每个连接最大请求数

    4. 什么时候用长连接,短连接: 

    长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

    5. 设置HTTP长连接,有过期时间:

设置请求头域
在首部字段中设置Connection:keep-alive 和Keep-Alive: timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第58秒时,再次使用此连接,则连接仍然有效,使用完之后,重新计数,空闲60秒之后过期。

设置HTTP长连接,无过期时间;在首部字段中只设置Connection:keep-alive,表明连接永久有效。connection字段只有服务端设置才有效。

connection字段只有服务端设置才有效。

客户端设置Connection: Keep-Alive和Keep-Alive: timeout=60, 服务端设置Connection: Keep-Alive和Keep-Alive: timeout=5。

    6. 如何理解HTTP协议是无状态的

    HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理,因为如果由服务器来承担每个客户端的状态保存是非常不现实的,对服务器压力非常大。但是无法保存状态会造成应用中的一些问题和局限,所以采用cookie技术来进行保存客户端状态,通过在请求和响应中设置cookie就可以实现保存控制客户端状态。

4. HTTPS协议原理简单说明

    1. HTTPS通过加密+身份认证+完整性保护的方式来增强HTTP的安全性,客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤。

  (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

  (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

  (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

  (5)Web服务器利用自己的私钥解密出会话密钥。

  (6)Web服务器利用会话密钥加密与客户端之间的通信。

    2. 对于HTTP来说,其直接调用TCP协议提供的服务,而在HTTPS中,HTTP会在部分接口上先和SSL协议进行通信,然后SSL在和TCP进行通信。所以,HTTPS就相当于HTTP协议加上SSL协议,当使用了SSL协议后就具有了加密、认证以及完整性保护的功能。

    3. HTTPS中的加密方式:SSL协议采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式,即加密算法公开,但密钥保密,持有密钥就可以和加密算法共同完成解密。

(1)共享密钥加密(对称加密):即加密与解密使用同一个密钥,也称为对称加密。这种方式在使用的时候,必须要将密钥发送给另一方,但是我们无法保证共享密钥在网络中传输是安全的,一旦密钥被第三方截获那么就会造成数据盗取。

(2)公开密钥加密(非对称加密):即加密与解密使用不同的密钥,发送密文方使用公开密钥进行加密,而接收密文方解密使用私有密钥,私有密钥必须保证其保存的安全性,不会被盗取。非对称加密技术源于两个大质数相乘,就现代的计算机来说,破解非对称机密是不可能的。

(3)HTTPS将两种解密算法一起使用,如果能保证密钥的安全交换就使用第一种发送,否则就用第二种,但是第二种方式的性能较差。

    4. 公开密钥加密方式需要去认证公开密钥的真实性和准确性:公开密钥加密方式还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥。比如,正准备和某台服务器建立公开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥?或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。

    所以需要使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。

(1)首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。

(2)然后服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端, 以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。

(3)接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事: 一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二, 服务器的公开密钥是值得信赖的。 此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。

    5. HTTPS的缺点:HTTPS虽然很安全,但是实际上网站使用的并不多,因为与HTTP的纯文本通信相比,HTTP因为加密通信会消耗更多的性能资源,尤其是请求数量很多的时候对于服务器的压力很大;其次是HTTPS的中认证证书是需要购买的,需要额外花销。所以HTTPS只用于传输密码等关键敏感信息,并不能大规模使用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!