读书笔记:图解HTTP 12.1~12.23

编程入门 行业动态 更新时间:2024-10-24 11:21:15

<a href=https://www.elefans.com/category/jswz/34/1768764.html style=读书笔记:图解HTTP 12.1~12.23"/>

读书笔记:图解HTTP 12.1~12.23

HTTP/0.9   只有一个命令GET   没有HEADER等描述数据的信息   服务器发送完毕,就关闭TCP连接

HTTP/1.0  增加了POST DELETE等很多命令,增加了status code (描述服务端请求某一次请求之后的状态)和header(发送和请求的相关数据的描述和这些数据如何进行操作的一个方法)

 增加了 多字符集支持、多部分发送、权限、缓存等

HTTP/1.1 持久连接 、pipeline、增加了host和其他一些命令,引入了Chunked transfer-coding,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输    (大多数数据以字符串形式传输)

  •    管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应之后再请求
    • 注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!
    • 所以现在使用HTTP1.1协议的应用,都是有可能会开多个TCP连接的

 HTTP2 所有数据以二进制传输,同一个连接里面发送多个请求不再按照顺序来,头信息压缩以及推送(服务端主动发送数据传输的,例如客户端请求HTML,服务端可以主动推送css和js文件,起到了并行的作用)等提高效率的功能

 

HTTP报文格式:

TCP/IP通信传输流

   

 传输层把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号转发给网络层

网络层增加作为通信目的的MAC地址后转发给链路层

接收端的服务器在链路层接收到数据,按需往上层发送,一直到应用层,当传输到应用层,才能算真正接收到用客户端发送过来的HTTP请求

各种协议与HTTP协议的关系

URI  统一资源标标志符,用来唯一标识互联网上的信息资源,包括URL和URN

URL 统一资源定位器   http://usr:pass@host:80/path?query=string#hash   此类格式都叫做URL,比如ftp协议

URN 永久统一资源定位符,在资源移动之后还能被找到,但是目前没有非常成熟的使用方案和场景

URI格式

要使用涵盖全部必要信息的绝对URI、绝对URL以及相对URL,相对URL,是指从浏览器中基本URI处指定的URL,例如/img/logi.gif

HTTP协议使用URI定位互联网上的资源,正式因为URI可以在互联网上任意位置的资源都能访问到,URI作为请求报文中的请求URI包含在内(如果不是范文特定资源而是对服务器本身发起请求,可以用一个*来代替请求URI)

例如:OPTIONS *HTTP/1.1 查询HTTP服务器支持的HTTP方法种类

 

 

 

请求报文:请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成

响应报文:协议版本、装填白、状态码的原因短语、响应首部字段、主体

HTTP是无状态协议,不对请求和响应之间的通信状态进行持久化处理,这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单,而然为了实现期望的保持状态功能,于是引入了Cookie技术

      Cookie会根据从服务器端发送的响应报文内的一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去,服务器端根据接收的Cookie对比服务器上的记录,最后得到之前的状态信息

HTTP1.1使用的方法

GET:用来请求访问已被URI是别的资源,指定的资源经过服务器解析后返回相应内容(请求的文本,原本返回,如果是CGI(通用网关接口)那样程序,则返回经过执行后的输出结果)

POST:传输实体的主体

PUT:传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置,但是在1.1的PUT方法自身不带验证机制,任何人都可以上传,若配合Web应用程序的验证机制或架构设计采用REST(表征状态转移)标准的同类Web网站就可能会开放使用PUT方法

 

 

HEAD:获取报文首部,不返回报文主体部分,主语确认URI的有效性及资源更新的日期时间等

DELETE:输出文件,但是本身和PUT方法一样不带验证机制,所以一般Web网站也不实用DELETE方法,当配合Web应用程序的验证机制,或遵守REST标准时还是有可能会开放使用的

OPTIONS:查询针对请求URI指定的资源类型支持的方法

TRACE:让Web服务端将之前的请求通信环回给客户端的方法,发送请求时,在Max-Forwords首部字段中填入数值,每经过一个服务器端就将该数字-1,当为0就停止传输,最好接收到请求的服务器端则返回状态码200 OK的响应,客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的,这是因为,请求想要连接到原目的服务器可能会通过代理中转,TRAC方法就是确认连接过程发生的一系列操作

但是,TRACE方法本来不怎么常用,再加上它容易引发XST(跨站追踪)攻击

CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网路隧道传输

格式:CONNECT 代理服务器名:端口号  HTTP版本

其中LINK(建立资源之间的联系)和UNLINK(断开连接关系)已经被HTTP1.1废弃

持久化:为了解决传输数据频繁TCP连接的问题,HTTP/1.1和一部分HTTP/1.0相处了持久连接(HTTP keep-alive或者 HTTP connection reuse)的方法,只要任意一段没有明确提出断开连接,则保持TCP连接状态,好处减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载,另外减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就响应提高了

管线化:持久连接使得多数请求以管线化方式发送成为可能,从前发送请求后需要等待并受邀响应才能发送下一个请求,管线化技术出现后,不需要等待响应即可发送下一个请求,这样就可以同时并行发送多个请求,不需要一个接一个地等待响应了

 

 

HTTP报文内的信息

  HTTP报文分为报文首部(服务器或客户端需处理的请求或响应的内容及属性)和报文主体(应被发送端的数据)两块

请求行:包含用于请求的方法,请求URI和HTTP版本

状态行:包含表明响应结果的状态码,原因短语和HTTP版本

首部字段:包含标识请求的响应和各种条件和属性的各类首部(通用首部,请求首部,响应首部,实体首部)

其他:包含HTTP的RFC里面未定义的首部(Cookie等)

HTTP可以在传输过程中通过编码提升传输速率,能有效地处理大量的访问请求,但是,会消耗其算计更多的CPU等资源,

HTTP首部类型

通用首部字段(General Header Fields):请求和响应报文两方都会使用的首部

请求首部字段(Request Header Fields)

响应首部字段(Response Header Fields):

实体首部字段(Entity Header  Fields):针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等于实体有关的信息

非HTTP1.1首部字段

  HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型

  端到端首部(End-to-end Header):转发给请求/响应对应的最终接受目标,切必须保存在缓存生成的响应中,另外规定它必须被转发

  逐跳首部(Hop-by-hop Header):只对单词转发有效,会因通过缓存或代理而不再转发(1.1以后,需要提供Connection首部字段)

 

除了这八个首部字段外都属于端到端首部

Cache-Control:控制缓存的行为 

缓存请求指令:

缓存响应指令:

public:所有内容都将被缓存(客户端和代理服务器都可缓存)

private:内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)

no-cache:必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。

 

1.no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,no-store才是真正地不进行缓存

2.判断缓存资源的缓存时间数值比指定时间数值更小,客户端接受缓存的资源,让max-age值为0,那么缓存服务器需要将需求转发给源于服务器,这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高

3.s-maxage:功能和max-age指令的相同,不同点是s-maxage对于向同一用户重复返回相应的服务器来说这个指令没有任何作用,当进行s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理

4.min-fresh:要求缓存服务器返回至少还未过指定时间的缓存资源

   max-stale:如果有参数,返回时间内无论是否过期的资源,如果没有参数,资源全部返回

  cache-Control:only-if-cached:  表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,要求缓存服务器不重新加载响应,也不会再次确认有效性,若发生请求缓存服务器的本地缓存无响应,则返回504

  cache-Control:must-revalidate   代理会向源服务器再次验证即将返回的响应缓存目前是否有效,如果无法联通源服务器再次获取有效资源的话,缓存必须给客户端一条504状态码(使用这个指令会忽略请求的max-stale)

 cache-Control:proxy-revalidate  要求所有缓存服务器在接收到客户端带有该指令请求返回相应之前,必须再次验证缓存的有效性

 cache-Control:no-transform:无论在请求和响应中,缓存都不能改变实体主体的媒体类型,可防止缓存或代理压缩图片等操作

 

Connection:具备如下两个作用  1.管理持久连接 2.控制不再转发给代理的首部字段

Connection:不再转发的首部字段名

HTTP1.1默认是持久连接,keep-Alive,当服务端想明确断开连接时,指定值为close

Pragma:仅作为1.1与1.0的向后兼容而定义的,例如 Pragema:no-cache 如果都是以HTTP/1.1为基准,直接采用Cache-Control:no-cache指定缓存的处理方式,如果HTTP协议版本不一致,发送请求时会同事含有下面两个首部字段 Cache-Control:no-cache  Pragma:no-cache

Trailer:会事先说明在报文主体后记录了那些首部字段,该首部字段可应用于1.1分块传输编码时

例如:

Transfer-Encoding:规定了传输报文主体时采用的编码方式

Upgrade:用户检测HTTP协议以及其他协议是否可使用更高的版本通信

 Connection值被指定为Upgrade,产生作用的Upgrader对象仅限于客户端和邻接服务器之间,因此使用Upgrade时,还需要额外指定Connection:Upgrade,对于首部字段Upgrade请求,服务器可用101 Swutching protocols状态码响应返回

 

VIA:为了追踪客户端与服务器之间的请求和响应报文的传输路径,Via不仅用于追踪报文的转发,还可以避免请求回环的发生,所以必须在经过代理时附加

Warning:告知用户一些与缓存相关的问题警告

请求首部

  Accept:可通知服务器,用户代理能够处理的媒体类型及媒体类型优先级,可使用type/subtype这种形式,q代表权值,默认是1.0

Accept-Charset:通知服务器用户代理支持的字符集及字符集的相对优先顺序,可一次性制定多种字符串

Accept-Encoding:告知服务器用户代理支持的内容编码及内容编码的优先级 (详细看下面的压缩传输的内容编码)

Accept-Language:告知服务器用户能够处理的自然语言

Authorization:告知服务器,用户代理的认证信息,通常会在接受到返回401状态码响应后把首部字段Authorization加入请求

From:告知服务器用户的电子邮箱地址

Host:虚拟主机运行在同一个IP上,因此使用首部字段Host加以区分

If-Match:附带条件请求,只有字段值跟ETag值匹配一致,服务器才会接受请求(相反的是If-None-Match)

If-Range:如何跟ETag值或更新的日期时间匹配一直,那么就作为范围请求处理,反之则返回全部资源

If-Unmodified-Since:和首部字段If-Modified-Since作用相同,告知服务器,指定的请求资源只有在字段值内指定的日期之后,未发生更新的情况下,才能处理请求

Max-Forwards:限制转发次数

Range:只需获取部分资源的范围请求,如果成功告知206,如果无法处理,返回200和全部资源

Referrer:会告知服务器请求的原始资源的URL,可以根据这个获取不同渠道流量的分布和用户搜索关键字,但是可能会造成用户敏感信息泄露,URI中的查询字符串可能含有ID和密码等保密信息

TE:gzip,deflate q=0.6/trailers 告知客户端能够处理响应的传输编码方式和优先级,和Accpet-Encoding功能很像,但是用于传输编码,还可以指定伴随trailer字段的分块传输编码方式

User-Agent:用于传达浏览器的种类,会将创建请求的浏览器和用户代理名称等信息传达给服务器,如果请求经过代理,那么中间也有可能添加上代理服务器的名称

 

响应首部字段

Accept-Ranges:告知客户端服务器是否能处理范围请求,可以为bytes,反之none

Age:告知客户端,源服务器在多久前创建了响应,若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值(这个缓存想源服务器确认过,现已过去了十分钟),代理创建响应时,必须加上首部字段

ETag:一种可以将资源以字符串形式作为一性标识的方式,服务器会为每份资源分配对应的ETag(资源的URI没有变,但是当资源更新后,ETag值会随之改变),仅仅由服务器分配,当资源被缓存时,就会被分配唯一性标识,例如当中文版浏览器访问uri时和英文版访问同样的URI,需要不同对应的资源,但是URI相同,无法分辨,所以会根据ETag值来指定资源

   ETag有强弱之分,强的只要实体改变就改变,弱的智慧与标识资源是否相同,只有发生根本改变才会改变ETag值,这时会在字段最开始附加W/。

Location:提供重定向的URI

Proxy-Authenticate:会把由代理服务器所要求的认证信息发送给客户端,而客户端与服务器之间进行认证,WWW-Authorization有着相同的作用

Retry-After:告知客户端应该多久之后再次发送请求,主要配合503或者3xx响应一起使用,可以使日期时间,也可以是创建响应后的秒数

Server:告知客户端当前服务器安装的HTTP服务器应用程序信息

Vary: 当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用Accept-Language字段的值相同,那么就直接从缓存返回响应,反之则需要先从源服务器端获取资源才能做出响应

WWW-Authenticate:用户HTTP访问认证

Last-Modified:指明资源最终修改时间

 

 

 

 

 

 

 

实体首部字段

   请求和响应两方的HTTP报文中都含有与实体相关的首部字段

    Allow:通知客户端能够支持HTTP方法,当服务器接收到不支持的HTTP方法,会以405作为响应返回,同事把所支持的HTTP写入Allow后返回

   Content-Location:给出与报文主体部分相对应的URI,和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI(比如访问://123/index.html等类似情况)

   content-MD5:客户端对接受的报文主体执行相同的MD5泛,然后与首部字段Content-MD5的字段值比较,目的在于检查报文主体在传输过程中是否保持完整性,以及确认传输到达

Content-Type:说明实体主体内对象的媒体类型和首部字段Accpet字样字段值用type/suybtype形式复制,参数charset使用iso-8859-1等字符集进行赋值

Expires:会将资源失效日期告知客户端,缓存服务器在接受到含有首部字段Expires的响应后,会以缓存来应答请求,当超过指定时间,缓存服务器在请求发送过来时,会转向源服务器请求资源,如果源服务器不希望缓存,在Expires字段内写入与首部Date相同的时间值,(优先级小于Cache-Control 中 max-age)

 

 

为Cookie服务的首部字段

当服务器准备开始管理客户端的状态,会事先告知各种信息

Set-Cookie字段的属性:

expires:当省略时,其有效期仅限于维持浏览器会话(session)时间段内,一旦Cookie从服务器端发送至客户端服务器不存在可以显式删除Cookie的方法,但可通过覆盖已过期的Cookie,实现对客户端Cookie的实质性删除操作

secure:用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie,发送Cookie,指定secure属性的方法如下:

以上例子只在HTTPS情况下才进行Cookie回收,当省略secure属性,不论http还是https都会对cookie进行回收

HttpOnly:主要目的防止跨站脚本攻击(XSS)对Cookie信息窃取

加了设置后,js的document.cookie就无法读取附加httpOnly属性后的Cookie的内容了

 

 

 

其他首部字段:

X-Frame-Options:属于HTTP响应首部,用于控制网站内容再其他Web网站的Frame标签内的显示问题,其主要目的为了防止点击劫持攻击

DENY:拒绝

SAMEORIGIN:仅同源域名下的页面匹配时许可,同源下所有页面frame都被允许加载该页面

X-XSS-Protection:1    HTTP响应首部,针对跨站脚本xss的一种对策,用于控制浏览器xss防护机制的开关

0:对xss过滤设置成无效状态

1:对xss过滤设置成有效状态

DNT:1   HTTP请求首部,拒绝个人信息被采集,时表示拒绝被精准广告追踪的一种方法

0:同意被追踪

1:拒绝被追踪

由于首部DNT功能具有效性,所以Web服务器需要对DNT做对应的支持

P3P(在线隐私偏好平台):属于HTTP响应首部,可以让Web网站上的个人隐私编程一种仅供程序可理解的形式,以达到保护用户隐私的目的

设定p3p:1.创建P3P隐私 2.创建P3P隐私对照文件,保存明明在w3c/p3p.xml 3.从p3p隐私中新建 Compact policies后。输出到http相应中

 

 

 

 

压缩传输的内容编码

HTTP协议中有一种被称为内容编码的功能进行压缩传输,指明应用实体上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接受并负责解码

  Gzip(GNU zip)

 compress (UNIX系统的标准压缩) 

deflate(zlib格式)

identity(不进行编码)

分块传输编码

 在传输大容量数据时,通过数据分割成多块,能够让浏览器逐步显示页面

 分块传输编码会将实体主体分成多个部分,每一块都会用十六进制来标记快的大小,而实体主体的最后一个块使用‘0’来标记,会由接受的客户端负责解码,恢复到编码前的实体主体(HTTP1.1存在一种称为传输编码的机制,它可以通过某种编码方式传输,但是只作用于分块传输编码中)

发送多种数据的多部分对象集合:类似于邮件发送才用了MIME(多用途因特网邮件扩展)机制,允许邮件处理文本、图片、视频等多个不同类型的数据,HTTP协议也采用了多部分对象集合,发送一份报文主体可能含有多类型实体,通常是图片或者文本文件上传时使用

   multipart/form-data

在Web表单文件上传时使用

multipart/byteranges

 

状态码206响应报文包含了多个范围的内容时使用

使用boundary字符串来划分多部分对象集合致命的各类实体,在起始行前加‘--’标记,在最好插入‘--’标记作为结束

获取部分内容的范围请求:当下载一个尺寸少打的图片或者文件,如果网络终端,需要一种可恢复的机制,要实现该功能需要制定下载的实体范围,像这样,制定范围发送的请求叫做范围请求

形式如下:

针对范围请求,返回状态码206,对于多重范围,响应会在首部Content-Type标明 multipart/bytaranges后返回响应报文,如果服务器无法响应范围请求,返回200 OK和完整的实体内容

内容协商返回:Accept 、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language

协商技术有以下三种类型:、

服务器驱动协商、客户端驱动协商、透明协商(是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法)

 

 

状态码

类别:

具有代表性的:

200:标识客户端发过来的请求在服务端被正常处理了

204:请求处理成功,但是没有资源可返回

206:客户端进行范围请求,服务器成功执行GET请求(响应报文包含有Content-Ranges)

301:永久性重定向

302:临时重定向

303  由于请求对应的资源存在另一个URL,应使用GET方法定向获取请求的资源。(和302有着相同的功能,但是明确表示客户端应采用GET方法获取资源,这点和302有区别)

当301、302、302响应状态吗返回时,几乎所有浏览器会把POST改为GET,并删除报文内的主体,之后请求会自动再次发送(301、302标准会禁止将POST方法改为GET,但是实际上大家都是这么做)

302 该状态码标识客户端发送附带条件(请求报文中包含 If-Match,If-ModifiedSince,If-None-Match,If-Range)的请求时,服务器端允许请求访问资源,但为满足条件的情况

307:和302有着相同含义,(不同是会遵照标准,不会POST变为GET)

4XX客户端错误

400:请求的报文存在语法错误

401:标识发送的请求需要通过HTTP认证,另外若之前进行过一次请求,则表示用户认证失败

403:对请求资源的访问被服务器拒绝了

404:在服务器上无法找到请求的资源

5XX服务器错误

500:执行请求发生了错误,也有可能是程序Bug

503:服务器暂时处于高负载或正在进行停机维护,现在无法处理请求

 

Web服务器

  用单台虚拟主机可以实现多个域名,在互联网上域名通过DNS服务映射到IP地址之后访问,所以IP是相同,由于虚拟主机可以寄存不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI

代理:接受由客户端发送的请求并转发给拥有其资源的服务器,同时也接受服务器返回的响应并转发给客户端

  在HTTP通信过程中,可级联多态代理服务器,会追加写入Via首部信息以标记处经过的主机信息

优点:利用缓存技术减少网络带宽的流量,组织内部针对特定的网站访问控制,以获取访问日志为主要目的等等

代理分为缓存代理和透明代理

缓存代理:不从源服务器哪里获取资源,而是将之前缓存的资源作为响应返回

透明代理:不对报文做任何的加工处理,反之亦然

 

网关:转发其他服务器通信数据的服务器,接受从客户端发送来的请求,它就像自己拥有资源的源服务器一样对请求进行处理(有时客户端可能不会察觉,自己的通信目标是一个网关)

  利用网关可以由HTTP请求转化为其他协议通信,使通信线路上的服务器提供非HTTP协议服务,利用网关能提高通信的安全性,在客户端与网关通信线路上加密保证连接的正确,比如网关可以连接数据库,使用SQL语句查询数据,在购物网站信用卡结算时可以和信用卡结算系统联动

隧道:可按照要求建立一条远距离的服务器安全通信,使用SSL等加密手段,确保客户端与服务器进行安全通信

           隧道本身不去解析HTTP请求,在通信双方断开连接时结束

 

 

确保Web安全的HTTPS

 HTTP缺点

1.通信使用明文(不加密),本身不具有加密功能,无法对通信整体请求和响应的内容进行加密,内容可能被窃听  

    补足:HTTP本身没用加密机制,但是可以通过和ssl(安全套接层)或者TLS(安全层传输协议)组合使用,加密HTTP的通信内容,用SSL建立安全通信线路后,进行HTTP通信,与SSL组合使用的HTTP被称为HTTPS(超文本传输安全协议)

2.不验证通信方身份,因此可能遭受伪装

    HTTP协议中的请求和响应不会对通信方进行确认,也就是存在服务器是否就是发送请求中URI真正指定的主机,返回的响应是否真的返回到请求的客户端等类似问题,再HTTP通信中,不存在确认通信方处理步骤,任何人都可以发送请求,服务器只要接受到请求,不管是谁都返回一个响应(仅限于ip和端口号没用被web服务器设定限制访问的前提下),所以客户端和服务器都存在伪装的可能

   补足:SSL不仅提供加密处理,而且还是用了一种被称为证书(CA证书)的手段,通过证书,以证明通信放就是意料中的服务器,另外客户端持有证书即可完成个人身份的确认

3.无法证明报文的完整性,所以有可能已遭受篡改

    由于HTTP协议无法证明通信的报文完整性,因此再请求或响应发出后,到对方接受这个时间内,可能会遭到篡改,虽然有使用HTTP协议确保报文完整性的办法,但事实上并不方便可靠,其中常用的时MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法

  可惜这些方法也依然无法百分百保证结果正确,因为PGP和MD5本身被改写的话,用户时没有办法意识到的

   

HTTPS: 

  HTTPS并非是应用层的一种新协议,知识HTTP通信接口部分用SSL和TLS协议代替而已,通常HTTP直接和TCP通信,当使用SSL时,则先和SSL通信,再由SSL和TCP通信,在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整保护这些功能

共享密钥加密:加密和解密通用一个秘钥的方式

SSL采用一种叫做公开加密秘钥的加密处理方式,使用一对非对称的秘钥,私有和公开,发送密文的一方使用对方的公开秘钥进行加密处理,对方收到被加密的信息后,在使用自己的私有秘钥进行解密,解决了共享密钥加密的秘钥被盗取数据危险的情况

HTTPS采用混合加密机制:共享密钥加密和公开秘钥加密两者并用的机制,公开比共享处理的速度慢,所以充分利用各自的优势,在交换密钥的环节使用公开加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式

   例如:某网站使用公开加密的公钥A、私钥A,服务器把公钥A铭文给传输浏览器,浏览器随机生成一个用于共享加密的私钥B,用公钥A加密后传给服务器,这样双方都有了私钥B,且别人无法知道它,之后都用私钥B加密解密

   

   但是存在的缺点:中间人把公钥A保存起来,把数据包的公钥A替换成自己伪造的公钥B,浏览器随机生成一个用于共享加密的私钥X,用公钥B(浏览器不知道公钥呗替换)加密后传给服务器,钟家人劫持后,用私钥B,解密得到秘钥X,再用公钥A加密传给服务器,服务器拿到后用私钥A,加密得到私钥X,这样双方不知道的情况下,中间人拿到了私钥B

    这个时候就用到了数字证书,数字正式有持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书取公钥就行,证书如同身份证一样,可以证明“该公钥对应网站”

 如何防止证书呗篡改?

     我们把证书内容生成一份签名,比对内容和签名是否一致就能察觉,这个中技术就叫数字签名

 

CA拥有非对称加密的私钥和公钥,CA对证书明文信息进行HASH,对hash后的值用私钥加密,得到数字签名,明文和数字签名共同组成了数字证书。

浏览器验证过程:拿到证书,得到明文T,数字签名S,用CA机构的公钥对S解密(由于是浏览器信任的机构,所以保有它的公钥),得到S‘,用证书说明的hash算法对明文T进行hash得到T',比较S‘是否等于T’,等于则表明证书可信

  1.如何防止篡改:假设有人篡改了证书原文,由于他没有CA机构的私密,所以无法得到加密后的签名,无法响应篡改签名,浏览器发现原文和签名解密后的值不一致,说明被篡改了

  2.中间人有可能把证书掉包吗?

    假设有另一个网站B也拿到了CA机构认证的证书,它想搞垮网站A,想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,会导致上文提到的漏洞。其实这并不会发生,因为证书里包含了网站A的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。

3.为什么制作数字签名时需要hash一次?

最显然的是性能问题,前面我们已经说了非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加密解密就会快很多,当然还有安全上的原因,

4.HTTPS必须在每次请求中都要先在SSL/TLS层进行握手传输密钥吗?

显然每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?用session就行。

     服务器会为每个浏览器(或客户端软件)维护一个session ID,在TSL握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!

5.为什么不一直使用HTTPS

      因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源,如果每次通信都加密,会消耗更多的资源,平摊到一台其算计上,能够处理的请求数量必然会减少,HTTPS比HTTP要慢到2到100倍,特别是当访问量多的WEB网站,在进行加密处理时候,并非所有内容都进行加密处理,另外结余购买证书的开销也是原因之一

 注:SSL慢分两种,一种是指通信慢,另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢,与HTTP相比,除去和TCP连接、发送HTTP请求和响应外,还必须进行SSL通信,另一点SSL必须进行加密处理,在服务器和客户端需要进行加密和解密的原酸处理,更多的消耗服务器和苦短硬件资源,导致负载增强(可以使用SSL通信专用软件提高SSL计算速度)

HTTPS的通信步骤

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

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

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

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

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

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

 

 

 基于HTTP的功能追加协议

        HTTP的瓶颈:1.一条连接上只可发送一个请求  2.请求只能在客户端开始,只能接受响应指令 3.请求/响应首部未经压缩就发送 4.发送冗长的首部(每次互相发送相同的首部造成浪费) 5.可选择任意数据压缩格式,非强制性压缩

         Ajax:异步JS和XML技术,是一种有效利用JS和DOM的操作已达到局部Web页面替换加载的异步通信手段,核心技术名为XMLHttpRequest的API,通过JS的调用就和服务器进行HTTP通信,有可能导致大量请求产生,仍然没解决HTTP本身问题

       Comet:一旦服务器端有内容更新,Comet不会让请求等待,而是直接给客户端返回响应(一种通过延迟应答,模拟实现服务端向客户端推送的功能),Comet会先将响应置于挂起状态,虽然做到实时更新,但是一次连接的持续时间也变长了,期间为了维持连接会消耗更多资源,Comet也仍未解决HTTP协议本身存在问题

      SPDY:没有完全改写HTTP协议,而是在TCP/IP的应用层和运输车之间通过新加会话层的形式,SPDY规定通信中加SSL,SPDY会以会话层的形式加入,控制对数据的流动,但是还是采用HTTP建立通信连接,因此可使用HTTP的GET和POST、Cookie以及HTTP报文等

   使用SPDY,HTTP协议额外获得以下功能: 1.多路复用流(单一TCP连接,无限制处理多个HTTP请求), 2. 赋予请求优先级(SPDY不仅可以无限制的并发处理请求,还可以给请求分配优先级,解决因带宽低而导致响应变慢),3. 压缩HTTP首部,推送功能,4. 服务器提示功能(服务器主动提示客户端所需资源,因此在资源已缓存等情况,可以避免发送不必要的请求)

        WebSocket:进行全双工通信

            利用Ajax和Conmet技术进行通信可以提高WEB的浏览速度,但是问题在于通信若使用HTTP协议,就无法彻底解决瓶颈问题

           WebSocket一旦WEB服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行(可以发送JSON、XML、HTML或图片等数据),

          特点:1.推送功能  2.减少通信量(因为保持一直连接状态,与HTTP相比不仅每次连接时总开销减少,而且首部信息很小,通信量也相应减少了)

         连接步骤:完成一次握手步骤 

               1.握手-请求    需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手目的

                

                 Sec-WebSocket-Key:记录捂手过程必不可少的键值

                 Sec-Websocket-Protocol:字段内记录使用的自协议

               2.握手-响应               对于之前请求返回101

                

                 Sec-WebSocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的

                 成功握手建立连接后,通信不再使用HTTP的数据帧,而是采用WebSocket独立的数据帧

 

 

 

 

 

 

 

 

更多推荐

读书笔记:图解HTTP 12.1~12.23

本文发布于:2024-02-11 20:54:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1683416.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:读书笔记   HTTP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!