HTTP是什么?
HTTP: HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol。是一个基于请求与响应,无状态的,Web服务的应用层的协议,常基于TCP传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
HTTP超⽂本协议传输,它可以拆成三个部分:超文本、传输、协议。
协议:HTTP 是⼀个⽤在计算机世界⾥的协议。它使⽤计算机能够理解的语⾔确⽴了⼀种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理⽅式(⾏为约定和规范)。
传输:就是把⼀堆东⻄从 A 点搬到 B 点,或者从 B 点 搬到 A 点。别轻视了这个简单的动作,它⾄少包含两项重要的信息。HTTP 协议是⼀个双向协议。
超文本:HTTP传输的内容是超⽂本,它就是超越了普通⽂本的⽂本,它是⽂字、图⽚、视频等的混合体,最关键有超链接,能从⼀个超⽂本跳转到另外⼀个超⽂本。
HTTP的优缺点
HTTP优点
HTTP的主要优点是简单、灵活、易于拓展、应该广泛以及跨平台。
1. 简单
HTTP 基本的报文格式就是 header + body ,头部信息也是 key-value 简单⽂本的形式。
2. 灵活和易于扩展
HTTP协议⾥的各类请求⽅法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发⼈员⾃定义和扩充。同时 HTTP 由于是⼯作在应⽤层( OSI 第七层),则它下层可以随意变化。
HTTPS 也就是在 HTTP所在的应用层与TCP所在的传输层之间增加了 SSL/TLS 安全传输层,HTTP/3 甚⾄把 TCP 层换成了基于 UDP 的QUIC。
3. 应用⼴泛和跨平台
互联⽹发展⾄今,HTTP 的应⽤范围⾮常的⼴泛,HTTP 的应⽤遍地开花,同时天然具有跨平台的优越性。
HTTP缺点
由于HTTP是无状态、明文传输的因此数据不安全。
无状态的优缺点
⽆状态的好处,因为服务器不会去记忆 HTTP 的状态,因此不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。
⽆状态的坏处,既然服务器没有记忆能⼒,它在完成有关联性的操作时会⾮常麻烦
HTTP 的安全问题,可以用HTTPS 的方式解决,也就是通过引⼊ SSL/TLS 层,使得在安全上达到了极致。
HTTP属于客户/服务器模式
客户: 请求、接收和显示Web对象的浏览器;
服务器: 对请求进行响应,发送对象的Web服务器。
基于TCP连接的HTTP
1.客户发起一个与服务器的 TCP连接 (建立套接字) , 端口号为 80
2.服务器接受客户的TCP连接
3.在浏览器(HTTP客户端) 与 Web服务器(HTTP服 务器 server)交换HTTP报文 (应用层协议报文)
4.TCP连接关闭
HTTP是无状态的,即服务器并不维护关于客户的任何信息。
维护状态的协议很复杂:
1.必须维护历史信息(状态)
2.如果服务器/客户端死机,它们的状态信息可能不一致, 但二者的信息必须是一致,因此会需要重新连接
3.无状态的服务器能够支持更多的客户端
非持久与持久HTTP
非持久HTTP
非持久HTTP,最多只有一个对象在,TCP连接上发送,下载多个对象需要多个TCP连接。HTTP/1.0使用非持久连接。
非持久链接:
响应时间模型
往返时间RTT(round-trip time):一个小的分组从客户端到服务器,在回到客户端的时间(传输时间忽略)。
响应时间:一个RTT用来发起TCP连接,一个 RTT用来HTTP请求并等待HTTP响应
文件传输时间共:2RTT+传输时间
非持久HTTP的缺点
时间长,每个对象要2个RTT;操作系统必须为每个TCP连接分配资源,但浏览器通常打开并行TCP连接,以获取引用对象。
持久HTTP
持久HTTP,多个对象可以在一个(在客户端和服务器之间的)TCP连接上传输。服务器在发送响应后,仍保持TCP连接。在相同客户端和服务器之间的后续请求和响应报文通过相同的连接进行传送,客户端在遇到一个引用对象的时候,就可以尽快发送该对象的请求。HTTP/1.1 默认使用持久连接。
持久分为流水线和非流水线。
非流水方式的持久HTTP:客户端只能在收到前一个响应后才能发出新的请求,每个引用对象花费一个RTT。
流水方式的持久HTTP:HTTP/1.1的默认模式,客户端遇到一个引用对象就立即产生一个请求,所有引用(小)对象只花费一个RTT是可能的。
HTTP的版本
HTTP/0.9
只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0
第一个在通信中指定的版本号,至今被广泛采用,特别是在代理服务器中。
HTTP/1.1
当前版本号,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
但是HTTP/1.1仍有性能瓶颈,如
请求 / 响应头部(Header)未经压缩就发送,⾸部信息越多延迟越⼤。只能压缩 Body 的部分;
发送冗⻓的⾸部。每次互相发送相同的⾸部造成的浪费较多;
没有请求优先级控制,服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端⼀直请求不到数据,也就是队头阻塞;
HTTP/2.0
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
HTTP/2的改进:
1.头部压缩
HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是⼀样的或是相似的,那么,协议会帮你消除重复的部分。 这就是所谓的 HPACK 算法:在客户端和服务器同时维护⼀张头信息表,所有字段都会存⼊这个表,⽣成⼀个索引号,以后就不发送同样字段了,只发送索引号,这样就提⾼速度了。
2.⼆进制格式
HTTP/2 不再像 HTTP/1.1 ⾥的纯⽂本形式的报⽂,⽽是全⾯采⽤了⼆进制格式,头信息和数据体都是⼆进制,并且统称为帧(frame):头信息帧和数据帧。
3.数据流
HTTP/2 的数据包不是按顺序发送的,同⼀个连接⾥⾯连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。每个请求或回应的所有数据包,称为⼀个数据流( Stream )。每个数据流都标记着⼀个独⼀⽆⼆的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数。
客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求。
4.多路复⽤
HTTP/2 是可以在⼀个连接中并发多个请求或回应,⽽不⽤按照顺序⼀⼀对应。移除了 HTTP/1.1 中的串⾏请求,不需要排队等待,也就不会再出现队头阻塞问题,降低了延迟,⼤幅度提⾼了连接的利⽤率。
5. 服务器推送
HTTP/2 还在⼀定程度上改善了传统的「请求 - 应答」⼯作模式,服务不再是被动地响应,也可以主动向客户端发送消息。
HTTP/1.1与HTTP/1.0的区别
1.persistent connection(持久连接)
HTTP/1.0:每对请求/ 响应都需要建立新的TCP连接。
HTTP/1.1:支持持久连接(默认),持久连接的特点是,只要任意⼀端没有明确提出断开连接,则保持 TCP 连接状态。
2.Host域
HTTP/1.1在请求消息头多一个Host域;HTTP/1.0 则没有这个域,建立TCP连接的时候已经指定了IP地址,而且默认一个IP地址只对应一个主机名,IP地址上只有一个host。
3.请求方法和状态码
HTTP1.1增加了OPTIONS, PUT, DELETE, TRACE, CONNECT这些Request方法。
HTTP/1.0中只定义了16个状态响应码,对错误或警告的提示不够具体。HTTP/1.1引入了一个Warning头域,增加对错误或警告信息的描述。
在HTTP/1.1中新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.内容协商
为了满足互联网使用不同母语和字符集的用户,一些网络资源有不同的语言版本(如中文版、英文版)。
HTTP/1.0定义了内容协商 (content negotiation)的概念,也就是说客户端可以告诉服务器自己可以接收以何种语言(或字符集)表示的资源。例如如果服务器不能明确 客户端需要何种类型的资源,会返回300(Multiple Choices),并包含一个列表,用来声明该资源的不同可用版本,然后客户端在请求消息中包含Accept-Language和Accept- Charset头域指定需要的版本。
5.带宽优化
HTTP/1.1中在请求消息中引入了range头域,它允许只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码为206(Partial Content),它可以防止Cache将响应误以为是完整的一个对象。请求消息中如果包含比较大的实体内容,但不确定服务器是否能够接收该请求(如是否有权限),此时若贸然发出带实体的请求,如果被拒绝也会浪费带宽。 HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码 401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。注意,HTTP/1.0的客户 端不支持100响应码。
节省带宽资源的一个非常有效的做法就是压缩要传送的数据。Content-Encoding是对消息进行端到端(end-to-end)的编码,它可能是 资源在服务器上保存的固有格式(如jpeg图片格式);在请求消息中加入Accept-Encoding头域,它可以告诉服务器客户端能够解码的编码方 式。而Transfer-Encoding是逐段式(hop-by-hop)的编码,如Chunked编码。在请求消息中加入TE头 域用来告诉服务器能够接收的transfer-coding方式。
HTTP/2有什么不足?
HTTP/2 主要的问题在于,多个 HTTP 请求在复⽤⼀个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。所以⼀旦发⽣了丢包现象,就会触发 TCP 的重传机制,这样在⼀个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。
HTTP/1.1 中的管道( pipeline)传输中如果有⼀个请求阻塞了,那么队列后请求也统统被阻塞住了。
HTTP/2 多个请求复⽤⼀个TCP连接,⼀旦发⽣丢包,就会阻塞住所有的 HTTP 请求。
这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP。
HTTP常见字段
Host字段:客户端发送请求时,⽤来指定服务器的域。
Connection:最常⽤于客户端要求服务器使用TCP 持久连接,以便其他请求复⽤。
Content-Length:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。
Content-Type:字段⽤于服务器回应时,告诉客户端本次的数据格式。
Content-Encoding :说明数据的压缩⽅法。表示服务器返回的数据使⽤了什么压缩格式。
HTTP请求报文
HTTP报文有两种类型:请求、响应。
HTTP请求报文
第一种:ASCII (人能阅读)
由请求行(GET、POST、HEAD命名组成)、首部行和换行回车符(表示报文结束)组成。