HTTP专题
参考链接: link1 link2
[1] HTTP是什么?
**超文本传输协议(HTTP)**是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。该协议虽然通常基于 TCP/IP 层,但可以在任何可靠的传输层上使用;也就是说,不像 UDP,它是一个不会静默丢失消息的协议。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。
[2] HTTP概述
![HTTP as an application layer protocol, on top of TCP (transport layer) and IP (network layer) and below the presentation layer.](https://mdn.mozillademos.org/files/13673/HTTP%20&%20layers.png)
HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
[3] HTTP 的基本性质
-
HTTP 是简单的。虽然下一代HTTP/2协议将HTTP消息封装到了帧(frames)中,HTTP大体上还是被设计得简单易读。HTTP报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。
-
HTTP 是可扩展的。在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。
-
HTTP 是无状态,有会话的。HTTP是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用HTTP的头部扩展,HTTP Cookies就可以解决这个问题。把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。注意,HTTP本质是无状态的,使用Cookies可以创建有状态的会话。
-
HTTP 和连接。一个连接是由传输层来控制的,这从根本上不属于HTTP的范围。HTTP并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP是可靠的,而UDP不是。因此,HTTP依赖于面向连接的TCP进行消息传递,但连接并不是必须的。
在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。
为了减轻这些缺陷,HTTP/1.1引入了流水线(被证明难以实现)和持久连接的概念:底层的TCP连接可以通过
Connection
头部来被部分控制。HTTP/2则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。为了更好的适合HTTP,设计一种更好传输协议的进程一直在进行。Google就研发了一种以UDP为基础,能提供更可靠更高效的传输协议QUIC。
[4] HTTP 报文
HTTP/1.1以及更早的HTTP协议报文都是语义可读的。在HTTP/2中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始HTTP报文的一部分以HTTP/2发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1请求。因此用HTTP/1.1格式来理解HTTP/2报文仍旧有效。
有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。
-
请求
请求由以下元素组成:
- 一个HTTP的method,经常是由一个动词像
GET
,POST
或者一个名词像OPTIONS
,HEAD
来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。 - 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol(
http://
),domain(developer.mozilla.org
),或是TCP的port(HTTP一般在80端口)。 - HTTP协议版本号。
- 为服务端表达其他信息的可选头部headers。
- 对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。
- 一个HTTP的method,经常是由一个动词像
-
响应
响应报文包含了下面的元素:
- HTTP协议版本号。
- 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- HTTP headers,与请求头部类似。
- 可选项,比起请求报文,响应报文中更常见地包含获取的资源body。
[5] HTTP 请求方法
HTTP 定义了一组请求方法, 以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作. 虽然他们也可以是名词, 但这些请求方法有时被称为HTTP动词.
GET
GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
HEAD
HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
POST
POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT
PUT方法用请求有效载荷替换目标资源的所有当前表示。
DELETE
DELETE方法删除指定的资源。
CONNECT
CONNECT方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS
OPTIONS方法用于描述目标资源的通信选项。
TRACE
TRACE方法沿着到目标资源的路径执行一个消息环回测试。
PATCH
PATCH方法用于对资源应用部分修改。
[6] HTTP 响应代码
HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:信息响应(100
–199
),成功响应(200
–299
),重定向(300
–399
),客户端错误(400
–499
)和服务器错误 (500
–599
)。状态代码由 section 10 of RFC 2616定义。
信息响应(100-199)
-
这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
-
该代码是响应客户端的
Upgrade
标头发送的,并且指示服务器也正在切换的协议。 -
此代码表示服务器已收到并正在处理该请求,但没有响应可用。
-
此状态代码主要用于与
Link
链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。
成功响应(200-299)
-
请求成功。成功的含义取决于HTTP方法:GET:资源已被提取并在消息正文中传输。HEAD:实体标头位于消息正文中。POST:描述动作结果的资源在消息体中传输。TRACE:消息正文包含服务器收到的请求消息
-
该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
-
请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。
-
203 Non-Authoritative Information
服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
-
服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
-
服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
-
服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
-
由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
-
在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。
-
226 IM Used
(HTTP Delta encoding)服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。
重定向(300-399)
-
被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
-
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
-
请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
重定向是网页制bai作中的一个知识,几个例子跟你说du明,假设你现在所处的位置是zhi一个论dao坛的登录页面,你填写了帐号,密码,点击登陆,如果你的帐号密码正确,就自动跳转到论坛的首页,不正确就返回登录页;这里的自动跳转,就是重定向的意思。或者可以说,重定向就是,在网页上设置一个约束条件,条件满足,就自动转入到其它网页、网址
301和302区别:
https://www.cnblogs.com/tongongV/p/10944414.html
-
对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。
-
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
-
305 Use Proxy
被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
-
306 unused
在最新版的规范中,306 状态码已经不再被使用。
-
请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
-
这意味着资源现在永久位于由
Location:
HTTP Response 标头指定的另一个 URI。 这与301 Moved Permanently HTTP
响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用POST
,则必须在第二个请求中使用POST
。
客户端响应(400-499)
-
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
-
当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
-
402 Payment Required
此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。
-
服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个 404 响应,假如它不希望让客户端获得任何信息。
-
请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
-
请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
-
请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
-
407 Proxy Authentication Required
与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。
-
请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
-
由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
-
被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。
-
服务器拒绝在没有定义
Content-Length
头的情况下接受请求。在添加了表明请求消息体长度的有效Content-Length
头之后,客户端可以再次提交该请求。 -
服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
-
服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个
Retry-After
的响应头,以告知客户端可以在多少时间以后重新尝试。 -
请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
-
对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
-
如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
-
此响应代码意味着服务器无法满足
Expect
请求标头字段指示的期望值。 -
服务器拒绝尝试用
“茶壶冲泡咖啡”
。 -
该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。
-
422 Unprocessable Entity
(WebDAV)请求格式良好,但由于语义错误而无法遵循。
-
正在访问的资源被锁定。
-
424 Failed Dependency
(WebDAV)由于先前的请求失败,所以此次请求失败。
-
服务器不愿意冒着风险去处理可能重播的请求。
-
服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送
Upgrade
头以指示所需的协议。 -
原始服务器要求该请求是有条件的。 旨在防止“丢失更新”问题,即客户端获取资源状态,修改该状态并将其返回服务器,同时第三方修改服务器上的状态,从而导致冲突。
-
用户在给定的时间内发送了太多请求(“限制请求速率”)。
-
431 Request Header Fields Too Large
服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。
-
451 Unavailable For Legal Reasons
用户请求非法资源,例如:由政府审查的网页。
服务端响应(500-599)
-
服务器遇到了不知道如何处理的情况。
-
此请求方法不被服务器支持且无法被处理。只有
GET
和HEAD
是要求服务器支持的,它们必定不会返回此错误代码。 -
此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
-
服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。 请注意,与此响应一起,应发送解释问题的用户友好页面。 这个响应应该用于临时条件和
Retry-After
:如果可能的话,HTTP头应该包含恢复服务之前的估计时间。 网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。 -
当服务器作为网关,不能及时得到响应时返回此错误代码。
-
505 HTTP Version Not Supported
服务器不支持请求中所使用的HTTP协议版本。
-
服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。
-
服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。
-
服务器在处理请求时检测到无限循环。
-
客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。
-
511 Network Authentication Required
511 状态码指示客户端需要进行身份验证才能获得网络访问权限。
[7] 谈下 HTTP 1.0 和 1.1、2.0的主要变化?
- HTTP1.0 经过多年发展,在 1.1 提出了改进。首先是提出了长连接,HTTP 可以在一次 TCP 连接中不断发送请求。
- HTTP2.0 支持多路复用,同一个连接可以并发处理多个请求,方法是把 HTTP数据包拆为多个帧,并发有序的发送,根据序号在另一端进行重组,而不需要一个个 HTTP请求顺序到达;
[8] 讲一下HTTP和HTTPS协议的区别?
- HTTP数据时明文传输,HTTPS是基于SSL的密文传输;
- HTTPS一般是要需要区证书,是收费的;
- HTTP默认使用80端口,HTTPS默认使用443端口。
[9] 简单介绍一下SSL?
记录协议为不同的更高层协议提供基本的安全服务,其特点是为web客户/服务器的交互提供传输服务的超文本传输协议(HTTP)可在SSL上面运行。三个更高层协议被定义成SSL的一部分:握手协议、修改密文规约协议和告警协议。
SSL中两个重要的概念是SSL会话和SSL连接,规约如下:
(1)连接:连接是提供恰当类型服务的传输,对于SSL这样的连接是点对点的关系。连接是短暂的,每个连接与一个会话相联系。
(2)会话:SSL的会话是客户和服务器之间的关联,会话通过握手协议来创建。会话定义了加密安全参数的一个集合,该集合可以被多个连接所共享。会话可用来避免为每个连接进行昂贵的新安全参数的协商。(Secure Sockets Layer)安全套接层,主要提供以下安全服务。
(1)信息保密,通过使用公开密钥和对称密钥技术以达到信息保密。SSL客户机和服务器之间的所有业务都使用在SSL握手过程中建立的密钥和算法进行加密。这样就防止了某些用户通过使用IP数据包嗅探工具非法窃听。尽管数据包嗅探仍能捕捉到通信的内容,但却无法破译。
(2)信息完整性,确保SSL业务全部达到目的。应确保服务器和客户机之间的信息内容免受破坏。SSL利用机密共享和hash函数组提供信息完整性服务。
(3)双向认证,客户机和服务器相互识别的过程。它们的识别号用公开密钥编码,并在SSL握手时交换各自的识别号。为了验证证明持有者是其合法用户(而不是冒名用户),SSL要求证明持有者在握手时对交换数据进行数字式标识。证明持有者对包括证明的所有信息数据进行标识,以说明自己是证明的合法拥有者。这样就防止了其他用户冒名使用证明。证明本身并不提供认证,只有证明和密钥一起才起作用。
(4)SSL的安全性服务对终端用户来讲做到尽可能透明。一般情况下,用户只需单击桌面上的一个按钮或联接就可以与SSL的主机相连。与标准的HTTP连接申请不同,一台支持SSL的典型网络主机接受SSL连接的默认端口是443,而不是80。
SSL协议:
SSL被设计成使用TCP来提供一种可靠的端到端的安全服务,不是单个协议,而是二层协议,低层是SSL记录层,用于封装不同的上层协议,另一层是被封装的协议,即SSL握手协议,它可以让服务器和客户机在传输应用数据之前,协商加密算法和加密密钥,客户机提出自己能够支持的全部加密算法,服务器选择最适合它的算法。
记录协议为不同的更高层协议提供基本的安全服务,其特点是为web客户/服务器的交互提供传输服务的超文本传输协议(HTTP)可在SSL上面运行。三个更高层协议被定义成SSL的一部分:握手协议、修改密文规约协议和告警协议。
SSL中两个重要的概念是SSL会话和SSL连接,规约如下:
(1)连接:连接是提供恰当类型服务的传输,对于SSL这样的连接是点对点的关系。连接是短暂的,每个连接与一个会话相联系。
(2)会话:SSL的会话是客户和服务器之间的关联,会话通过握手协议来创建。会话定义了加密安全参数的一个集合,该集合可以被多个连接所共享。会话可用来避免为每个连接进行昂贵的新安全参数的协商。
[10] HTTP中的Get,Post,Put具体指什么?
答:它们都是HTTP中的请求方法:
- GET(获得)方法:对这个资源的查操作。
- PUT(改)和POST(更新)都有更改指定URI的语义。
【拓展问题!!!!!!!!!!!!!!!!!!!】
- Put和Post 请求有什么区别?
Put请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)
- GET和Post 请求有什么区别?
Get一般用来从服务器上查询信息;Post一般用来插入信息;对于服务器讲:get是安全(不更改信息)、幂等(作用1次和n次效果相同); post不安全、不幂等; ,get是安全(不更改信息)、幂等(作用1次和n次效果相同); post不安全、不幂等;
对于客户端来讲:Get方法将参数直接拼接在了URL后边,明文显示,可以通过浏览器地址栏直接访问;Post请求用于提交表单,数据不是明文的,安全性更高;
Get请求有长度限制,Post请求没有长度限制。
https://www.zhihu.com/question/28586791?sort=created
[11] GET和Post 请求有什么区别?
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a))。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。
从理论上讲,如果请求是幂等的就可以使用GET,所谓幂等是指多个请求返回相同的结果。实际上,相应的服务器方法可能会以某种方式修改状态,所以一般情况下这是不成立的。这只是一种标准。更实际的区别在于净荷的大小,在许多情况下,浏览器和服务器会限制URL的长度URL用于向服务器发送数据。 一般来讲,可以使用GET从服务器获取数据;换句话说,要避免使用GET调用改变服务器上的状态。
一般地,当改变服务器上的状态时应当使用POST方法。不同于GET,需要设置XML-HttpRequest对象的Content-Type首部,如下所示:
xmlHttp.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);与GET不同,POST不会限制发送给服务器的净荷的大小,而且POST请求不能保证是幂等的。
你做的大多数请求可能都是GET请求,不过,如果需要,也完全可以使用POST。
[12] HTTPS建立连接的过程?
已经订正,参考文章:link
HTTPS 的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?link
简介:HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能.很好的解决了解决了http的三个缺点(被监听、被篡改、被伪装)
对称加密和非对称加密
- 对称加密又称公开密钥加密,加密和解密都会用到同一个密钥,如果密钥被攻击者获得,此时加密就失去了意义。
- 非对称加密又称共享密钥加密,使用一对非对称的密钥,一把叫做私有密钥,另一把叫做公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。
但是非对称加密加解密比较复杂,加解密没有对称加密快;HTTP 权衡两种加密方式,采用混合加密机制,在传输对称加密密钥的时候使用非对称加密,然后在通信交换报文阶段则使用对称加密方式。
链接:https://www.jianshu.com/p/d9e4c848ad10
建立连接(顺便复习下输入网站到显示网页的过程)
- HTTP和HTTPS都需要在TCP建立连接的基础上来进行数据传输
- 当客户在浏览器中输入网址的并且按下回车,浏览器会在浏览器DNS缓存,本地DNS缓存,和Hosts中寻找对应的记录,如果没有获取到则会请求DNS服务来获取对应的ip
- 当获取到ip后,tcp连接会进行三次握手建立连接
HTTP请求过程
- 建立连接完毕以后,客户端会发送响应给服务端
- 服务端接受请求并且做出响应发送给客户端
- 客户端收到响应并且解析响应响应给客户
HTTPS请求过程
-
客户端发起一个https的请求,把自身支持的一系列Cipher Suite(密钥算法套件,简称Cipher)(自己支持的一套加密算法和哈希算法)发送给服务端
-
服务端,接收到客户端所有的Cipher后与自身支持的对比,从中挑选出一套自己支持的加密算法和哈希算法,如果不支持则连接断开
-
然后把自己的信息以证书的形式返回给客户端 证书内容有:湾站地址、密匙公钥、证书颁发机构、失效日期等
-
客户端收到服务端响应后会做以下几件事:
- 验证证书的合法性:验证证书的合法性,证书中包含的网站地址是否与正在访问的地址一致、证书是否过期等
证书验证通过后,在浏览器的地址栏会加上一把小锁(如楼主使用的Chrome浏览器)
- 生成随机密码:如果证书验证通过,或者用户接受了不受信任证书,然后浏览器会生成一串随机数,然后用证书中的公钥加密。
- HASH握手信息:用最开始约定好的HASH方式,把握手消息取HASH值, 然后用 随机数加密 “握手消息+握手消息HASH值(签名)” 并一起发送给服务端
在这里之所以要取握手消息的HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。
-
服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。
-
然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端
-
客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密
这里使用了对称加密和非对称加密相结合的方式,保证了服务端向客户端发送消息的可靠性。
为什么不直接使用非对称加密或对称加密?
为什么不使用非对称加密,客户端持有私钥,然后将公钥发送给服务端即可?因为非对称他的速度要慢很多(使用模运算,幂运算)。那为什么不直接使用对称加密?因为使用对称加密的话,那么密钥在传输过程中容易泄露。所以采用用非对称加密来加密对称加密中的密钥,可以保证安全和效率!!!妙啊!!!
为什么不直接使用对称加密?
非对称加密算法:RSA,DSA/DSS 在客户端与服务端相互验证的过程中用的是对称加密
对称加密算法:AES,RC4,3DES 客户端与服务端相互验证通过后,以随机数作为密钥时,就是对称加密
HASH算法:MD5,SHA1,SHA256 在确认握手消息没有被篡改时
为什么说RSA的非对称加密比AES对称加密速度慢?
链接:https://www.zhihu.com/question/350824284/answer/866215364首先说,除去人为因素的干预下(比如代码写得太烂,对比平台不公平等),现有的技术水平下,RSA无论是加密还是解密,一般是要比同长度的AES慢的。选择特定参数,比如e=65537,是会使得加密比解密快很多,但与AES仍然不是一个量级。事实上,RSA-OAEP在RSA加密前就需要两个Hash运算:直观上,这两个HASH运算与AES就是一个级别的复杂度,甚至用时会超过AES。
造成这种现象的本质,在于基础运算的不同。RSA的基本运算是模幂,模的部分有优化算法处理,暂且不谈,我们只看幂运算本身:幂运算的基础单位是乘法,而乘法的基础单位是加法。这个加法,就是我们最熟悉,最常见的整数加。尽管如此,如果学过数字逻辑或者硬件设计的话,应该听说过这个“加法”在电路上比异或(XOR)要麻烦的多。有各种超前进位,并行进位的加法器设计,但没听说有什么异或器设计,是不是?
我们以5+9和5 xor 9的二进制运算为例:
![]()
如果手算一下上面这个过程,你会明显看到,XOR的每个比特运算完全独立,与前后的比特无关;而加法的每个比特均需要考虑低位的进位。这样,计算最高位时,原则上需要等待低位的所有比特计算完毕,而异或并没有这个限制。这个现象称为进位链(carry chain): 尽管可以用各种技术降低它的影响,但从根本上,它使得加法很难与异或得到相同的效率。
现有的处理器可以提供单周期的加法或者乘法操作,但这里的前提是: 1) 付出了额外的电路资源 2)固定了位宽,比如32bit或者64bit;3)根据木桶短板的方式拉低了主频,比如单做xor可能可以提高主频,但为了考虑加法,降低了实际提供的主频。也就是说,对于任意长度电路计算,异或仍要比加密高效得多。
RSA目前的推荐长度至少2048,即使用中国剩余定理,也需要1024bit的幂运算,即大量的1024bit的加法。考虑一下1024bit的进位链对于最高位的压力,就很好理解它在速度上的劣势了。
相反,如果是1024bit的AES,分组可能就是先拆分成16个128-bit AES。AES的基础运算实际有3种,Sbox,XOR以及移位。在现有的CMOS数字逻辑里,移位代价极低。异或前面说过,代价较低。唯一代价较高的运算是Sbox: 然而,尽管8bit的Sbox可能比8-bit的加法器更慢,但AES也只使用8-bit的Sbox而已。每轮的16个Sbox之间并没有关系,完全可以并行。此外,尽管操作复杂,由于空间很小,只有256种可能,完全可以预计算结果,进行查表处理。这也是Sbox最常见的处理方法:尽管存储器的读取速度依然比CPU低一个量级,相比于1024bit的进位链,依然有很大的优势。反过来,1024bit的加法空间太大,显然是没有办法进行预计算查表处理的。
但是,从上面这个论述中也能看到,两者实际达到的效果也有不小的差距。安全性论述起来很复杂,但简单来说,RSA可以提供很多复杂的应用,而AES,即使套用了很多复杂的工作模式,也很难达到相同的覆盖面。许多公钥系统的价值更多体现在它能提供的特定安全功能上,而不是能快速完成文本加密。