HTTP协议学习笔记(一) 初遇篇

2022年05月15日 阅读数:1
这篇文章主要向大家介绍HTTP协议学习笔记(一) 初遇篇,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

通常我写的文章行文风格大体都是,先从整体上论述,而后再深刻到细节中。html

有一天,我发现我父亲正在读一本关于大脑的书, 寻找如何让计算机拥有直觉,可以像大脑同样发展出关系的线索,计算机在逻辑组织和处理上作得很好, 但随机的关联不行,咱们讨论了这一点,而后我作做业去了,但这个想法伴随着我,计算机是能够变得更增强大的,若是计算机能被编程来关联,本没有被关联的信息,极端点说,世界能够被看做时彻底由连结组成的,咱们把词典想象成一个意义的仓库,它只是在用别的词来定义一个词,真的没什么别的含义了,咱们的大脑由数以亿级的神经元,直到神经元之间创建链接以前,大脑都不拥有知识,重要的是链接。 --- Tim Berners-Lee(蒂姆•伯纳斯•李) 发明了万维网、第一个网络浏览器、以及容许网络扩展的基本协议和算法算法

由互联网到万维网

在TCP、UDP协议以后,两台位于不一样地域的计算机就能够进行通讯了, 这是个了不得的特性,我在上海跟在河南的父母发消息,可比古代六百里加急还要快,可是在应用层的协议、万维网到来以前,互联网还和普通人比较遥远,像是一颗刚发了芽的种子,谁也不会想到在不久的未来,整个世界都将笼罩在它的荫凉之下。编程

TCP协议发表于1981年,即便传输层提供了可靠传输服务,上面悬浮的应用也比较少,在我国也就用于政府、科研单位快速的传递信息,可是传递信息的方式彷佛也比较单一,信息之间没有创建起链接,这一点能够从中国科学院高能物理研究所的网络发展中大体看到,1986年以长途电话线为介质,实现了高能所与西欧中心CERN之间的电子邮件的传输,学者们之间的通讯资料,没被链接起来。你对个人研究资料比较感兴趣,你发封邮件给我,而后我把邮件发给你。彷佛当时的人们将互联网当成了新时代的信鸽,用来传递一些关键的信息。直到万维网的出现,经过超连接这种媒介,互联网中各个孤立的信息才被创建强链接,实现从一个信息跳转到另外一个信息。json

超连接

写到这里想起我大学的时候,在学习《计算机网络》这门课程的时候,看到万维网这一节,说实话当时我看的似懂非懂的,我不知道什么叫万维网,即便我打开浏览器输入网址,浏览网站信息已经很熟练了,但我也没意识到我当时用的是万维网,我认为那就是互联网,也许在我眼里点击网站连接跳到另外一个网站是以一个理所固然的操纵,当时个人计算机网络学的真的是一团糟,我后面对网络认知的加深全是写程序的时候遇到问题,而后去查资料。悄悄的吐槽一下,我大学的时候的教材翻译是着实有些拗口,我以为我读不懂也正常,介绍万维网是这么介绍的:segmentfault

万维网WWW(World Wide Web)并不是某种特殊的计算机网络,万维网是一个大规模的、联机式的信息储藏所。简称为WEB。

当时的我没有把万维网和平常浏览的网站联系起来,(这也跟我当初听课听不懂,后面就放弃了有关系,其实后面有讲到浏览器,只不过用的描述语让我不管如何都没有跟我平常浏览的网站联系起来),因此我只看懂了前半句:万维网WWW(World Wide Web)并不是某种特殊的计算机网络,万维网是一个大规模是。信息储藏所我是看不大懂的,更不用提后面的超文本了、URL之类的了。浏览器

我这里想引入另外一种视角来介绍万维网,从 Tim Berners-Lee的设计万维网的缘起谈起,即为信息创建链接。Tim Berners Lee进入欧洲原子核研究所,当时的科学家迫切须要一个方便快速的平台来帮助他们远程沟通交换数据,基于这个问题,Tim Berners Lee 设计了万维网,我猜测最初浏览器访问的网址存放的就是原子核研究所的研究资料(查了好久,这方面的资料比较难找,有时间会尝试写一下Web简史),各个文档仍是孤立的,那为各个文档创建链接,面临的问题有哪些呢?缓存

  • 怎样标志分布在互联网上的万维网文档?
  • 用怎样的协议来实现万维网上各个文档上的链接?
  • 怎样实如今不一样的计算机上实现统一的显示效果呢?

为了解决第一个问题,万维网使用URL来标识万维网上的各类文档(网页),并使每个文档在整个互联网的范围内具备惟一的标识符(URL)。粗略的说URL=IP:端口/路径。第二个问题就引出了咱们的HTTP协议, 第三个问题的答案就是HTML,统一格式、语法。服务器

由万维网到HTTP协议

HTTP协议概述

HTTP译为超文本传送协议,这个超文本能够理解为不止是文本,能够传送图像、视频,最初只是能是静态的。HTTP协议规定了浏览器(客户端进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。网络

HTTP

HTTP请求协议

上面这张图片来自火狐开发者文档。ide

从层次的角度来说,HTTP协议是面向事务的,面向事务的意思是一系列信息交换要么所有成功,只要有一次交换失败就所有失败。每一个网站都有一个服务器进程不断的监听TCP的端口80, 以便发现是否有浏览器(或其余客户端)向它发出链接创建请求,一旦监听到链接创建请求并创建了TCP链接以后,浏览器就向服务器发起HTTP请求,服务器根据请求响应对应的资源。最后,TCP连接就被释放了。在浏览器和服务器之间的请求和响应的交互必须按照规定的格式和遵循必定的规则,这些规则和格式就是HTTP协议。

它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求一般是由像浏览器这样的接受方发起的。一个完整的Web文档一般是由不一样的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等

HTTP协议因为运输层选取的是面向链接的TCP协议,保证了数据的可靠传输,可是,HTTP协议是自己是无链接的,这就是说,虽然HTTP使用了TCP链接,但通讯的双方在交换HTTP报文以前不须要先创建HTTP链接。

HTTP在应用的早期阶段很是简单,简单的甚至没有版本号, 后来它的版本号被定位在0.9以区分后来的版本。HTTP/0.9极其简单: 请求由单行指令构成, 以惟一可用方法GET开头,其后跟目标资源的:

GET /mypage.html

响应也极其简单: 只包含响应文档自己。

<HTML>
这是一个很是简单的HTML页面
</HTML>

后来被称为HTTP/0.9, 有时也被叫作单行(one-line)协议,跟后来的版本不一样,HTTP/0.9 的响应内容并不包含HTTP头,这意味着只有HTML文件能够传送,没法传输其余类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的HTML文件将被发回,供人们查看。

随着万维网的不断发展,浏览器和服务器迅速扩展其用途更广, HTTP/0.9版本就有点跟不上时代的发展了, 随后就推出了HTTP/1.0版本:

  • 协议版本信息如今会随着每一个请求发送(HTTP/1.0被追加到了GET行)。
  • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
  • 引入了HTTP头的概念,不管是对于请求仍是响应,容许传输元数据,使协议变得很是灵活,更具扩展性。
  • 在新HTTP头的帮助下,具有了传输除纯文本HTML文件之外其余类型文档的能力(凭借Content-Type头)

如今的浏览器经过开发者工具能够清楚的看到请求和响应报文:

HTTP协议版本

HTTP协议版本1.1

虽然HTTP/2.0版本已经推出来了, 可是目前国内广泛使用的仍是HTTP/1.1协议, 那HTTP 1.1 版本相对于HTTP/1.0版本增长了什么呢? 在HTTP1.0版本中,在客户端(一般指浏览器)与服务器可以交互(客户都按发起请求, 服务器返回响应)以前, 必须在这二者之间创建一个TCP连接,打开一个TCP链接须要屡次往返交互消息(所以耗时)。HTTP/1.0默认为每一对HTTP/响应都打开一个单独的TCP链接。 当连续发起多个请求时,这种模式比多个请求共享一个TCP连接更低效。

链接管理是一个HTTP的关键话题, 在HTTP/1.1里有多种模型: 短链接、长链接, HTTP 流水线。

HTTP的传输协议主要依赖于TCP来提供从客户端到服务端之间的链接。在早期,HTTP使用一个简单的模型来处理这样的链接,可是打开每个TCP链接都是至关耗费资源的操做。现代浏览器每每要发起不少次请求才能拿到所需的完整信息。为了解决HTTP/1.0的性能问题,HTTP引入了流水线和长链接模型。 HTTP的长链接有的时候也被称为Keep-alive链接,一个长链接会保持一段时间,重复用于发送一系列的请求,节省了新建TCP链接握手的时间,还能够利用TCP的性能加强能力。 固然这个链接不会一直保留, 链接在空闲一段时间后会被关闭(服务器端可使用Keep-Alive协议头来指定一个最小的链接保持时间)。

可是长链接也并不是天衣无缝,由于就算是空闲状态 ,它仍是会消耗服务器的资源,并且在高负载时,还有可能遭受DoS Attacks 攻击。 在这种场景下,可使用非长链接,即尽快关闭那些空闲的链接,也能对性能有所提高。

HTTP/1.0默认并不使用长链接,在HTTP/1.1里默认就是长链接,协议头都不用再去声明它。HTTP 流水线在现代浏览器中并非默认被启用, 由于它难以实现。 要讲清楚为何难以实现也并非一个简单的问题,咱们会调一篇文章专门讲这个难以实现的缘由。这里咱们只简单的介绍一下它的实现: 默认状况下,HTTP请求是按顺序发出的,下一个请求只要在当前请求收到应答事后才会发出,因为会受到网络延迟和带宽的限制,在下一个请求被发送到服务器以前,可能须要等待很长时间。

流水线是在同一条长链接上发出的连续请求,而不用等待应答返回。这样能够避免链接延迟。但不是全部类型的HTTP请求能用到流水线。

值得注意的是HTTP/1.0多种不一样的实现方式在实际运用中显得有些混乱,自1995年开始,即HTTP/1.0文档发布的下一年,就开始修订HTTP的第一个标准化版本。在1997年初,HTTP1.1标准发布,就在HTTP/1.0发布几个月后。

下面咱们经过浏览器的开发者工具观察报文,来介绍HTTP1.0-1.1的引入的新特性:

  • 引入了HTTP头的概念,不管是对于请求仍是响应,容许传输元数据,使协议变得很是灵活,更具扩展性。
  • 在新HTTP头的帮助下,具有了传输除纯文本HTML文件之外其余类型文档的能力(凭借Content-type头)。
  • 引入内容协商机制,包括语言,编码,类型等,并容许客户端和服务器之间约定以最合适的内容进行交换

请求报文与响应报文概述

典型的请求标头

如上图所示上面是一个典型的HTTP请求报文的请求头, method 能够理解为HTTP的一个请求报文类型,HTTP协议中有好几种不一样的请求报文类型:

  • CONNECT
  • DELETE
  • GET
  • HEAD
  • OPTIONS
  • PATCH
  • POST
  • PUT
  • TRACE

粗略的说请求报文用于向服务器说明,我此次须要什么样的资源,请你返回给我。 不一样的请求方式用于请求不一样的资源。响应报文用于说明咱们返回了什么资源,请你接收。

下面是一个响应报文:

HTTP响应头

咱们能够看到上面说的content-type,就是在告诉客户端我返回给你的是json, 按照这个方式来解析。HTTP的状态码用于指明此次HTTP通讯的状态:

  • 1xx 表示通知信息
  • 2xx 表示成功
  • 3xx 表示重定向, 如要完成请求还必须采起进一步的行动。
  • 4xx 表示客户端的差错,如请求中有错误的语法不能完成。
  • 5xx 表示服务器的差错, 如服务器失效没法完成请求。

至此咱们已经完成了对HTTP协议的大体介绍,为了链接互联网上的信息,万维网的先驱Tim Berners-Lee设计了HTTP协议,为了统一显示效果,引入了HTML,为了标记文档,引入了URL。在HTTP协议中请求报文用于说明向服务端请求获取的资源,响应报文是请求的获取资源加一些控制信息,状态码用于指明这次 通讯的状态。世界已经被万维网改变了模样,即便你不知道万维网的发明者蒂姆•伯纳斯•李。

参考资料