你知道当我们在网页浏览器的地址栏输入网址时,网页是如何呈现的吗?
0.前言

你知道当我们在网页浏览器的地址栏输入网址时,网页是如何呈现的吗?
当然,Web界面不会到空就出来了。根据Web浏览器地址栏中指定的URL,Web使用一种叫做HTTP的协议作为规范来完成从客户端到服务器的一些过程。可以说,Web是基于HTTP协议进行通信的。
1.http的诞生
事实上,在1983年3月之前,互联网只属于少数人,全世界网民之间的信息无法共享。在互联网的黎明,HTTP应运而生。
欧洲核子研究中心的蒂姆·伯纳斯·李博士提出了在相距遥远的网民之间分享知识的想法。最初的想法是将多个文档连接成一个万维网,可以通过超文本的方式相互引用。
现在,已经提出了三种WWW构建技术,即:
HTTP使用SGML作为页面的文本标记语言,使用HTTP作为文档交付协议,指定文档所在的URLWWW。这个名称是当时Web浏览器用来浏览超文本的客户端应用程序的名称。现在用来表示这一系列的集合,也可以简称为Web。
2.什么是HTTP
说了这么多,大家只知道HTTP很牛逼,但是对于HTTP是什么还是没有一个很直观的概念。别急,在我们知道什么是HTTP之前,我们需要知道什么是超文本。
HTTP传输的内容是超文本:
我们先来了解一下“文字”:在互联网早期,它只是一个简单的字符,但随着技术的发展,“文字”的含义现在可以扩展到图片、视频、压缩包等。,这些在HTTP眼里都算是“文本”。我们再来理解一下“超文本”:它是超越普通文本的文本,是文字、图片、视频等的混合体。关键是超链接,可以从一个超文本跳转到另一个。HTML是最常见的超文本。它只是一个纯文本文件,但它使用了许多标签来定义图片、视频等的链接。经过浏览器解析后,呈现给我们的是一个图文并茂的网页。好了,我们正式介绍一下什么是HTTP。
HTTP:超文本传输协议是互联网上使用最广泛的网络协议。所有WWW文档都必须符合该标准。像HTTP/IP协议族中的许多协议一样,它用于客户机和服务器之间的通信。
3.HTTP,也就是原地踏步
全球广泛使用的HTTP协议,还是20多年前的版本。也就是说,作为一种Web文档传输协议,HTTP的版本几乎没有更新过。另一方面,前辈的智慧真的很牛逼。
HTTP/0.9: HTTP是1990年出来的,功能比较简单。它只支持GET请求,只能访问HTML格式的资源。当时HTTP还没有作为正式标准建立,所以叫HTTP 0.9。
HTTP/1.0:1996年5月,HTTP作为标准正式发布,版本号为HTTP 1.0。在0.9版本中取得了进展,增加了请求方法POST和HEAD;不再局限于0.9版本的HTML格式,它可以根据内容类型支持多种数据格式.....需要注意的是,1.0版是短连接。虽然HTTP/1.0是最初的标准,但它至今仍被广泛使用。
1997年发布的HTTP/1.1: HTTP/1.1:1997是目前主流的HTTP协议版本。当年HTTP协议的出现主要是为了解决文本传输的问题。现在HTTP已经超越了Web框架的限制,被应用到各种场景中。当然,1.1版本最大的变化是引入了长连接和管道机制。
这本书里出现的各种专有名词都会让大家印象深刻,下面会逐步讲解。
4.区分网址和URI
与URI相比,你应该更熟悉URL,它是我们使用网络浏览器访问网页时需要输入的网页地址。比如http://baidu.com。
是URI统一资源标识符的缩写。RFC 2386将这三个词定义如下:
统一:统一的格式可以方便地处理许多不同类型的资源。资源:资源的定义是任何可以被识别的东西。它不仅可以是单个的,也可以是集合标识符:标识可识别的对象。也称为标识符。总之,URI是由协议方法表示的资源的位置标识符。比如采用http协议时,协议方案是HTTP,此外还有ftp、telnet等。大约有30种标准的URI协议方法。
URIs有两种格式,相对URIs和绝对URIs。
相对URI:指从浏览器中的基本URI中指定的URL,如/user/logo.png Absolute URI: Use涵盖了所有必要的信息。综上所述,URI用字符串标识某个互联网资源,而URL标识资源的位置,因此可以看出URL是URIs的子集。
5.HTTP请求和响应
HTTP协议规定,两台计算机使用HTTP协议进行通信时,一条通信线路的一端必须是客户端,另一端是服务器端。当您在浏览器中输入访问网站的URL时,浏览器会将您的请求封装成HTTP请求并发送到服务器站点。收到请求后,服务器会把响应数据组织起来封装成HTTP响应,返回给浏览器。换句话说,必须首先从客户端建立通信,服务器在收到请求之前不会发送响应。
我们来详细分析一下HTTP请求消息和响应消息。
① HTTP请求消息
HTTP请求消息由三部分组成:
1)请求行
2)请求标题
3)请求主体
举一个请求消息的例子:
请求行开头的POST指出了所请求的访问服务器的类型,这被称为方法。以下字符串/格式/登录指示请求的资源对象,也称为请求URI。最后一个HTTP/1.1是HTTP的版本号,用来提示客户端使用HTTP协议功能。
总结一下,这个请求的意思是:请求访问一个HTTP服务器上的/form/login页面资源,参数name = veal,age = 37。
注意,无论是HTTP请求消息还是HTTP响应消息,请求头/响应头和请求体/响应体之间都会有空行,请求体/响应体不是必须的。
HTTP请求方法
请求行中方法的作用是指定被请求的资源将按预期产生某种行为,即使用方法给服务器下命令。
包括:获取、发布、放置、标题、删除、选项、连接、跟踪。当然,只有前三个是我们开发中最常见、最常用的。
1)获取资源
GET方法用于请求访问由URIs标识的资源。服务器解析指定的资源,并返回响应内容。
使用GET方法的请求-响应示例:
2)邮政传输实体主体
POST主要用于传输数据,GET主要用于获取资源。
使用POST方法的请求-响应示例:
3)放转文件
PUT方法用于传输文件。因为它没有认证机制,任何人都可以上传文件,所以存在安全问题。一般不使用这种方法。
使用PUT方法的请求-响应示例:
4)HEAD获取消息头
类似于GET方法,但是不返回消息的实体主体部分。主要用于确认URI的有效性以及资源更新的日期和时间。
使用HEAD方法的请求-响应示例:
5)删除删除文件
与PUT函数相反,它用于删除文件,并且它还根据请求URI删除指定的资源,而无需身份验证机制。
使用DEELTE方法的请求-响应示例:
6)选项查询支持方式
用于获取当前URI支持的方法。如果请求成功,HTTP响应头中将包含一个名为“Allow”的字段,这是唯一支持的方法,比如“GET,POST”。
使用选项方法的请求-响应示例:
7) ..........
HTTP请求标头
请求报头用于补充所请求的附加信息、客户端信息、与响应内容相关的优先级等。列出以下常见的请求头:
1)Referer:指示跳过了此请求的URI。比如你通过淘宝搜索,那么在进入淘宝的请求消息中,Referer的值是:www.baidu.com。如果是直访,就不会有这个头了。该字段通常用于防盗链。
2)Accept:告诉服务器请求可以支持什么类型的响应数据。

上图中的text/plain;Q = 0.3表示文本/普通媒体类型的数据优先级/权重为0.3。如果未指定权重,默认值为1.0。
数据格式类型如下:
3)Host:告诉服务器请求的资源所在的互联网主机名和端口号。该字段是HTTP/1.1规范中唯一必须包含在请求报头中的字段。
4)cookie:客户端的cookie通过这个header属性传递给服务器!
cookie:JSESSIonID = 15982 c27 f 7507 c 7 fdaf 0 f 97161 f 634 b 5
登录后复制
5)连接:表示客户端和服务之间的连接类型;Keep-Alive表示持久连接,close表示关闭。
6)Content-Length:请求体的长度。
7)Accept-Language:浏览器通知服务器浏览器支持的语言。
8)range:对于只需要获取部分资源的Range请求,可以通过包含头字段Range将指定的资源范围通知给服务器。
9) ......
② HTTP响应消息
HTTP的响应消息也由三部分组成:
行响应标题响应正文
响应行开头的HTTP 1.1表示服务器的相应HTTP版本。后面的200 OK表示请求处理结果的状态代码和原因短语。
http状态代码
HTTP状态码负责指示客户端HTTP请求的返回结果,标记服务器处理是否正常,通知错误。
状态由3个数字组成,第一个数字定义了响应的类别:
2xx:请求已被正常处理。
200正常:客户端请求成功204无内容:无内容。服务器已成功处理,但未返回任何内容。一般用在只有客户端向服务器发送信息,服务器不需要向客户端返回任何信息的时候。该页面将不会刷新。206部分内容:服务器完成了GET请求的一部分。响应消息包含指定Content-Range范围内的实体内容3xx:需要额外的操作来完成请求。
301永久移动:永久重定向,表示请求的资源已经永久移动到其他位置。302发现:临时重定向,表示请求的资源已经临时移动到另一个位置;303参见其他:临时重定向,你应该使用GET来获取请求的资源。303的作用和302的作用是一样的,只是303明确了客户端要使用GET来访问304不被修改:意思是客户端发送条件请求时,条件不满足。当返回304时,不包括响应正文。304虽然分为3XX,但是和重定向没有关系。307临时重定向:临时重定向,与302含义相同。POST不会变成GET4xx:客户端错误
400错误请求:客户端请求存在语法错误,服务器无法理解。401未经授权:请求未经授权。此状态代码必须与WWW-Authenticate头字段一起使用。403禁止:服务器收到请求,但拒绝提供服务404未找到:请求的资源不存在。例如,错误的URL415不支持的媒体类型:不支持的媒体类型5xx:服务器端错误,服务器未能满足合法请求。
500内部服务器错误:服务器出现意外错误。503服务器不可用:服务器目前超载或停机维护,暂时无法处理客户端的请求。过一会儿,它可能会返回到正常的HTTP响应头。
响应头还使用键-值对K: V,用于补充响应的附加信息、服务器信息和客户端的附加要求。
这里,位置字段被强调,它可以将响应接收器引导到不同于某个URI位置的资源。一般来说,这个字段会配合3xx:Redirection的响应来提供重定向的URI。
6.HTTP连接管理
①短连接
在HTTP协议的初始版本中,每次客户端和服务器进行HTTP会话时,都会建立一个连接,当任务完成时连接就会中断。当客户端浏览器访问的HTML或其他网页包含其他Web资源时,浏览器将在每次遇到这样的Web资源时重新建立HTTP会话。这种方法称为短连接。
也就是说,每个HTTP请求都要重新建立连接。因为HTTP是基于TCP/IP协议的,所以每次连接的建立或者断开都需要TCP三次握手或者来自TCP的四波的开销。
显然,这种方法有巨大的弊端。比如你访问一个包含多张图片的HTML页面,每一次对图片资源的请求都会造成不必要的TCP连接建立和断开,大大增加了通信的开销。
②长连接
从HTTP/1.1开始,默认的长连接也被称为持久连接保持活动。使用长连接的HTTP协议,这行代码将被添加到响应头:Connection:keep-alive。
在长连接的情况下,当打开一个网页时,用于在客户端和服务器之间传输HTTP数据的TCP连接不会被关闭。当客户端再次访问该服务器时,它将继续使用这个已建立的连接。Keep-Alive不会永久保持连接。它有一个保持时间,可以在不同的服务器软件中设置。长连接要求客户端和服务器都支持长连接。
HTTP的长连接和短连接本质上是TCP的长连接和短连接。
③装配线
默认情况下,HTTP请求是按顺序发出的,只有在当前请求收到响应后,才会发出下一个请求。由于网络延迟和带宽限制,可能需要很长时间才能将下一个请求发送到服务器。
持久化使得大部分请求以管道方式发送成为可能,即在同一个持久连接上连续发送请求,而不需要等待响应返回再发送,这样就可以同时并行发送多个请求,而不需要逐个等待响应。
7.无状态HTTP
HTTP是一种无状态协议。也就是说,他不管理之前的请求和响应的状态,也就是说,他不能根据之前的状态来处理这次的请求。
这就会带来一个显而易见的问题。如果HTTP记不住用户的登录状态,难道每次页面跳转都不会导致用户重新登录吗?
当然,不能否认无国籍的优势是显而易见的。因为不需要保存状态,自然减少了对服务器CPU和内存资源的消耗。另一方面,HTTP由于其简单性而被广泛使用。
这样,在保留无状态协议特性的同时,就有必要解决无状态带来的问题。有很多方案,最简单的就是使用cookie技术。
cookie通过在请求和响应消息中写入cookie信息来控制客户端的状态。具体来说,cookie将根据服务器发送的响应消息中称为Set-cookie的头字段信息通知客户端保存cookie。下次客户端向服务器发送请求时,客户端会自动将cookie值添加到请求消息中并发送出去。服务器收到客户端的cookie后,会检查是哪个客户端发送的连接请求,然后比较服务器上的记录,最后得到之前的状态信息。
形象地说,客户端第一次请求后,服务器会发放一张带有客户信息的身份证。后续客户端请求服务器时,带上身份证,服务器会识别。
下图显示了cookie交互的场景:
1)没有cookie信息的请求:
相应的HTTP请求消息
get/reader/http/1.1 host:Baidu.com *的头字段中没有关于cookie的信息。
相应的HTTP响应消息
HTTP/1.1 200 ok日期:2020年7月12日星期四15:12:20 GMT服务器:Apache
2)第二次后的请求
相应的HTTP请求消息
GET/image/HTTP/1.1 host:Baidu . com cookie:sid = 1342077140226
8.HTTP断点续传
所谓断点续传,是指下载传输文件可以中断,然后重新下载时,可以从中断的地方开始下载,而不是从头开始。客户端和服务器都需要支持断点续传。
这是一个很常见的函数,原理很简单。事实上,它是HTTP请求头中字段Range和响应头中字段Content-Range的简单使用。客户端逐块请求数据,最后将下载的数据块拼接成完整的数据。例如,当浏览器请求服务器上的服务时,请求如下:
假设服务器的域名是www.baidu.com,文件名是down.zip
GET/down . zip HTTP/1.1 Accept:image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/vnd.ms- excel、application/msword、application/vnd.ms-powerpoint、**;q=.2
仔细看看,你会发现一个额外的行范围:bytes=2000070-。这一行的意思是告诉服务器down.zip这个文件从2000070字节开始传输,前面的字节不传输。
收到该请求后,服务器返回以下信息:
206 Content-Length = 106786028 Content-Range = bytes 2000070-106786027/106786028 date = Mon,2001年4月30日12:55:20 GMTETag = W/" 02 ca 57 e 173 c 11:95b " Content-Type = application/octet-streamServer = Microsoft-IIS/5.0 last-Modified = Mon,2001年4月30日12:55:

对比之前服务器返回的信息,你会发现新加了一行:content-range = bytes 2000 070-106786027/106786028。的返回代码也从200更改为206。
9.HTTP的缺点
到目前为止,我们已经了解到HTTP有优秀便捷的一面。那么,任何事物都有两面性,他也有缺点:
当通信是明文时,内容可能在不验证通信伙伴身份的情况下被窃听,因此可能被伪装,无法证明消息的完整性,因此可能被篡改。这些问题不仅出现在HTTP上,也存在于其他未加密的协议中。为了解决HTTP的痛点,应用了HTTPS。说白了,HTTP+加密+认证+完整性保护就是HTTPS协议,关于HTTPS协议的内容也非常多,非常重要。后面会单独开篇解释。
注:转载自51CTO博客。如有侵权,请联系删除。谢谢大家!


