HTTP(Hyper-Text Transfer Protocol,超文本传输协议),完成从客户端到服务器的一系列运作流程。是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP的发展历程:
HTTP 的最早版本诞生在 1990 年,这个最早版本和现在比起来极其简单,没有 HTTP 头,没有状态码,甚至版本号也没有。并没有作为正式的标准被建立。HTTP/0.9 包含了1.0以前的所有版本。只支持一种方法—— Get,请求只有一行。get/hello.html 响应也是非常简单的,只包含 html 文档本身。
当 TCP 建立连接之后,服务器向客户端返回 HTML 格式的字符串。发送完毕后,就关闭 TCP 连接。由于没有状态码和错误代码,如果服务器处理的时候发生错误,只会传回一个特殊的包含问题描述信息的 HTML 文件。这就是最早的 HTTP/0.9 版本。
1996年5月http 1.0协议:所有信息明文公开。无状态,每次发送数据都要建立起tcp连接,且只能发送一个数据包,接收方只能接受一个数据包,只能发送文字,耗时长,效率低。
1997年http1.1协议:设计了一种长连接(persistent connection),在一次通信中,可以保持tcp连接不断开。可以收发多个数据包,内容可以是文字,图片,视频等。
2015年,http2发布,实现了“多工”方式,双方可以同时实时向对方发生那个数据。同时,将所有的信息格式都定义为2进制,为了将来能直接发送更高级的应用二方便解码。
HTTP的工作原理:
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的步骤:
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP的缺点:
1、http协议发送的数据都是明文发送,信息容易被窃取和篡改。互联网上的任何角落都存在着通信内容被窃听的风险。HTTP本身不具备加密的功能,无法做到对通信整体进行加密。
目前,最为普及的保护信息的手段就是加密技术,加密的对象可以是:
1)通信加密,通过SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了。与SSL组合适用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)或HTTP over SSL。
2)内容的加密。客户端需要对HTTP报文进行加密处理后再发送请求。
2、不验证通信方的身份,可能遭遇伪装。
HTTP协议中的请求和响应不会对通信方进行确认。不论是谁发送过来的请求都会返回响应。会造成以下隐患:
● 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器。
● 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
● 无法判定请求是来自何方、出自谁手。
● 即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击(Denial of Service,拒绝服务攻击)。
SSL使用了证书手段用于确定通信方。
3、无法证明报文的完整性。请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack,MITM)。
加密方法:
加密方式有两种,对称加密和非对称加密。
对称加密:也称为单密钥加密,即加密解密是使用同一把密钥。速度较快,使用的CPU资源少。
非对称加密:使用一对密钥:公钥和私钥。私钥与公钥是一对多的关系,公钥用于签名,私钥用于验证。私钥需要私自保管在本地,不能泄露,公钥可以随意在网上传输发送。
密钥使用改进过程:
只要有人截获KEY,发送伪造的KEY,那么之后的所有消息都将被监听。
因而,直接传输密钥是不安全的,需要对密钥进行加密。
如果使用对称加密来加密密钥,那么密钥的密钥在传输过程中仍然是不安全的,需要再对密钥的密钥加密。这将无限叠加,最终仍是不安全的,而且显然不合理。
如果使用非对称加密,首先服务器生成一对公钥和私钥,将公钥发送出去;对方收到公钥后,本地使用对称加密生成一个密钥KEY,然后使用公钥加密这个密钥KEY,发送;服务器收到公钥加密的数据后,使用私钥解密,得到KEY。这时,双方可以使用KEY来加密数据,开始安全地交流。 (即使中间人截获了公钥加密的数据,但是由于没有私钥(私钥只有签发公钥的服务器保管,不会用于传输)所以无法解密出KEY。)
设想图如下:
假如服务器在传输公钥给客户端时,公钥被截获,中间人自己生成一对公钥私钥,并将伪造的公钥传到客户端,这样一来,又被完全监听了。
此时,产生了这种情况:客户端使用的是KEY1,服务器使用的是中间人伪造的KEY2,而中间人拥有KEY1,KEY2。所以中间人可以无限篡改数据。
SSL提供证书机制,通信方可以向第三方申请证书,证书验证通信双方,也可以对公钥进行加密传输。首先,第三方机构颁发给服务器公钥A,这个公钥A是绝对可信任的。以后,客户端如果想和服务器通信,就会想第三方申请证书,证书将用于对客户端的公钥B进行加密,然后服务器将公钥B加密后传输给客户端,因为客户端已经收到了第三方颁发的公钥A,只要用这个公钥A来解密数据,若能解开,便能取出客户端的公钥B。
但若是中间人截获了证书,客户端收到的将是伪造的公钥。
可以发现有可能出现两个问题:
证书被中间人截获,使用CA公钥篡改
中间人将自己的证书伪造成源服务器发送的
数字签名用来解决这个问题1。
对于可能出现的问题2,由于证书B也是第三方机构签发,所以数字签名可以通过验证,但是证书中包含了host信息,假如客户端正在访问的host和证书中的host不一样,浏览器会发出警告。
至此,基本实现了加密传输。