HTTP 协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,一般用户服务端和客户端之间的通讯,即请求 应答模型。
作为Web文档传输协议的HTTP,版本更新十分缓慢,目前只更新了4个版本。
HTTP使用统一资源标识符(URI)来建立连接和传输数据。
通过学习网络发展史我们了解到,http属于应用层协议,此层协议传递消息的数据统称为 报文(即站点一次性要发送的数据块)。
URL统一资源定位符,它是URI一子集,是URI的具体实现。URL根据提供的是地址信息,不仅标识了资源,还能定位到此资源。
与之对应的 还有一个URI的子集 URN-统一资源名称,它的作用是不论资源在何处,都能保持有效。
总之都比较抽象。
请求报文
HTTP请求报文由3部分组成:请求行(Request Line)+请求头(Request Header)+请求体(Request Body)

响应报文
HTTP响应报文也由3部分组成:响应行(Response Line)+响应头(Response Header)+响应体(Response Body)

怎么查看报文
现代浏览器上都可以查看,点击网络,选择你需要看的那个请求,然后左侧就会出现相关的报文信息。
需要注意的是,大部分浏览器都喜欢把报文行与报文头都放在 消息头/标头菜单栏的报文头里。而报文体确单独拎出去在顶部菜单请求和响应里。

发展史
HTTP/0.9
HTTP/0.9是最早的HTTP协议版本,它的设计初衷非常简单,主要用于在客户端和服务器之间传输HTML文件。这个版本的协议非常基础,没有太多的复杂功能。
HTTP0.9中 尚还没有标头的概念,也只支持GET请求。
请求报文
请求报文中,即没有请求标头,也没有协议版本号,因此非常简单,只包含GET请求行和请求的资源路径
响应报文
服务器在接收到请求后,会读取对应的HTML文件返回给客户端。这个返回的数据块也可以看作是响应报文,尽管它没有明确的报文头和状态码等HTTP后续版本中常见的元素。
HTTP/1.0
支持了多种请求类型
报文的 报文行 增加了协议版本号,会随着每个请求或响应自动发送,响应行还增加了状态码
出此之外,报文中引入了报文头(也叫标头,或者请求/响应头)的概念,通过它让HTTP协议一下就丰富了起来
最后,开始支持缓存技术和链接复用(长连接)技术,但是都不好用。
HTTP/1.1
在 HTTP/1.0 发布的几个月后,HTTP1.1 标准发布,做了大量优化以及改进,这个版本才是最后大家用的最多,心里最正统的第一版。
- 增加了更好的缓存机制
- 连接复用的优化,即长链接
- 增加管线化技术
长链接(keep-alive)
在HTTP1.0的时候需要手动开启,而在次版本则默认开启。
在长链接下,相同的HOST的HTTP请求会被应用在一个TCP上,但是出于安全和服务器压力的考虑单个TCP只允许承载n个HTTP,比如chrome最多是6个,这取决于浏览器的限制。
管线(pipelining)
也叫做流水线技术,指的是在长链接的基础上,同一个TCP中的HTTP会被一起发送,不需要等待服务器对前一个请求的响应。
但在单个TCP连接上的HTTP请求和响应仍然是按照发送请求的顺序进行串行处理的。即一个请求的响应必须完全返回后,下一个请求才会开始在该连接上传输,这个叫做 串行处理中的队头阻塞(序列和阻塞机制)问题。
HTTP/2
- 压缩HTTP头部
- 采用体积更小的二进制报文替代之前的明文的文本报文
- 请求多路复用,改善串行为并行
- 服务端推送,改善“请求 - 应答”,服务也可主动发
多路复用
为了串行处理中的队头阻塞问题,HTTP/2协议引入了的解决办法。
多路复用指的是 是通过分帧并且给每个帧打上流的 ID 去避免依次响应的问题,对方接收到帧之后根据 ID 拼接出流,这样就可以做到乱序响应从而避免请求时的队首阻塞问题。
HTTP/3
HTTP/3显著减少了连接建立的时间,因为它使用基于UDP的QUIC协议,而不是传统的TCP。
QUIC在初次连接时仅需一次RTT(Round-Trip Time),重用现有连接则无需再执行握手,进一步降低了延迟。
其它知识
URI和URL区别
URI用于唯一的标识互联网上的信息资源,不管用什么方法表示只要能定位一个资源它就是URI,比如: