HTTP基础 第二篇(未完待续)
前言:由于天天学js有点太枯燥,所以同步更新点其他内容,大约在大半年前也更新过HTTP的博客,不过现在基
本忘光了,那就重头开始吧,这次参考数据更换成著名HTTP书籍,《HTTP权威指南》-----[美] David Gourley,
[美] Brian Totty,[美] Marjorie Sayer,[美] Sailu Reddy,[美] Anshu Aggarwal
1 HTTP概述
1.1 HTTP简介
HTTP是当前普遍使用的网络通信协议,通过HTTP,用户可以访问web服务器获得想要的信息,当我们浏览一个页
面时,浏览器会向服务器发送一条HTTP请求,服务器会去寻找期望的对象,如果成功,就将对象,对象类型,对
象长度以及其他信息放在HTTP响应中发送给客户端
1.2 资源
WEB服务器是web资源的宿主,web资源是web内容的源头,资源不一定是静态文件。可以是动态资源,根据身
份,所请求的信息,或每天不同时段来产生内容,总之所有类型的内容来源都是资源,英特网搜索引擎也是资源
1.2.1 媒体类型
由于网络上有数千种不同的数据类型,所以HTTP给不同类型的数据打上了MIME type (Multipurpose Internet
Mail Extension type)的数据格式标签,用来描述并标记多媒体内容web服务器为所有的HTTP对象数据附加MIME
类型,当web浏览器取回一个对象时,回去查看相关的MIME类型,检查是否处理该文件类型
MIME类型由主要的对象类型和特定的子类型构成,中间由一条斜杠来分割。
例如:
HTML格式的文本文档由text/html 类型来标记
ASCLL文本文档由text/plain类型来标记
JPEG格式的图片为image/jpeg类型
GIF格式的图片为image/gif类型
ppt格式由 application/vnd.ms-powerpoint
1.2.2 URI
每一个web服务器资源都有一个名字,服务器资源名字被称为统一资源标识符(Uniform Resource Identifier, URI)
URI在世界范围内唯一表示并定位信息资源
举个简单的uri例子:https://cdn.luogu.com.cn/upload/image_hosting/i7sfoci9.png,这个uri就唯一指向了我先
前某个博客的一张图片,访问的网站服务器很明显,是洛谷的图床
我们以该链接为例子,分析以下该uri的组成
第一部分:: https:// 称作方案(scheme) ,说明了访问资源所使用的协议类型,当前表明使用HTTPS协议,是比
HTTP协议安全性更强的协议
第二部分:cdn.luogu.com.cn 给出服务器的因特尔网址,定位该资源服务器
第三部分:/upload/image_hosting/i7sfoci9.png 定位该图片位置
然后将此文件打赏MIME类型标记,标记数据类型和大小,然后将其传给客户端
URI由两种形式,分别是URL和URN
1.2.3 URL
统一资源定位符(URL)是资源标识符最常见的形式,URL描述了一台特定服务器上资源的特定位置,它可以明确说
明如何从一个精确固定的位置获取资源
现在几乎所有的UR
1.2.4 URN
URI的第二种形式就是统一资源名(urn)urn是作为特定内容的唯一名称使用的,与目前资源的所在低无关,使用这
些与位置无关的urn,就可以将资源四处搬移,通过urn可以用同一个名字通过多种网络访问协议访问资源,可有
理解成urn是以文件为目标,不是以地址为目标,当文件变换位置,任然可以访问对应目标,urn处于测试阶段,但
urn尚且未大规模使用
1.3 事物
一个http事物由一条请求命令和一个响应结果组成,这种通信是通过http报文的格式化数据块进行的
1.3.1 方法
http支持几种不同的请求命令,每条http请求报文中都包含一个方法,这些方法告诉服务器要执行什么动作
具体的方法如下:
GET :从服务器向客户端发送命名资源
PUT :将来自客户端的数据存储到一个命名服务器资源中去
DELETE:从服务器中删除命名资源
POST:将客户段数据发送到一个服务器网关应用程序
HEAD:仅发送命名资源响应中的http首部
1.3.2 状态码
每条http响应报文返回时都会携带一个状态码,状态码是一个三位数字的代码,告知客户端请求是否成功,或者采
取其他动作
以下是常见状态码:
200:ok文档正确返回
302: redirect (重定向) 到其他地方去获取资源
404 : not found (没找到) 无法找到这个资源
伴随着每个数字状态码,http还会发送一条解释性的原因短语文本,包含文本短语主要的目的就是为了进行描述
1.3.3 web页面中可以包含多个对象
应用程序完成一个食事物时需要多个http时间,比如呈现一个网页,需要先获取html,框架,再获取图片,等一
系列资源,这些资源可以不在同一个服务器上,所以web页面中也可以包含多个对象,一个web页面通常不是单个
资源,而是一组资源的集合
1.4 报文
http报文是由一行行简单的字符串组成的,可以很方柏霓的对其进行读写,从web客户端发往服务器端的http报文
称为请求报文,从服务器端发往客户端的称为响应报文,此外没有其他类型的http报文
报文由三部分组成
1 起始行:描述请求或响应的基本信息,放在第一行,在请求报文中用来说明要做些什么,在响应报文中说明出现
了什么情况
2 首部字段集合:使用key-value形式,在起始行后面有零个或多个首部字段,每个首部自读那包含一个名字和一
个值,为了便于解析,二者间用冒号来分割,首部以一个空行结束,添加一个首部字段和添加新行一样简单
通过首部字段,可以来实现缓存机制。
3 消息正文,也被称作主体,是实际传输的数据,它不一定是纯文本,可以是图片,视频等二进制数据
空行后就是可选的报文主体了,其中包含了所有类型的数据,请求主体中包含了要发给服务器的数据,响应主体
中装载了要返回给客户端的数据,起始行和首部都是文本形式且都是格式化的。而主题不同,主题中可以包含任意
的二进制数据,比如图片,视频,音轨,软件程序,当然你,主题中也可以包含文本
1.5 连接
我们来分析以下报文是如何通过传输控制协议,从一个地方到另一个地方的
1.5.1 TCP/IP协议
http是应用层协议,http无序操心网络通信的具体细节,它把联网的细节都交给了通用的tcp/ip协议
tcp/ip是全世界常用的层次化分组交换网络协议集,只要建立了tcp连接,客户端和服务器之间的报文交换就不会
丢,不会被破坏,也不会在接受时发生错序
1.5.2 连接,ip地址以及端口号
在http客户端向服务器发送报文之前,需要用网际协议地址和端口号在客户端和服务器之间建立一条tcp/ip连接
在tcp中,你需要知道服务器的ip地址,以及与服务器上运行的特定软件相关的tcp端口号
我们通过url获取地址和端口号,可以直接访问对应的ip,也可以利用dns服务器将域名转换为ip地址,然后加上对应
的端口建立tcp连接,对于未添加端口号的url,默认端口为80端口
以下是用户获取一个页面的html资源的全过程
1 用户输入url
2 获取主机名和端口号
3 访问dns服务器,将主机名转换为ip地址
4 连接到对应ip的对应端口,建立tcp连接
5 发送一条http get 请求
6 从服务器读取htt
7 关闭连接,浏览器显示页面
1.6 协议版本
1 http/0.9
http的1991原型版本,只支持与老客户端的交互,支支持get方法,不支持多媒体内容的MIMEl类型,很快就被
HTTP/1.0取代
2 HTTP/1.0
第一个得到广泛应用的HTTP版本
3 HTTP/1.0+
指在20世纪90年代中叶,为满足快速扩张的需要,很多特性被加入到HTTP中,并且称为非官方的事实标准,这种
非正式的HTTP被称为HTTP/1.0+
4 HTTP/1.1
HTTP/1.1 重点关注矫正HTTP涉及中的结构性缺陷,并删除一些不太好的特性,HTTP/1.1也是当前使用的HTTP版
本
5 GTTP-NG(又叫GTTP/2.0)
是对HTTP/1.0性能的优化版本,但相关研究工作停止于1998年,目前并未有对其进行替代的计划
1.7 web 的结构组件
1 代理: 位于客户端和服务器之间的http中间实体
2 缓存:http的仓库,使常用页面的副本可以保存在离客户端更近的地方
3 网关:连接其他应用程序的特殊web服务器
4 隧道:对http通信报文进行盲转发的特殊代理
5 agent 代理:发起自动http请求的半只能web客户端
1.7.1 代理
代理位于客户端和服务器之间接收所有客户的http请求,并将这些请求转发给服务器(可能会对请求进行修改后转
发) 出于安全考虑,通常会将代理作为转发所有web流量的可信任中间节点使用,代理还可以对请求进行过滤
1.7.2 缓存
缓存是一种或特殊的http代理服务器,可以将经过代理传送的常用文档复制保存起来,下一个请求同一文档的客户
端就可以享受缓存 的私有副本所提供的服务了
客户端从附近的缓存下载文档比从远程服务器获取文本快的多,http定义了很多功能,使得缓存更加高效,并规范
了文档的新鲜度和缓存内容的隐私性
1.7.3 网关
网关(gateway) 是一种特殊的服务器作为其他服务器的中间中间实体,通常用于将http流量转换成其他的协议
网关接受请求时好像自己是资源服务器一样,客户端对此并不清楚
一个http/ftp网关会通过http请求接受对ftp url的请求,但通过ftp协议来获取文档,得到的文档会被封装为http报
文,发送给客户端
1.7.4 隧道
隧道是建立起来之后,就会在两条连接之间对原始数据进行盲转发的http应用程序
http随当通常用来在一条或者多条http连接上转发非http数据,转发时不会窥探数据
http常见用途是通过http连接承载加密的安全套字层即ssl
1.7.5 agent代理
agent代理,表示代表用户发起http请求的客户端应用程序,常见的便是web浏览器,但agent 代理的种类很多,
并非只有web浏览器
1.8 浏览英特网资源
url是因特网资源的标准化名称,url指向一条电子信息片段,告诉你他们位于何处,以及如何与之进行交互
一个人将浏览器指向一个url,浏览器就会在幕后发送适当的协议报文,来获取人们所期望的资源。
uri是一类更通用的资源表示符,url是它的一个子集,uri是一个通用的观念,由url和urn组成,url是通过描述资
源的位置来找到资源的,urn是通过资源的名称来找到资源的,一个人将浏览器指向一个url时,浏览器就会在幕后
发送适当的协议报文来获取人们所期望的资源
http规范将更通用 uri作为资源表示符,但实际上处理的只是uri的子集url,
http可以通过htttp之外的其他协议来访问资源,他们可以指向英特网上的任意资源,比如通过ftp协议访问各种文
件
1.9 url语法
url语法会随着使用的协议不同而发生变化,但大部分url都遵循通用的url语法,而且不同的url方案的风格和语法
都有不少的重叠,大多数url方案的url语法都建立在这个由九部分构成的通用格式上。
<scheme> ://<user> :<password>@<host>:<port>/<path>;<params>?<query>#<flag>
但一个url并不会全部包含这些内容,最常见的就是方案(scheme) 主机(host) 和路径(path)
接下来我们对先前没提过的部分进行解释
1 用户:某些方案访问资源时需要用户名 默认为匿名
2 密码:用户名后面可能要包含密码,中间由:分割
3 参数: 某些方案会用这个组件来指定输入参数,参数为键/值对 。url可以包含多个参数字段,他们互相之间以及
与路径之间都是用:分割的
4 查询: 某些方案会用这个组件传递参数以激活应用程序,比如数据库,公告板,搜索引擎,以及其他因特尔网
关,查询组件的内容没有通用格式,用?将其与url的其余部分分隔开
5 片段:一小片或一部分资源的名字,引用对象时,不会将frag字段传给服务器,这个字段是在客户端内部使用
的,通过#将其与url其他部分分割开来。
2.0 主机与端口
URL中主机组件标识了网络上可以访问的资源的宿主机器,可以用域名或ip来表示主机名。
端口组件标识了服务器证字啊监听的网络端口,对下层是哟个了tcp协议的http来说,默认端口号为80,我们的url
不标明端口号时,默认为80端口。
2.1 用户名和密码
很多服务器都要求输入用户名和密码才会允许访问数据,ftp服务器就是常见的例子
如果某个应用程序要求输入用户名和密码,你却没有输入,它通常会插入一个默认的用户名和密码。
在url中,使用 用户名:密码
的形式输入用户名和密码,并且使用@
将用户名和密码和其他部分分割开
2.2 路径
url中使用/
将路径组件划分为一些路径段,每一个路径段都有其自己的参数
2.3 参数
对与很多案例来说,只有简单的主机名和到达对象的路径是不够的,除了服务器正在监听的端口,以及是否能通过
用户名和密码访问资源外,很多协议都还需要更多的信息才能工作。
负责解析url的应用程序想要这些协议参数来访问资源,否则服务器就会 提供错误的服务或者不会提供服务,
为了向应用程序提供他们所需的参数,以便正确的与服务器交互,由字符;
将其与其余部分隔开,他们为 应用程
序的正确访问提供了所需要的附加信息。比如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
正如先前所说,不同的路径段也可也有自己的参数,比如:
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
我们可以发现上面的不同路径段后面存在;
引出参数,参数也是以键值对的形式给出的
2.4 查询字符串
很多资源,比如数据库服务,都是可以通过提问题或进行查询来缩小请求资源类型范围的。
http://www.joes-hardware.com/inventory-check.cgi?item=12731
对于这个url,最右边?后的内容就是查询字符串,也被称为查询组件。
url的查询组件和标识网关资源的url路径被一起发送给网关资源,然后在查询网关查询是否存在当前资源。
对查询组件没有什么格式要求,但很多网关都希望以 键/值对的形式出现,键值对之间用字符串&
分割
例如下面的例子
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
2.5 片段
我们可以对资源进行进一步的划分,分为部分资源,然后使用url去指向这个部分资源,为了引用部分资源或者资
源的一个片段url支持使用片段(frag)组件来表示一个资源内部的片段,比如,url可以指向html文档中一个特定的
图片或者小节,片段挂在url的右边,最前面有一个字符#
比如 http://www.joes-hardware.com/tools.html#drills
这是引用一个片段的实际例子
由于http服务器只处理整个对象,所以客户端不能把片段请求发送给服务器,而是先从服务器端获取整个资源之
后,浏览器根据你所选择的片段呈现给你所需要的内容,并非是完全呈现。
2.6 url快捷方式
url分为两种,绝对的和相对的,绝对的url包含有访问资源所需要的全部信息,另一方面,相对url是不完整的,需
要从中获取全部详细,就必须相对于base的url进行解析,相对url是url的一种边界缩略记法 ,比如
./a.html
这是一个相对url地址,嵌套在本地的html文件中可以顺利解析出来,很明显,这个url的信息是不全面
的,但通过解析可以导出完整的url.
相对url只是url的一小部分,能处理url的应用程序,要能够在相对和绝对url之间进行转换,如果使用的是相对
url,就可以在搬移一组文档的同时仍然保持链接的有效性
转换的第一步是找到基础url,基础url是作为i相对url的参考点使用的,可以来自一下几个不同的地方
1 在资源中显示提供,有些资源会显示的指定基础url,比如html文档中可能会包含一个定义了基础url的标记
<base>
通过它来转换那个html文档中的所有相对url
2 封装资源的基础url
如果在没有指定基础url的资源中发现了一个相对url,可以将会他所属资源的url作为基础url
3 没有基础url 在某些情况下,没有基础url,通常意味着你存在绝对url,当然也可能是url发生了损坏.
2.3 自动扩展url
有些浏览器会在用户提交url之后,或者在用户输入的时候尝试着自动拓展url,这意味着用户并不需要输入完整的
url,因为浏览器会自动拓展url,.
url拓展方式主要为一下几种
1 主机名拓展:
比如如果在地址栏中输入baidu 浏览器就会自动在主机名中擦汗如www. 和.com 构建起完整的url,如果找不到与之
匹配的站点,有些浏览器会尝试更换扩张方式
2 历史扩展:
浏览器将用户访问过的url历史存储起来,当你输入url,他们就可以将其于之前的url进行比对,,并提供一些选项
供你选择
2.4 url字符集
为了满足可移植性和普适性,url使用ascll码形式表示数据,对于ascll码不支持的语言,会使用ascll码转意后进行
表示。
在url中,存在部分字符被保留起来,拥有了特殊的含义,还有些字符会与某些因特网网关和协议产生混淆,故不
赞成使用比如?
:
等对这些保留的字符,除了其自身的作用,如果单纯是要表示字符,需要使用url编码表示
对于这些不安全字符,只要进行了url编码,就不需要担心会被其他含义所迷
3.0 HTTP报文
由于已经单独分出部分去阐述这部分内容了,所以本章节只会添加之前没写过的内容
3.1 报文流
Http报文在客户端,服务器和代理之间流动,属于流出,流入,上游,下游,都是用来表述报文方向的
http报文会像河水一样流动,不管是请求报文还是响应报文,所有报文都会向下游流动,所有的报文的发送者都在
接受者的上有,
3.2报文的组成部分
报文的主体是一个可选的数据块,主体中可以包含文本或者二进制数据,也可也为空。
首部字段一般会使用Content-type 和Content-length 来表示数据的类型和长度
起始行的url:
命名了所请求资源,或者url路径组件的完整url,如果直接与服务器对话,只要url的路径组件是资源的绝对路径
对于请求头:用来说明服务器要使用的附加信息,比较重要的信息由cookie,referer user-agent等,下面简要说
明一些常用的头信息
1 Accept: 请求报头域,用于指定客户端可以接受哪些类型的信息
2 Aceept-Language :指定客户端可接受的语言类型
3 Accept-Encoding :指定客户端可接受的内容编码
4 Host 用于指定请求资源的主机ip和端口号,其内容为请求url的原始服务器或者网关位置
5 Referer
此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这个信息并做响应的的处理。
6 User-Agent 简称ua,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本,浏览器信息
等,在做爬虫时加上此信息,可以伪装成浏览器,如果不加,很可能被识别出为爬虫
7 Content-Type
也叫互联网媒体类型,或者MIME类型,在HTTP协议消息头中,用来标识请求中的媒体信息。
对于响应头:也有对应的头信息
1 Accept-Patch 指定服务器所支持的文档补丁格式
2 Accept-Ranges 服务器所支持的内容范围
3 Content-Disposion :对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,
如:将其下载或是打开
4 Content-Encoding 响应资源所使用的编码类型。
5 Content-Language 响就内容所使用的语言
6 Content-Length响应消息体的长度,用8进制字节表示
7 Content-Type当前内容的MIME类型
8 Date此条消息被发送时的日期和时间(以RFC 7231中定义的"HTTP日期"格式来表示)
9 Expires指定一个日期/时间,超过该时间则认为此回应已经过期
10Server服务器的名称