HTTP详解!你了解有多少?(系列一)

Posted 强码人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP详解!你了解有多少?(系列一)相关的知识,希望对你有一定的参考价值。

        今天花点时间,来整理一下http的知识!

        以往了解到的http相关的知识都是在和页面打交道的时候所了解到的一些。零零散散,不得真形。作为一个前端开发人员,全面了解http是十分有必要的,因为它将能给我们的日常开发带来许多便捷,同时也能帮助我们去了解到更深层次的浏览器工作原理。

我将从以下几个方面来详细道来:
一.http是什么

HTTP(hypertexttransport protocol)其英文翻译为超文本传输协议。

百度百科对http协议的介绍:

HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP协议进行通信的HTTP的实现程序。

简而言之,我们可将这个词组拆分开来看:

  • 超文本

  • 传输

  • 协议

首先来说超文本,超文本比文本多了一个“超”字,其实就是在文本的基础上,更加丰富的内容,比如说像图片、音频、视频等,比传统的文本内容更加丰富多彩化。

传输,则是超文本在网络中流动的一环,从一端到另一端或多端,这个沟通的环节。

协议呢,就是超文本在网络中流通需要遵守的协议。理解起来不是很困难,像是国家公民遵守国家的法律一般。

二.不同版本的http

先来关注一波http的发展史。

最早的http,在1990年,HTTP就成为WWW的支撑协议。当时由其创始人WWW之父蒂姆·贝纳斯·李(TimBerners—Lee)提出,随后WWW联盟(WWW Consortium)成立,组织了IETF(Internet Engineering Task Force)小组进一步完善和发布HTTP协议。第一个版本是:

http/0.9

0.9协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。只能通过get的请求方式,从服务器获取到页面的html文档,服务器响应之后就关闭请求。

此时请求的过程经过以下几个步骤:
  1. 应用层的HTTP建立在传输层的TCP之上并运用TCP可靠性等特性,先三次握手建立连接

  2. 客户端请求建立连接(此时只有GET)

  3. 服务端响应请求,数据以 ASCII 字符流返回给客戶端

  4. 传输完成,断开连接。


http0.9之后,随之而来的是http1.0,到了1.0协议阶段,也就是在1982年,随着时代的进步,仅仅文本的传输无法满足使用,更多情况需要采用图文的方式才能满足人们日益增长的网络需求。TimBerners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。新的http版本增加了许多全新的功能:

  1. 之前只有Get方法,现在增加Post(加参数),Head方法

  2. 加入协议版本号,同时添加文件处理类型

  3. 加入HTTP Header,让HTTP处理请求更加灵活

  4. 增加响应状态码,标记出错的原因

  5. 提供国际化(不同语言)支持

典型的请求过程:

GET /image.html HTTP/1.0User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
200 OKDate: Tue, 17 Nov 2020 09:15:31 GMTContent-Type: text/html<HTML> 一个包含图片的页面 <IMG SRC="/image.gif"></HTML>

通信过程:

可以看出,在请求体中发生了更加复杂的信息交换,在这个过程中处理了更加复杂的数据类型,服务器的处理压力同样也增大了。


在http1.0之后,就是http1.1了。网景公司和微软开启浏览器大战,谁都想当老大。1999年HTTP/1.1发布并成为标准,写入RFC,以为以后不管是网关还是APP等,只要你要使用HTTP,就得遵守这个标准。在1.1版本里,继续增加put等请求方法,并允许客户端与服务端的长连接。

随着文件越来越大,图片等信息越来越复杂,如果每一次上传下载文件都需要建立连接断开连接的过程将增加大量的开销。为此,提出了持久连接,也就是一次TCP连接可以具有多个HTTP请求。当然持久连接是可选择的,如果考虑关闭,只需要使用Connection:close关闭即可。


强制要求Host头
我们知道,在电商系统中,经常会因为促销活动导致流量飙升,为了缓解流量,其中有种方法即加缓存或者加服务器。如果是单台服务器负载过大,数据库可能分库分表。数据结构算法中分而治之方法亦是如此。那么HTTP中,同样的道理,如果文件太大,就大文件切分为小文件块发送。
4、HTTP/2
HTTP/1.1的出现,几年间出来大量牛掰的互联网公司,发展实在是太快,但是HTTP1.1中这几点成为诟病:
  • 原因1 TCP自带慢启动

顾名思义,"慢启动"从0到1循循渐进。轿车启动不会按下按钮就直接起飞,而是缓慢调节到适合的速度。这不是挺好的?为什么会带来性能问题呢。我们知道一个页面有静态数据,动态页面,很多小文件在加载的过程中就会直接发起请求,这样导致太多的请求都会经历慢启动过程,花费时间太多。
  • 原因2 多条TCP连接带宽竞争

带宽固定,多条TCP连接同时发起竞争带宽资源,由于各个TCP连接之间没有通信机制,也无法得知哪些资源优先级更高,从而导致想快速下载的资源反而延迟下载。
  • 原因3 头部阻塞

阻塞,在网络编程中,我们采用异步,多路复用(Epoll)方式尽量让CPU少等待多干事。在HTTP1.1中,虽然大家共用了一条TCP通道,但是第一个请求没有结束,第二请求就可能阻塞等待,也就是说不能同时发送接收数据。那么一个网页很多数据文件,如果能够同时发出请求,让部分数据文件能够得到响应并预处理,这样就大大的利用了带宽和CPU的资源。基于这些因素,在HTTP2中出现了新的方案
如何解决头部阻塞呢?
HTTP是一问一答的模式,大家都在这个队列排队导致堵塞,那就多个队列并发进行,也就是"对同一个域名发起多个长连接"。举个例子,在火车站排队买票的时候,如果只有一个窗口可用,大家只能苦等,多开几个窗口就可缓解这个问题。
这个时候用户数 * 并发数(上限6-8)已经不错的效果,但是互联网速度太快,火车站就这么大,窗口也就这么多,怎么办,建新的火车站进行分流(大部分城市都有什么东站 西站)。在这里叫做"域名分片",使用多个域名,这些域名指向同一服务器。
5、HTTP/3
HTTP/2看似很完美了吧,但是Google轮子哥可不服,其他人在研究HTTP/2的时候,他们就在琢磨QUIC那QUIC有啥牛掰的地方呢?
QUIC是Google开发的一个基于UDP且能像TCP一样具有可靠性特点的协议。具备像HTTP/2一样的应用数据二进制分帧传输。其主要解决的问题有两个。
  • 进一步解决线头阻塞问题。通过独立不同流,让各个流之间实现相互独立传输,互不干扰


http内容比较多,本期主要总结了一下http的起源与发展史,简单了解不同阶段http的特点。下一期将更加深入剖析http的连接底层。敬请期待~

以上是关于HTTP详解!你了解有多少?(系列一)的主要内容,如果未能解决你的问题,请参考以下文章

python web框架补充http详解

漏洞科普:对于XSS和CSRF你究竟了解多少

以❤️简单易懂❤️的语言带你搞懂有监督学习算法附Python代码详解机器学习系列之KNN篇

关于MPO光纤跳线你了解多少?

09-docker系列-docker网络你了解多少(下)

08-docker系列-docker网络你了解多少(上)