分享

应用层协议HTTP和HTTPS详解

 gaolidabangzi 2019-12-31

什么是HTTP?

HTTP全称是HyperText Transfer Protocal,即超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,HTTP是应用层协议,当你上网浏览网页的时候,浏览器和web服务器之间就会通过HTTP协议在Internet上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。

什么是HTTPS?

HTTPS是超文本传输安全协议(HTTPS,常称为 HTTP over TLS/SSL),是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTP请求过程详解

当我们在浏览器地址栏中输入网站地址,然后回车,浏览器会呈现网站页面信息。这个过程经历了域名解析、三次握手创建TCP连接、建立TCP连接后发起HTTP请求、服务器响应HTTP请求、浏览器解析html代码,同时请求html代码中的资源(如js、css、图片等)、浏览器对页面进行渲染并呈现给用户。

1 域名解析

以Chrome浏览器为例,浏览器首先搜索自身的DNS缓存,如果DNS缓存中存在域名对应的未过期的IP地址,则解析成功。浏览器DNS缓存有效期比较短,且容纳有限。如浏览器缓存无有效的记录,浏览器会搜索操作系统的DNS缓存(Windows系统通过命令ipconfig /displaydns查看系统DNS缓存)。如操作系统的DNS缓存中无有效记录,尝试读取位于【C:\Windows\System32\drivers\etc】下的hosts文件。如hosts文件中无有效的记录,浏览器会向DNS服务器发起请求,直到找到域名对应的IP。

2 TCP三次握手创建连接

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。在数据传输之前,客户端通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果服务端发来确认应答,则认为可以进行数据通信。如果服务端确认应答未能到达,就不会进行数据通信。TCP三次握手创建连接过程参考下图:

应用层协议HTTP和HTTPS详解

3 浏览器发起HTTP请求

TCP三次握手创建连接后,浏览器按照协议向服务端发送HTTP请求,服务端接收到请求后,解析HTTP请求,处理完请求后,根据协议返回标准格式的HTTP响应到浏览器。

3.1 HTTP请求包含请求行、请求头、请求数据、空行

请求行(HTTP方法字段、URL字段和HTTP协议版本)

HTTP/1.1协议中共定义了八种方法,来表明Request-URL指定的资源不同的操作方式。HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。请求行实例:GET /index.html HTTP/1.1

应用层协议HTTP和HTTPS详解

请求头(key/value形式)

HTTP协议的请求和响应报文中必须包含HTTP首部,HTTP首部采用键值对的形式,如下图:

应用层协议HTTP和HTTPS详解

Accept:表示浏览器支持的 MIME 类型。

Accept-Encoding:表示浏览器解码方式。

Accept-Language:表示客户端接受的语言格式。例子:zh-CN,zh;q=0.9 0.9代表的是zh的权重。

Connection:开启HTTP持久连接,可设定为keep-alive或者close

在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。这样每次请求都会重新建立和断开 TCP 连接,代价过大。在 HTTP/1.1 中,HTTP请求的Head中的Connection默认为keep-alive,请求结束之后不会断开TCP连接,除非设置Connection为 close。这样TCP连接可以重复使用,之后发送HTTP请求的时候不需要重新建立TCP连接,同步避免SSL的开销。

同一个TCP连接可以同时发送多个HTTP请求吗?

HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两个请求的生命周期不能重叠,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。虽然 HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。Pipelining支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。这种设想看起来比较美好,但是在实践中会出现许多问题。但是,HTTP/2.0 提供了 Multiplexing 多路传输特性,可以在一个 TCP 连接中同时完成多个 HTTP 请求。

Pipelining技术缺陷

一些代理服务器不能正确的处理 HTTP Pipelining;正确的流水线实现是复杂的;Head-of-line Blocking 连接头阻塞。在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。

那么在 HTTP/1.1 时代,浏览器是如何提高页面加载效率的呢?主要有下面两点:维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。和服务器建立多个 TCP 连接。

Cookie:表示服务端给客户端传的http请求状态。因为Http是无状态协议,无法感知到上一次请求状态,所以产生了cookie。

Host:请求头指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的TCP端口号。HTTP/1.1中必须要指明Host,如果没指明,或者指明多个,或返回404状态。

Referer:表示请求的上一个页面是什么。这个字段可以用来做访问统计,还可以做防盗链,比如在其他站点中引用了qq空间的图,可以通过字段判断是否合法。

User-Agent:表示首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。常被用于判断请求来源,例如:微信、谷歌浏览器等。

Content-type:指定请求数据的格式 例如:application/json, text/javascript, */*; q=0.01

请求数据

请求数据是被提交到服务端的资源,通过Content-type指定资源的类型。常见的格式类型如下:

应用层协议HTTP和HTTPS详解

3.2 HTTP响应

服务器接收处理完请求后返回一个HTTP响应给客户端。HTTP响应包括:状态行、响应头、空行、消息体。

状态行

表示请求状态 例如:HTTP/1.1 200 OK

响应头(key/value形式)

响应报文中首部采用键值对的形式,常见响应头信息如下图:

应用层协议HTTP和HTTPS详解

消息体

服务端返回给客户端的HTML文本内容。或者其他格式的数据,比如:视频流、图片或者音频数据。通过响应头中Content-type指定返回数据的类型。

4 浏览器解析html代码,并请求html代码中的资源

浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器端发起HTTP请求,如果服务器端返回304状态码(告诉浏览器服务器端没有修改该资源),那么浏览器会直接读取本地的该资源的缓存文件,否则开启新线程向服务器端去请求下载。这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源。如果资源文件比较多的情况,浏览器创建多个TCP连接同时请求资源文件,但是同一域名浏览器限制TCP最大连接数,谷歌浏览器的TCP连接数最大是6个。.

5 渲染

浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,再呈现给用户。

HTTPS请求详解

HTTP协议传输数据是明文传输,截获数据后就能看到传输的数据,这显然不安全。1994年,Netscape公司在HTTP的基础上加入SSL(Secure Socket Layer),称为'HTTP over SSL'或者'HTTP Secure',也就是我们现在熟知的HTTPS。SSL/TLS是位于TCP/IP 7层协议中的会话层,用于认证用户和服务器,加密解密数据以及维护数据的完整性,确保数据在传输过程中不会被修改。TLS(Transport Layer Security,传输层安全协议)是IETF制定的一种新的协议,TLS1.0是建立在SSL3.0协议规范之上,是SSL3.0协议的后续版本。HTTPS请求过程大致如下:

1 域名解析

2 三次握手创建TCP连接

3 客户端发起SSL/TLS认证

4 服务端返回公钥和证书到客户端

5 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,把加密后的随机数发给服务端。

6 服务端接受到这个加密后的随机数后,会用私钥对其解密,得到真正的随机数,随后用这个随机数当做秘钥对需要发送的数据进行对称加密。

7 客户端在接收到加密的数据后,使用秘钥(即生成的随机值)对数据进行解密,并且解析数据呈现结果给客户。

应用层协议HTTP和HTTPS详解

下图是抓包工具截获的HTTPS请求内容

应用层协议HTTP和HTTPS详解

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多