超文本传输协议(HyperText Transfer Protocol,HTTP
),是互联网应用最广泛的网络协议。最初的HTTP协议设计用于发送和接收HTML。经过发展演变成为客户端和服务器进行请求(Request
)和响应(Response
)的标准协议。要了解HTTP的运行过程,需要了解大体OSI模型
由下到上,OSI模型描述了整个网络架构中从基础设置到上层应用的框架。
HTTP是建立在TCP/IP协议之上的应用层协议,HTTP规定了请求和响应的报文格式,由TCP/IP协议簇进行转发,送达目标(服务器)之后,按照HTTP协议可以解析得到报文的意义,并进行响应处理。
上图描述的是一个简单的HTTP请求过程,其中HTTP主要起到的作用,就是告知客户端和服务器,如何构建报文,如何解析报文,而传输则交给下层TCP/IP
协议进行。此外还有一些与通信有关系的程序,也做一下介绍:
HTTP报文的构建: 发出的请求信息包括以下几个
请求行和标题必须以作为结尾。空行内必须只有而无其他空格。在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。 返回的响应消息包括下面的几个部分
HTTP1.1 中的请求方法有以下几种
状态码则主要有以下几种类别,每一种类别又有细分的状态码
HTTP 的一种重要的特性就是协议本身是无状态的,也就是服务器在接受同一个用户发起的请求报文的时候,并无法知道这些请求是由同一个用户发送过来,也无法得知这些请求的上下文关系。而我们平时浏览网页特别是需要进行用户验证类的网页,每一次要求用户进行身份验证并不合理。为解决这个问题,就发展出Cookie技术。
Cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。从服务器返回的报文中,通过set-cookie
首部字段,添加cookie(由服务器生成,并通常做加密处理),客户端收到返回报文之后会保存cookie,当下一次客户端向服务器发送请求的时候,会在请求中加入cookie值后发送。服务器获取到cookie之后,会对比之前服务器上的记录(session),从而对请求进行状态识别。
cookie具有长度限制,不同的浏览器之间有细微的差异,一般不能超过4097个字节,超过这个数量的cookie在请求的时候,浏览器会直接忽略。
对于 Cookie 的安全保护是 Web 安全的一个重要因素,常见的将 Cookie 设置为 Httponly,避免js 脚本直接获取 Cookie,同时采用加密传输方式来传输内容,避免中间人攻击。
性能对于传输协议而言至关重要,剥离底层 TCP 协议对传输性能的影响,在 HTTP 层面对性能影响的点有
现在最流行的 HTTP1.1 对于程序员而言,相比于 HTTP1.0 的最大改进在于对长连接的支持,HTTP1.1 默认支持长连接和请求流水线,可以在一个 TCP 连接上传输多个 HTTP 请求,减少建立连接的延迟,体现在报文中是 Connection:keep-alive 的默认开启。
而对于内存,通过引入过期时间等,可以避免重复请求,提高相应速度。
HTTP 在网络上传输采用的是明文信息,可能会被恶意截获从而产生安全问题。为了解决 HTTP 的传输安全性,增加了一个 SSL (Secure Socket Layer)层,HTTPs = HTTP + SSL。
下面简单描述一下 HTTPs 是如何保证数据传输安全的。为了保证数据传输不被截获,那么需要对数据进行加密,传输过程中采用密文进行传输。加密的方法有两类:一类是对称加密,密钥只有一个,内容通过密钥加密后,只能通过这个密钥解密;另一类是非对称加密,密文通过公钥加密后,通过另一个私钥解密,密钥是成对出现的。对称加密算法效率较高,非对称加密算法较为复杂同时效率也比较低。因此 HTTPs 将两者结合起来,实现了在网络中的安全传输,大致原理是,首先通过非对称加密算法协商对称加密的密钥,后续通过协商出来的密钥进行数据的加解密和传输。
其中有几点要补充说明
SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre-master secret就有可能猜测出来,那么仅适用pre-master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端随机数和服务器随机数加上pre-master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机数可能完全不随机,可是三个伪随机数就十分接近随机了。
意思是告知对方,采用协商后的通信密钥进行加密通信,之后 Encrypted Handshake Message 是发送的第一个加密数据。内容就是把当前(准备发送Encrypted Handshake Message)前,自己收到的数据和发送的数据进行一次简单运算 (hash+加密),在解密握手信息的时候,需要双方密钥一致,并且接收方也需要模拟计算握手信息,校验整个通信数据没有被篡改,
绝对安全是一个相对说法,上面的 HTTPs 的机制是单项认证,也就是保证客户端只能访问正确的服务器(通过证书保证)但是无法保证服务器只能被正确的客户端访问,要做到这一点需要增加双项认证,也就是客户端也需要提供自己的证书。客户端校验服务端证书,服务端也校验客户端证书,这在金融行业等会引入,例如网银的USB密钥。相对安全性会高很多。
是的,HTTPs 的主要功能就是这个,但是需要严格管理 CA 证书,安全问题是一步错、步步错。
可以,每一个通信的 Socket 都会协商产生随机数,除非可以完全复制客户端的 Socket 否则无法进行重放攻击。如果是重复提交,需要在系统端进行幂等保证。
soursce:https://fzsens.github.io/web/2015/03/07/brief-http/
喜欢,在看