HTTP请求与HTTPS

295 阅读13分钟

1.http

HTTP 协议一般指 HTTP(超文本传输协议)。

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

HTTP三点注意事项:

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

1.1  http0.9

GET/index.html

HTTP/0.9当时是为了学术交流,基于请求和响应的模式,在网络中传输HTML超文本的内容。

如上所示,只有一个请求行,没有HTTP请求头和请求体。同样,服务器也没有响应头信息,只是返回了数据。

因为都是HTML格式的文件,决定了返回的文件内容通过ASCII字符流进行传输。

1.2   http1.0

1994年低开启拨号上网,网景也在同年推出了第一款浏览器,人们对万维网的需求不再仅局限于学术交流。

W3C和HTTP工作组HTTP-WG也在这个时代创建。为了满足人们对浏览器的需求(不光是HTML,还有CSS、JS、图片、音视频等),文件格式不再局限于ASCII编码。

HTTP/1.0的解决办法是引入了请求头响应头

accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh

同时也引入了状态码,为了减轻服务器的压力,提供了Cache机制。服务器需要统计客户端的基础信息(Windows 和 macOS),加入了用户代理字段

1.3   http1.1

为了克服HTTP 1.0的这个缺陷,HTTP 1.1支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。

 HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

 在http1.1,request和reponse头中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。 

在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题。 HTTP 1.1通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。如,HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。

在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。

HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。

HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。HTTP/1.0不支持文件断点续传,RANGE:bytes是HTTP/1.1新增内容,HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始。RANGE:bytes=XXXX表示要求服务器从文件XXXX字节处开始传送,这就是我们平时所说的断点续传!

HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:

1 缓存处理

2 带宽优化及网络连接的使用

3 错误通知的管理

4 消息在网络中的发送

5 互联网地址的维护

6 安全性及完整性

1.4  http2.0

相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化: 

 (1) HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。 

 (2) HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。 

 (3) 多路复用,直白的说就是所有的请求都是通过一个TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。

 (4) Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。 HTTP/2 主要是 HTTP/1.x 在底层传输机制上的完全重构,HTTP/2 是基本兼容 HTTP/1.x 的语义的(详细兼容性说明请戳这里)。Content-Type 仍然是 Content-Type,只不过它不再是文本传输了。

2. https

首先介绍两个概念: 

对称秘钥: 对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。通常有两种模式:流加密和分组加密。 

非对称秘钥: 非对称加密算法需要两个密钥:公开秘钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 

 1.HTTPS保证数据安全的机制: 在HTTP的概念中介绍了HTTP是非常不安全的,那么在服务器与客户端传递数据的过程中HTTPS是如何保证数据的安全呢? 1.客户端向服务器端发起SSL连接请求;(在此过程中依然存在数据被中间方盗取的可能,下面将会说明如何保证此过程的安全) 

 2 服务器把公钥发送给客户端,并且服务器端保存着唯一的私钥; 

 3.客户端用公钥对双方通信的对称秘钥进行加密,并发送给服务器端; 

 4.服务器利用自己唯一的私钥对客户端发来的对称秘钥进行解密,在此过程中,中间方无法对其解密(即使是客户端也无法解密,因为只有服务器端拥有唯一的私钥),这样保证了对称秘钥在收发过程中的安全,此时,服务器端和客户端拥有了一套完全相同的对称秘钥。 

 5.进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。

CA(电子商务认证机构)认证作用: 在上面提到的 客户端向服务器端发起请求时存在数据被盗取的过程: 假如服务器端经由中间方向客户端发送公钥的时候,中间方没有将公钥发送给客户端,而是伪造了医药公钥,并将伪造的公钥发送给客户端,此时客户端用中间方伪造的公钥对自己正确的对称秘钥加密并由中间方发送给服务器端,而中间方将用自己伪造的公钥的私钥对其进行解密,得到正确的对称秘钥,并将得到的正确的对称秘钥用服务器端发过来的公钥进行加密发给服务器端,服务器daunt再用正确的私钥进行解密,也得到正确的对称秘钥,此时客户端,服务器端,中间方三者都拥有一套正确的对称秘钥,可以对传送的数据进行加密,解密。 为了解决上述问题,一般情况下,服务器端会向CA申请认证书,此证书包含了CA及服务器端的一些信息(可以理解为类似公章),这样,服务器端将证书发给客户端的过程中,中间方是无法伪造的,保证了,发给客户端的公钥是服务器端发送的。

3.Http与Https的区别

1. HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 

 2. HTTP 是不安全的,而 HTTPS 是安全的 

3. HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 

4. 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层 

5. HTTP 无法加密,而HTTPS 对传输的数据进行加密 

6. HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书 

4.http状态码

1XX Informational(信息性状态码):接收的请求正在处理 

2XX Success(成功状态码):请求正常处理完毕 

 3XX Redirection(重定向状态码):需要进行附加操作以完成请求 

 4XX Client Error(客户端错误状态码):服务器无法处理请求 

 5XX Server Error(服务器错误状态码):服务器处理请求出错 HTTP响应状态码有很多,但是实际经常使用的大概只有14个。 

2XX Success 

200 OK 表示从客户端发来的请求在服务器端被正常处理了。 

 204 No Content 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。 

 206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。 

3XX Redirection 

301 Moved Permanently 永久性重定向。该状态码表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。 像下方给出的请求URI,当指定的资源路径的最后忘记添加斜杠"/",就会产生301状态码 example.com/sample 

302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。 

303 See Other 该状态码表示由于请求对应的资源存在另外一个URI,应使用GET方法定向获取请求的资源。 303状态码和302状态码有着相同的功能,但303状态码明确表明客户端应当采用GET方法获取资源。 当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文的主体,之后请求会自动再次发送。 301,302标准是禁止将POST方法改变成GET方法的,但实际上使用时大家都会这么做。 

304 Not Modified 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。

307 Temporary Redirect 临时重定向。该状态码与302 Found有着相同的含义。307会遵照浏览器标准,不会从POST变成GET。

4XX Client Error 

400 Bad Request 该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次放松请求。

401 Unauthorized 该状态码表示发送的请求需要有通过HTTP认证的认证信息,另外若之前已进行过1此请求,则表示用户认证失败。

403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。

404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

5XX Server Error

500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。

503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 

原文链接:blog.csdn.net/weixin\_377…