HTTP介绍
http是一个超文本传输协议。是一个客户端和服务器端请求和应答的标准。是一个基于请求与响应,无状态的,应用层协议,通常基于TCP/IP协议传输数据。
特点:
- 无状态:协议自身不对请求和响应之间的通信状态进行保存,任何两次请求之间都没有依赖关系。
- 无连接:服务器处理完客户端的请求,并收到客户端的应答后,立即断开连接。
- 基于请求与响应:由客户端发起请求,服务端响应
- 优点:简单快速灵活
HTTP的发展历程
| 版本 | 时间 | 主要内容 |
|---|---|---|
| HTTP/0.9 | 1991年 | 只有GET请求,不涉及数据包传输(只有文本传输) |
| HTTP 1.0 | 1996年 | 传输内容格式不限、增加HEAD、POST 等新方法、响应状态码、增加请求头 |
| HTTP 1.1 | 1997年 | 客户端缓存(强缓存和协商缓存)、长连接(持久连续)、断点续传优化、新增请求方法和状态码:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法 |
| HTTP 2.0 | 2015年 | 多路复用、服务端推送、头部压缩、二进制分帧 |
| HTTP 3.0 | 2021年 | 类似TCP的流量控制、集成TLS加密、快速握手 |
长连接:HTTP 1.1的长连接(Connection: keep-alive)是复用一个TCP连接,在一个TCP中可以发送多次请求,当客户端与服务端的某一方或者同时关闭连接的时候,或者网络原因,这个连接才会断掉。缺点是HTTP 1.1 基于串行文件传输数据,因此这些请求必须是有序的。
多路复用:客户端和服务端可以并行发起或者回复,避免串行带来的阻塞。HTTP2.0对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一次连接。提高了最大并发数。
二进制分帧:HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。二进制分帧层在 应用层(HTTP/2)和传输层(TCP or UDP)之间。
HTTP2.0 引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据。
缓存处理:HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
HTTP1.1的缺点
- 无状态特性,带来巨大的HTTP头部(解决方案:头部压缩)
- 明文传输,不安全
- 不支持服务器推送消息
- 请求延迟比较高:浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制,而超过限制数目的请求会被阻塞(解决方案:多路复用)
HTTP2.0的缺点
- TCP建立连接的延迟(握手延迟)
- TCP的队头阻塞没有彻底解决
HTTP1.1和HTTP2的主要区别
- HTTP2采用二进制分帧(基于SPDY)
- HTTP2是完全
多路复用的,而非有序并阻塞的——只需一个连接即可实现并行 - 使用报头压缩,HTTP2降低了开销
- HTTP2让服务器可以将响应主动“推送”到客户端缓存中
HTTP3
HTTP3.0的底层支撑协议QUIC基于UDP实现,又含TCP的特点,实现了又快又可靠的协议。
HTTP报文
HTTP交互的信息称为HTTP报文,HTTP报文是由多行数据构成的字符串文本。
HTTP请求报文主要包括请求行(由请求方法、URL和HTTP协议版本组成)、请求头部、请求的实体(传参)三部分,HTTP响应报文同样也分为三部分,有状态行(协议版本、状态码与原因短语)、响应头部、实体。
HTTP缺点
- 通信使用明文传输不安全
- 不验证通信方身份可能遭遇伪装
- 无法证明报文完整性,可能遭篡改
HTTPS介绍
可以理解为 HTTPS = HTTP + 加密 + 认证 + 数据完整性保护。基于HTTP协议,通过SSL或TSL提供加密数据处理、认证身份以及数据完整性保护。
特点:
- 内容加密:采用混合加密(结合非对称加密和对称加密技术),中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人篡改
SSL建立连接过程
- 客户端向服务器发送请求(发送随机值1和客户端加密算法)
- 服务器接收到后给客户端发送响应握手(发送随机值2和协商好的加密算法)
- 服务器给客户端发送第二个响应报文(数字证书:一对公钥和私钥)
- 客户端解析证书。(TLS验证公钥是否有效,如果没有问题就生成随机值:预主秘钥)
- 认证通过后,组装所有随机值成会话秘钥,通过证书的公钥加密会话秘钥
- 传输加密信息
- 服务端解密,组装会话秘钥,和客户端一致
- 客户端通过会话秘钥加密信息给服务器,验证服务器是否能正常接受消息
- 服务器通过会话秘钥加密消息并回传给客户端,如果客户端正常接受就表面连接建立
缺点
- 依然对黑客攻击、服务器劫持等方面没有什么安全作用
- https页面加载时间比http长,影响用户体验
- 连接缓存不如http高效,流量成本高
- 服务器端资源占用更多,需要更高的成本
TCP/IP协议族
TCP/IP协议族分层划分。
- 应用层:向用户提供应用服务时的通信活动,如FTP(文件传输协议)、DNS(域名系统,提供域名到IP地址的解析服务)、
HTTP - 传输层:
TCP(传输控制协议,提供可靠的字节流服务)以及UDP(用户数据报协议) - 网络层:处理网络上流动的数据包,如
IP协议 - 数据链路层:处理网络连接的硬件部分
HTTP的通信传输
- 建立TCP连接(三次握手建立连接)
- 客户端向服务器发送请求,客户端发送请求头
- 服务器应答,服务器发送应答头,服务器发送数据
- 服务器关闭连接(如果Connection: keep-alive,发送完数据连接也不会断开)
TCP三次握手过程:
- 客户端发送带SYN标志的数据包给服务器
- 服务器收到后,回传一个SYN/ACK标志的数据包确认信息
- 客户端最后回传一个ACK标志数据包,代表握手结束
三次握手优点:确认可靠传输;防止已失效或者滞留过期的信息发送到服务端,导致资源浪费。
TCP四次挥手:
- 客户端发送一个释放连接TCP数据报文段
- 服务器进入关闭等待状态,并向客户端发送一条普通的TCP确认报文段
- 服务器没有数据后会向客户端发送一条TCP释放连接报文段
- 客户端回向服务器发送一个TCP确认报文段
TCP与UDP的区别
- TCP是面向连接的,UDP是无连接的
- TCP提供可靠的服务,UDP是不保证可靠性交付(可能丢包)
- TCP是面向字节流,UDP是面向报文
- TCP只能是1对1的,而UDP可以1对1,也可以1对多
有些应用场景对可靠性要求不高会用到UPD,比如直播,要求速率。
常见状态码
- 1xx:指示信息
- 2xx:成功
- 3xx:重定向
- 301:永久性重定向(如果没有额外指定,这个响应默认会被浏览器缓存)
- 302:临时重定向(这个响应默认不会被浏览器缓存)
- 304:对客户端有缓存情况下服务端的一种响应(发送附带条件的请求时,条件不满足时返回,与重定向无关)
- 4xx:客户端错误
- 400:请求报文语法有误,服务器无法识别
- 401:请求需要认证
- 403:请求的对应资源禁止被访问
- 404:服务器无法找到对应资源
- 5xx:服务器端错误


