一、HTTP 和 HTTPS 的基本概念
HTTP
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
发展历史
版本 | 产生时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991年 | 只有一个命令GET;没有HEADER等描述数据的信息;服务器发送完毕,就关闭TCP连接 | 没有作为正式的标准 |
HTTP/1.0 | 1996年 | 增加了很多命令。比如:POST、PUT、HEADER这些命令;增加了status code和header相关的内容;增加了多字符集支持、多部分发送、权限、缓存等相关的内容。 | 正式作为标准 |
HTTP/1.1 | 1997年 | 优化网络连接:持久连接;增加了pipeline(管道机制),可以在同一个TCP连接里面发送多个http请求;HOST域等 | 2015年前使用最广泛 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
多路复用:通过单一的HTTP/2连接请求发起多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接。(多个请求可以一起返回不用排队)
HTTPS
《图解HTTP》这本书中曾提过HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
二、HTTP VS HTTPS
http和https.png1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)
2、HTTP 是超文本传输协议,信息是明文传输,请求和响应不会对通信方进行确认、无法保护数据的完整性,HTTPS 则是具有安全性的 SSL 加密传输协议。
3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
针对无状态的一些解决策略,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆:
- 通过Cookie/Session技术
- HTTP/1.1持久连接(HTTP keep-alive)方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接
https特点:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
https缺点:
- HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近。
- HTTPS 连接缓存不如 HTTP 高效,会增加数据开销,甚至已有的安全措施也会因此而受到影响。
- HTTPS 协议的安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用。
- SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗。
- 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。
- HTTPS 协议的加密范围也比较有限。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。
三、HTTP原理
客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。
报文从应用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。
为什么需要三次握手呢?为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
TCP三次握手.gif
TCP三次握手的过程如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
为什么需要四次挥手呢?TCP是全双工模式,当client发出FIN报文段时,只是表示client已经没有数据要发送了,client告诉server,它的数据已经全部发送完毕了;但是,这个时候client还是可以接受来server的数据;当server返回ACK报文段时,表示它已经知道client没有数据发送了,但是server还是可以发送数据到client的;当server也发送了FIN报文段时,这个时候就表示server也没有数据要发送了,就会告诉client,我也没有数据要发送了,如果收到client确认报文段,之后彼此就会愉快的中断这次TCP连接。
FIN: 结束
ACK: 应答
http常见状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
状态码分类
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
四、HTTPS原理
- 客户端用服务器发送请求。将支持的协议版本,支持的加密方法,支持的压缩方法,一个客户端生成的随机数1发送过去。
- 服务器回应。返回信息给客户端:确认使用的加密通信协议版本,确认使用的加密方法,服务器证书,一个服务器生成的随机数2。
- 客户端解析证书,验证身份,没问题就生成一个用于通讯的 "对称密码",然后用服务器的公钥对其加密发送给服务端,并用三个随机数和证书中的公钥生成会话秘钥。
- 服务器也用三个随机数生成会话秘钥,通知客户端握手结束。客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验,使用普通的HTTP协议。
五、如何优化HTTPS的速度
1、HSTS重定向技术:将http自动转换为https,减少301重定向
2、TLS握手优化:在TLS握手完成前客户端就提前向服务器发送数据
3、会话标识符:服务器记录下与某客户端的会话ID,下次连接客户端发ID过来就可以直接用之前的私钥交流了
4、OSCP Stapling:服务器将带有 CA 机构签名的 OCSP 响应在握手时发给客户端,省的客户端再去CA查询
5、完全前向加密PFS:使用更牛逼复杂的秘钥算法
六、TCP,HTTP和SOCKET
OSI网络七层模型
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;(Http协议位于该层)
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输;(Tcp协议位于该层)
第五层:网络层。定义网络设备间如何传输数据;(IP位于该层)
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据。
TCP
TCP协议主要是在传输层,三次握手四次挥手
HTTP
HTTP协议是建立在TCP协议之上的一种应用。
HTTP是基于请求响应模式且无状态的协议,1.1之前只支持短连接,也就是请求响应一次以后连接中断,下次需要重新进行TCP连接,
而1.1之后支持长连接,即进行一次TCP连接以后,客户端可以发送多次的HTTP请求给服务器端,如果服务器长时间未收到请求,则认为网络断开。
HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
SOCKET
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
与HTTP和WebSocket不一样,socket不是协议,它是在程序层面上对传输层协议(可以主要理解为TCP/IP)的接口封装。可以理解为一个能够提供端对端的通信的调用接口(API)。 WebSocekt借鉴了 socket 的思想,为 client 和 server 之间提供了类似的双向通信机制
Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
socket长链接: 在一个TCP连接上可以连续发送多个数据包。如果没有数据包发送,需要双方发检测包(心跳包)维持连接。
短连接的操作步骤:
连接->数据传输->关闭连接
长连接的操作步骤:
连接->数据传输->保持连接(心跳)->数据传输->保持连接(心跳)-> … ->关闭连接
心跳包就是客户端和服务端间定时通知对方自己状态的一个自己定义的命令子,按照一定时间间隔发送,类似心跳,所以叫心跳包。所谓“心跳”就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己在西安,以确保连接有效性。
Socket连接池就是维护着一定数量socket长连接的集合,它能自动检测socket长连接的有效性,剔除无效连接,补充连接池的长连接的数量。
网友评论