HTTP(Hyper Text Transfer Protocol 超文本传送协议)请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。(无状态协议:不保存任何状态信息,每个请求都是独立的,服务器不会对前一个请求的响应记忆或记录,即服务器不知道当前请求是属于哪个用户的,也不知道当前请求和前一个请求有什么关系。)
客户端发送请求,服务端响应给客户端。http中,数据称为资源,资源通过url定位的。
URL的一般语法格式为:protocol :// hostname[:port] / path / [:parameters][?query]#fragment
hostname(主机名)
是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。
port(端口号)
整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。
path(路径)
由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
parameters(参数)
这是用于指定特殊参数的可选项。
query(查询)
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
fragment(信息片断)
字符串,用于指定网络资源中的片段。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
发展阶段:
0.9协议(1991年)简洁快速协议,仅限于文字,无法进行内容的协商。协议定义了客户端发起请求、服务端响应请求的通信模式。
请求: GET /index.html
响应: <html><body>Hello HTTP/0.9</body></html>
流程:
客户端和服务端建立TCP连接。
客户端发送GET请求到服务端,请求index.html页面的数据。
服务端发送完响应,关闭TCP连接。
它只有一个命令GET。报文只有一行:GET + 请求的文件路径
服务器发送完内容之后,就关闭TCP连接。
1.0协议(1982年)每一次请求/响应建立并拆除一次连接。
增加了HEAD、POST等新方法。
增加了响应状态码,标记可能的错误原因。
引入了协议版本号概念。
引入了HTTP header的概念,请求头部通过 Accept 告诉可接收的文件类型,响应头部再通过
Content-Type
告诉浏览器返回文件的类型。传输的数据不再局限于文本,也可以实现其他很多功能如缓存、认证信息等。
注意:0.9协议和1.0协议一样每一个TCP连接只能发送一个HTTP请求,服务器发送完响应,就关闭连接。
1.1协议(1999年)双方规定了连接方式和连接类型。
1.长连接keep-alive:引入了 TCP 连接复用,一个TCP 默认不关闭,可以被多个请求复用
2.并发连接:对一个域名的请求允许分配多个长连接
3.管道机制:一个 TCP 连接(同个域名、同一条 TCP 链接),可以同时发送多个请求。(响应的顺序必须和请求的顺序一致,后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回)
4.增加了 PUT、DELETE、OPTIONS、PATCH 等新的方法
5.新增了一些缓存的字段(If-Modified-Since, If-None-Match)
6.请求头中引入了 range 字段,支持断点续传
7.允许响应数据分块(chunked),利于传输大文件
8.强制要求 Host 头,让互联网主机托管成为可能
持久连接时,一个连接中同一时刻只能处理一个请求。当前的请求没有结束之前,其他的请求只能处于阻塞状态,这种情况被称为队头阻塞。
浏览器限制了同一个域名下的 HTTP 连接数,一般为 6 ~ 8 个,域名分片就是为了解决这个问题。
域名分片技术,其实就是资源分域,将资源放在不同域名下 (比如二级子域名下),这样就可以针对不同域名创建连接并请求。
注意:每个 TCP 连接本身需要经过 DNS 查询、三步握手、慢启动等。
2012年google提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性。强制使用HTTPS(HTTPS的安全基础是SSL加密传输协议,HTTPS端口用的是443)
SSL 协议可分为两层:
SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SPDY的方案:
1.针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。
2.针对新问题关键请求被阻塞,SPDY里给每个request设置优先级,这样重要的请求就会优先得到响应。(首页的html内容 > 各种静态资源文件,脚本文件等)
3.针对header很多时候都是重复,选择合适的压缩算法可以减小包的大小和数量。
4.HTTPS的加密协议传输
5.服务端推送(server push):服务端主动把资源推送给客户端。客户端也有权利选择是否接收。
2.0协议(2015年)客户端将每个请求的内容封装成不同的带有编号的二进制帧发送给服务端。服务端将相同编号的帧合并为完整的请求信息(拆分与组合的过程---服务器响应和客户端接收也是这样)
1.二进制协议: HTTP/2版本的头部和数据部分都是二进制,且统称为‘帧’。
2.多路复用: 废弃了 HTTP/1.1 中的管道,同一个TCP连接里面,客户端和服务器可以同时发送多个请求和多个响应,并且不用按照顺序来。
3.头部信息压缩: 头部信息表,有一个索引号,只需要发送索引号即可。
4.服务端主动推送: 服务器主动向客户推送数据。
5.数据流: 每个请求或者响应的所有数据包,称为一个数据流(stream),并且每一个数据流都有一个唯一的编号ID(请求数据流的编号ID为奇数,响应数据流的编号ID为偶数)。在发送的时候带上对应数据流的编号ID,这样服务器和客户端就能分区是属于哪一个数据流。6.可指定数据流的优先级,优先级越高,服务器会越快做出响应。
3.0协议(2018年)放弃 TCP,转而使用基于 UDP (UDP 数据包是一劳永逸的:没有握手、持久连接或错误校正)的 QUIC (快速UDP互联网连接)协议。
提高HTTP的并发能力(服务器能够同时处理的HTTP请求的数量),可以采用以下几种方案:
-
负载均衡:通过负载均衡技术,将请求分摊到多台服务器上进行处理,从而提高系统的并发处理能力。
-
异步编程:异步编程可以使得单个线程能够同时处理多个请求,从而提高服务器的响应速度和并发能力。
-
缓存:通过缓存技术,可以将一些静态资源缓存在客户端或者服务端,减少对服务器的请求,从而提高系统的并发能力。
-
应用层优化:通过应用层优化,可以减少请求的数据量和响应时间,从而提高系统的并发能力。
HTTP请求和响应的过程:
-
客户端向服务器发送HTTP请求。
-
服务器接收到请求后,解析请求头和请求体。
-
服务器根据请求找到对应的资源,如文件或API。
-
服务器处理请求,生成HTTP响应。
-
服务器发送HTTP响应给客户端。
-
客户端接收到响应,解析响应头和响应体。
-
客户端根据响应体进行相应的处理,如渲染页面或执行JS代码。
-
客户端关闭HTTP连接。