这篇文章比较长,大家用思维导图来预习一下。
一.概述
1.计算机网络体系结构分层
2.TCP/IP通信传输流
当使用TCP/IP协议族进行网络通信时,会通过分层序列相互通信。发送方从应用层往下走,接收方从链路层往上走。如下:
通信传输流
首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。如下图所示:
httpqueryinfo
在网络架构中,有很多网络协议。本文主要围绕HTTP协议(HTTP/1.1版)展开。
超文本传输协议是一种将超文本从万维网服务器传输到本地浏览器的传输协议。可以使浏览器更高效,减少网络传输。它不仅保证了计算机正确、快速地传输超文本文档,而且确定了传输文档的哪一部分和内容的哪一部分先显示(如文字后图形)。
HTTP是客户端浏览器或其他程序与网络服务器之间的应用层通信协议。超文本信息存储在互联网上的网络服务器上,客户端需要通过HTTP协议传输要访问的超文本信息。HTTP包含命令和传输信息,不仅可以用于Web访问,还可以用于其他Internet/Intranet应用系统之间的通信,从而实现各种应用资源超媒体访问的集成。
我们在浏览器地址栏输入的网址叫做URL(统一资源定位符)。就像每个家庭都有一个家庭地址,所以每个网页都有一个互联网地址。当您在浏览器的地址框中输入网址或单击超链接时,网址将决定要浏览的地址。浏览器通过超文本传输协议(HTTP)在Web服务器上提取网站的网页代码,并翻译成漂亮的网页。
二、HTTP工作流程
HTTP通信机制是在一个完整的HTTP通信过程中,客户端和服务器之间将完成以下七个步骤:
建立 TCP 连接 在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;客户端向服务器发送请求命令 一旦建立了TCP连接,客户端就会向服务器发送请求命令; 例如:GET/sample/hello.jsp HTTP/1.1客户端发送请求头信息 客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;服务器应答 客户端向服务器发出请求后,服务器会客户端返回响应; 例如:HTTP/1.1 200 OK 响应的第一部分是协议的版本号和响应状态码服务器返回响应头信息 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;服务器向客户端发送数据 服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;服务器关闭 TCP 连接 一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。第三,HTTP协议基础
1.通过交换请求和响应进行交流
应用HTTP协议时,一端必须扮演客户端的角色,另一端扮演服务器的角色。仅从一条通信线路来看,服务器和客户服务的角色是确定的。按照HTTP协议,请求从客户端发出,最后服务器响应请求返回。换句话说,必须首先从客户端建立通信,服务器在收到请求之前不会发送响应。
2.HTTP是一种不保存状态的协议
HTTP是无状态协议。协议本身不保存请求和响应之间的通信状态。也就是说,在HTTP级别,协议不持久保存发送的请求或响应。这是为了更快的处理大量事务,保证协议的可扩展性,而HTTP协议就是专门设计的这么简单。
然而,随着网络的不断发展,我们的许多业务都需要保存通信状态。于是我们引入了Cookie技术。通过Cookie和HTTP协议通信,可以管理状态。
3.使用Cookie的状态管理
Cookie技术通过在请求和响应消息中写入Cookie信息来控制客户端的状态。Cookie将根据服务器发送的响应消息中称为设置Cookie的报头字段信息通知客户端保存Cookie。下次客户端向服务器发送请求时,客户端会自动将Cookie值添加到请求消息中并发送出去。当服务器找到客户端发送的Cookie时,会检查是哪个客户端发送的连接请求,然后比较服务器上的记录,最后得到之前的状态信息。
4.请URI找到资源
HTTP协议使用URIs定位互联网上的资源。由于URIs的特殊功能,可以在互联网上的任何地方访问资源。
5.告知服务器意图的HTTP方法(HTTP/1.1)
6.持久连接
在HTTP协议的初始版本中,每次HTTP通信都应该断开一次TCP连接。例如,当使用浏览器浏览包含多个图片的HTML页面时,当您发送访问HTML页面资源的请求时,您也会请求HTML页面中包含的其他资源。所以每一个请求都会造成无畏的TCP连接建立和断开,增加流量开销。
为了解决以上TCP连接问题,HTTP/1.1和一些HTTP/1.0都想出了持久连接的方法。其特征在于,只要任一端没有明确提出断开,TCP连接状态就保持不变。它设计用于在建立TCP连接后与多个请求和响应进行交互。在HTTP/1.1中,默认情况下所有连接都是持久的。
7.管道
持久连接使得大多数请求能够以流水线方式发送。在发送请求之前,您需要等待并收到响应,然后再发送下一个请求。流水线技术出现后,下一个请求不用等待就可以发送。这样可以同时并行发送多个请求,而不是一个个等待响应。
例如,当请求包含多个图片的HTML页面时,使用持久连接可以使请求比逐个连接更快结束。管道技术比持久连接更快。请求越多,时间差越明显。
第四,HTTP协议的消息结构
1.HTTP消息
用于HTTP协议交互的信息称为HTTP消息。请求端(客户端)的HTTP消息称为请求消息;响应端(服务器端)称为响应消息。HTTP消息本身是由多行数据组成的字符串文本(使用CR+LF作为换行符)。
2.HTTP消息结构
HTTP消息大致可以分为消息头和消息体。它们被第一条空线分开(CR+LF)。一般不一定有消息体。如下:
2.1请求消息结构
请求消息的报头内容由以下数据组成:
请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)请求消息的示例如下:
2.2响应消息结构
响应消息的报头内容由以下数据组成:
状态行 —— 包含表明响应结果的状态码、原因短语和 HTTP 版本。首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)响应消息的示例如下:
5.HTTP消息头的请求行和状态行
1.请求行
例如,下面是一条HTTP请求消息:
GET /index.htm HTTP/1.1
主持人:sample.com
其中,下面一行是请求行。
GET/index.htm HTTP/ 1。一
开头的 GET 表示请求访问服务器的类型,称为方法;随后的字符串 /index.htm 指明了请求访问的资源对象,也叫做请求 URI;最后的 HTTP/1.1,即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。总的来说,就是在一个HTTP服务器上请求访问/index.htm页面资源。
2.状态行
还举个栗子,下面是一条HTTP响应消息:
HTTP/1.1 200 OK
日期:2017年7月10日星期一格林尼治时间15:50:06
内容-长度:256
内容类型:文本/html
& lthtml>。
...
其中,下面一行是状态行。
HTTP/1.1 200OK
开头的 HTTP/1.1 表示服务器对应的 HTTP 版本;紧挨着的 200 OK 表示请求的处理结果的状态码和原因短语。不及物动词HTTP消息头的头字段(重点分析)
1.标题字段概述
首先,检查邮件中标题字段的位置。HTTP消息包含一个消息头和一个消息体。消息标题包含一个请求行(或状态行)和一个标题字段。
在众多的消息字段中,HTTP头字段包含了最丰富的信息。标头字段存在于请求和响应消息中,涵盖了与HTTP消息相关的内容信息。标头字段用于向客户服务和服务器提供消息正文大小、使用的语言、身份验证信息和其他内容。
2.标题字段结构
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。另外,字段值对应单个 HTTP 首部字段可以有多个值。当 HTTP 报文首部中出现了两个或以上具有相同首部字段名的首部字段时,这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致。 首部字段名冒号字段值Content-Type:text/htmlKeep-Alive:timeout=30, max=1203.标题字段类型
根据实际用途,标题字段分为以下四种类型:
类型描述通用首部字段请求报文和响应报文两方都会使用的首部请求首部字段从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息响应首部字段从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。实体首部字段针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。4.通用报头字段(HTTP/1.1)
首部字段名说明Cache-Control控制缓存的行为Connection逐挑首部、连接的管理Date创建报文的日期时间Pragma报文指令Trailer报文末端的首部一览Transfer-Encoding指定报文主体的传输编码方式Upgrade升级为其他协议Via代理服务器的相关信息Warning错误通知4.1缓存控制
缓存的工作机制可以通过指定头字段缓存控制的指令来操作。
4.1.1可用说明列表
可用指令按请求和响应分类如下:
缓存请求指令
指令参数说明no-cache无强制向服务器再次验证no-store无不缓存请求或响应的任何内容max-age = [秒]必需响应的最大Age值max-stale( =[秒])可省略接收已过期的响应min-fresh = [秒]必需期望在指定时间内的响应仍有效no-transform无代理不可更改媒体类型only-if-cached无从缓存获取资源cache-extension-新指令标记(token)缓存响应指令
指令参数说明public无可向任意方提供响应的缓存private可省略仅向特定用户返回响应no-cache可省略缓存前必须先确认其有效性no-store无不缓存请求或响应的任何内容no-transform无代理不可更改媒体类型must-revalidate无可缓存但必须再向源服务器进行确认proxy-revalidate无要求中间缓存服务器对缓存的响应有效性再进行确认max-age = [秒]必需响应的最大Age值s-maxage = [秒]必需公共缓存服务器响应的最大Age值cache-extension-新指令标记(token) 4.1.2 表示能否缓存的指令公共指令
缓存控制:公共
当公共指令被指定时,它清楚地表明其他用户也可以使用缓存。
私人指令
缓存控制:私有
当指定私有指令时,响应只以特定用户为对象,这与公共指令的行为相反。缓存服务器将为该特定用户提供资源缓存服务,代理服务器不会为其他用户发送的请求返回缓存。
无缓存指令
缓存控制:无缓存
使用 no-cache 指令是为了防止从缓存中返回过期的资源。 客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。 如果服务器中返回的响应包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。缓存控制:无缓存=位置
在服务器返回的响应中,如果在消息的头字段Cache-Control中用参数值指定了无缓存字段名,则客户端在收到与指定参数值的头字段对应的响应消息后,无法使用缓存。换句话说,没有参数值的头字段可以使用缓存。该参数只能在响应指令中指定。
无存储指令
缓存控制:无存储
当使用无存储指令时,它意味着请求(和相应的响应)或响应包含机密信息。因此,该指令指定缓存不能在本地存储请求或响应的任何部分。
注意:无缓存指令是指不缓存过期指令,缓存会在向源服务器确认有效期后处理资源;无存储指令真的不缓存。
4.1.3指定缓存周期和身份验证的说明
S-maxage指令
缓存控制:s-maxage=604800(单位:秒)
s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 s-maxage 指令只适用于供多位用户使用的公共缓存服务器(一般指代理)。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。 另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及 max-age 指令的处理。最大年龄指令
缓存控制:最大年龄= 604800(单位:秒)
当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定的时间更小,那么客户端就接收缓存的资源。另外,当指定 max-age 的值为0,那么缓存服务器通常需要将请求转发给源服务器。 当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。 应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,并忽略掉 Expires 首部字段;而 HTTP/1.0 版本的缓存服务器则相反。最低新鲜指示
缓存控制:最小刷新= 60(单位:秒)
min-fresh指令要求缓存服务器至少返回未超过指定时间的缓存资源。
最大陈旧指令
缓存控制:最大延迟= 3600(单位:秒)
使用 max-stale 可指示缓存资源,即使过期也照常接收。 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指定了具体参数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。仅当缓存指令
缓存控制:仅当缓存时
指示如果目标资源由缓存服务器本地缓存,客户端将仅要求目标资源返回。换句话说,该指令要求缓存服务器不要重新加载响应或重新确认资源的有效性。
必须更新的指令
缓存控制:必须重新验证
使用必须更新指令,代理再次向源服务器验证要返回的响应缓存目前是否仍然有效。此外,使用必须更新指令会忽略所请求的最大过期指令。
代理更新命令
缓存控制:代理-重新验证
代理更新指令要求所有缓存服务器在接收到来自客户端请求的指令响应之前,再次验证缓存的有效性。
无转换命令
缓存控制:无转换
使用非转换指令指定缓存不能在请求或响应中更改实体主体的媒体类型。这样做可以防止图片的缓存或代理压缩以及其他类似操作。
4.1.4缓存控制的扩展
缓存控制:私有,社区=“UCI”
使用缓存扩展标记,可以扩展缓存控制头字段中的指令。上面提到的社区指令是一个扩展指令,如果缓存服务器无法理解这个新指令,就会直接忽略。
4.2连接
连接头字段有以下两个功能:
控制不再转发的报头字段
连接:升级
在客户端发送的请求和服务器返回的响应中,连接头字段可以用来控制不再转发给代理的头字段,即在转发前删除(即逐跳头)。
管理持久连接
连接:关闭连接:关闭
HTTP/1.1中的默认连接是持久连接。当服务器想要显式断开连接时,连接头字段的值被指定为关闭。
连接:保持活力
HTTP/1.1之前的HTTP版本默认连接都是非持久连接。因此,如果您想在旧版本的HTTP协议上保持连续的连接,您需要将连接头字段的值指定为保持活动。
4.3日期
指示创建HTTP消息的日期和时间。
日期:2017年7月10日星期一15:50:06格林尼治时间
HTTP/1.1协议使用RFC1123中指定的日期和时间格式。
4.4 Pragma
Pragma头字段是HTTP/1.1之前的历史遗留字段,仅定义为与HTTP/1.0向后兼容。
Pragma:无缓存
该首部字段属于通用首部字段,但只用在客户端发送的请求中,要求所有的中间服务器不返回缓存的资源。 所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式最为理想。但是要整体掌握所有中间服务器使用的 HTTP 协议版本却是不现实的,所以,发送的请求会同时包含下面两个首部字段:缓存控制:无缓存
Pragma:无缓存
4.5拖车
预告片:过期
报头字段“尾部”将提前解释哪些报头字段记录在消息正文之后。可以应用于HTTP/1.1版的块传输编码。
4.6传输编码
传输编码:分块
规定了传输报文主体时采用的编码方式。 HTTP/1.1 的传输编码方式仅对分块传输编码有效。4.7升级
升级:TSL/1.0
用于检测HTTP协议和其他协议是否可以与更高版本通信,其参数值可以用来指定完全不同的通信协议。
4.8通过
Via: 1.1 a1.sample.com(Squid/2.7)
为了追踪客户端和服务器端之间的请求和响应报文的传输路径。 报文经过代理或网关时,会现在首部字段 Via 中附加该服务器的信息,然后再进行转发。 首部字段 Via 不仅用于追踪报文的转发,还可避免请求回环的发生。4.9 Warning这个头字段通常通知用户一些关于缓存相关问题的警告。
警告标题字段的格式如下
警告:[警告代码][警告主机:端口号]"[警告内容]"([日期和时间])
最后的日期和时间可以省略。
HTTP/1.1中定义了七种警告,警告代码对应的警告内容仅供参考。此外,警告代码是可扩展的,将来可能会添加新的警告代码。
警告码 警告内容 说明 110 Response is stale(响应已过期) 代理返回已过期的资源 111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因) 112 Disconnection operation(断开连接操作) 代理与互联网连接被故意切断 113 Heuristic expiration(试探性过期) 响应的试用期超过24小时(有效缓存的设定时间大于24小时的情况下) 199 Miscellaneous warning(杂项警告) 任意的警告内容 214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时 299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容5.请求头字段(HTTP/1.1)
首部字段名 说明 Accept 用户代理可处理的媒体类型 Accept-Charset 优先的字符集 Accept-Encoding 优先的内容编码 Accept-Language 优先的语言(自然语言) Authorization Web认证信息 Expect 期待服务器的特定行为 From 用户的电子邮箱地址 Host 请求资源所在服务器 If-Match 比较实体标记(ETag) If-Modified-Since 比较资源的更新时间 If-None-Match 比较实体标记(与 If-Macth 相反) If-Range 资源未更新时发送实体 Byte 的范围请求 If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反) Max-Forwards 最大传输逐跳数 Proxy-Authorization 代理服务器要求客户端的认证信息 Range 实体的字节范围请求 Referer 对请求中 URI 的原始获取方 TE 传输编码的优先级 User-Agent HTTP 客户端程序的信息5.1接受
接受:text/html,application/xhtml+xml,application/XML;q=0.5
Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。 若想要给显示的媒体类型增加优先级,则使用 q=[数值] 来表示权重值,用分号(;)进行分隔。权重值的范围 0~1(可精确到小数点后三位),且 1 为最大值。不指定权重值时,默认为 1。5.2 Accept-CharsetAccept-Charset: iso-8859-5,unicode-1-1;q=0.8
Accept-Charset头字段可用于通知服务器用户代理支持的字符集以及字符集的相对优先级。此外,您可以一次指定多个字符集。Q=[ value]也用来表示相对优先级。
5.3接受编码
接受-编码:g,deflate
Accept-Encoding头字段用于通知服务器用户代理支持的内容代码以及内容代码的优先级顺序,并且可以一次指定多个内容代码。Q=[ value]也用来表示相对优先级。您也可以使用星号(*)作为通配符来指定任何编码格式。
5.4接受-语言
Accept-Lanuage: zh-cn,zh;q=0.7,en=us,en;q=0.3
告诉服务器用户代理可以处理的自然语言集(中文或英文等)。)和自然语言集的相对优先级,并一次指定多个自然语言集。Q=[ value]也用来表示相对优先级。
5.5授权
授权:基本ldfKDHKfkDdasSAEdasd = =
将用户代理的身份验证信息(证书值)通知服务器。通常,希望通过服务器验证的用户代理在收到返回的401状态代码响应后,会将标题字段“授权”添加到请求中。当公共缓存接收到包含授权头字段的请求时,操作处理将略有不同。
5.6期待
期望:100-继续
通知服务器客户端预期的特定行为。
5.7从
出发地:Deeson_Woo@ 163。com
告诉服务器使用用户代理的电子邮件地址。
5.8主机
主持人:www.jianshu.com
告知服务器,请求的资源所处的互联网主机和端口号。 Host 首部字段是 HTTP/1.1 规范内唯一一个必须被包含在请求内的首部字段。 若服务器未设定主机名,那直接发送一个空值即可 Host: 。5.9 If-MatchIf-xxx形式的请求头字段可以称为条件请求。服务器收到带条件的请求后,只有判断指定条件为真,才会执行请求。
如果匹配:“123456”
首部字段 If-Match,属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时的服务器无法使用弱 ETag 值。 服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。 还可以使用星号(*)指定 If-Match 的字段值。针对这种情况,服务器将会忽略 ETag 的值,只要资源存在就处理请求。5.10 If-Modified-Since如果-修改-自:2017年7月10日星期一15:50:06格林尼治标准时间
首部字段 If-Modified-Since,属附带条件之一,用于确认代理或客户端拥有的本地资源的有效性。 它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。5.11 If-None-Match如果-无-匹配:“123456”
标题字段如果-无-匹配是附加的条件之一。它的工作原理与标题字段“如果匹配”相反。当用于指定如果不匹配字段的值的实体标记的值与所请求资源的实体标记不一致时,它告诉服务器处理该请求。
5.12中频范围
if-范围:“123456”
首部字段 If-Range 属于附带条件之一。它告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。 下面我们思考一下不使用首部字段 If-Range 发送请求的情况。服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,当然,范围请求作为前提是无效的。这时,服务器会暂且以状态码 412 Precondition Failed 作为响应返回,其目的是催促客户端再次发送请求。这样一来,与使用首部字段 If-Range 比起来,就需要花费两倍的功夫。5.13 If-Unmodified-Since如果-未修改-自:2017年7月10日星期一15:50:06格林尼治标准时间
标题字段“如果-未修改-自”和标题字段“如果-修改-自”具有相反的功能。它的功能是通知服务器,指定的请求资源只能在字段值中指定的日期和时间之后处理请求。如果更新发生在指定的日期和时间之后,则返回状态代码412先决条件失败作为响应。
5.14最大值-远期
最大转发数:10
当通过TRACE方法或OPTIONS方法发送包含头字段Max-Forward的请求时,该字段以十进制整数的形式指定可以通过的最大服务器数量。在服务器将请求转发到下一台服务器之前,最大转发值减1,然后重新分配。当服务器收到最大转发值为0的请求时,它不会转发它,而是直接返回响应。
5.15代理-授权
代理-授权:基本dGlwOjkpNLAGfFY5
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。 这个行为是与客户端和服务器之间的 HTTP 访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。5.16 Range范围:字节=5
范围:字节=5001-10000
对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。 接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。5.17推荐人
推荐人:http://www . sample . com/index . html
标题字段Referer告诉服务器所请求的原始资源的URI。
5.18 TE
TE: g,放气;q=0.5
首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码。 首部字段 TE 除指定传输编码之外,还可以指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailers 赋值给该字段值。TE: trailers5.19 User-Agent用户代理:Mozilla/5.0(Windows NT 6.1;WOW64rv:13.0) Gecko/20100101
首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。 由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称。6. 响应首部字段(HTTP/1.1)首部字段名 说明 Accept-Ranges 是否接受字节范围请求 Age 推算资源创建经过时间 ETag 资源的匹配信息 Location 令客户端重定向至指定 URI Proxy-Authenticate 代理服务器对客户端的认证信息 Retry-After 对再次发起请求的时机要求 Server HTTP 服务器的安装信息 Vary 代理服务器缓存的管理信息 WWW-Authenticate 服务器对客户端的认证信息6.1接受范围
接受-范围:字节
首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。 可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。6.2 Age年龄:1200
首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。 若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age。6.3 ETagETag: "usagi-1234 "
首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag 值。 另外,当资源更新时,ETag 值也需要更新。生成 ETag 值时,并没有统一的算法规则,而仅仅是由服务器来分配。 ETag 中有强 ETag 值和弱 ETag 值之分。强 ETag 值,不论实体发生多么细微的变化都会改变其值;弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/:ETag: W/"usagi-1234"。6.4 Location网址:http://www . sample . com/sample . html
使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。 基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的 URI。 几乎所有的浏览器在接收到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。6.5 Proxy-Authenticate代理-身份验证:基本领域
首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。 它与客户端和服务器之间的 HTTP 访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。6.6 Retry-After重试后:180
首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。 字段值可以指定为具体的日期时间(Mon, 10 Jul 2017 15:50:06 GMT 等格式),也可以是创建响应后的秒数。6.7 Server服务器:Apache/2.2.6 (Unix) PHP/5.2.5
头字段服务器告诉客户端当前服务器上安装的HTTP服务器应用程序的信息。不仅会标记服务器上软件应用程序的名称,还会标记版本号和安装期间启用的可选选项。
6.8变化
变化:接受-语言
首部字段 Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。 从代理服务器接收到源服务器返回包含 Vary 指定项的响应之后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于 Vary 指定的首部字段不相同,因此必须要从源服务器重新获取资源。6.9 WWW-Authenticate万维网-认证:基本领域
标题字段WWW-Authenticate用于HTTP访问验证。它通知客户端身份验证方案(基本或摘要)和带有参数提示的质询,该参数提示适用于访问请求URI指定的资源。
7.实体头字段(HTTP/1.1)
首部字段名 说明 Allow 资源可支持的 HTTP 方法 Content-Encoding 实体主体适用的编码方式 Content-Language 实体主体的自然语言 Content-Length 实体主体的大小(单位:字节) Content-Location 替代对应资源的 URI Content-MD5 实体主体的报文摘要 Content-Range 实体主体的位置范围 Content-Type 实体主体的媒体类型 Expires 实体主体过期的日期时间 Last-Modified 资源的最后修改日期时间 7.1 Allow允许:开始,头
首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。 当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。7.2 Content-Encoding内容编码:g
首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。 主要采用这 4 种内容编码的方式(g、compress、deflate、identity)。7.3 Content-Language内容-语言:中文
第一个字段,内容-语言,将通知客户实体中使用的自然语言(中文或英文)。
7.4内容-长度
内容-长度:15000
标题字段内容-长度指示实体主体部分的大小(以字节为单位)。当在实体主体上执行内容编码传输时,不能再使用内容长度报头字段。
7.5内容-位置
内容-位置:http://www . sample . com/index . html
标题字段内容-位置给出对应于消息正文的URI。与标题字段位置不同,内容位置指示与消息正文返回的资源相对应的URI。
7.6内容-MD5
内容-MD5:ogfkzduwngvhngy3n 2mxmdiwzmq 4 ntbmy2iyty = =
报头字段Content-MD5是由MD5算法生成的一系列值,旨在检查消息体在传输过程中是否保持完整,并确认传输的到达。
7.7内容-范围
内容-范围:字节5001-10000/10000
对于范围请求,返回响应时使用的标题字段“内容-范围”可以告诉客户端,作为响应返回的实体的哪一部分满足范围请求。字段值以字节为单位,表示当前发送部分和整个实体的大小。
7.8内容类型
内容——类型:文本/html;字符集=UTF-8
标题字段内容类型描述实体主体中对象的媒体类型。与标题字段“接受”一样,字段值以类型/子类型的形式分配。参数字符集由iso-8859-1或euc-jp指定。
7.9到期
到期时间:2017年7月10日星期一15:50:06格林尼治时间
首部字段 Expires 会将资源失效的日期告知客户端。 缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。 源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。7.10 Last-Modified最后修改时间:2017年7月10日星期一15:50:06格林尼治时间
上次修改的标题字段指示资源上次修改的时间。一般来说,该值是请求-URI指定的资源被修改的时间。但是,类似于使用CGI脚本进行动态数据处理,这个值可能成为数据最终被修改的时间。
8.Cookie服务的标头字段
首部字段名 说明 首部类型 Set-Cookie 开始状态管理所使用的 Cookie 信息 响应首部字段 Cookie 服务器接收到的 Cookie 信息 请求首部字段8.1设置Cookie
set-Cookie:status = enable;到期= 2017年7月10日星期一格林尼治时间15:50:06;path =/;
下表列出了设置Cookie的字段值。
属性 说明 NAME=VALUE 赋予 Cookie 的名称和其值(必需项) expires=DATE Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录) domain=域名 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名) Secure 仅在 HTTPS 安全通信时才会发送 Cookie HttpOnly 加以限制,使 Cookie 不能被 Java 脚本访问8.1.1过期属性
Cookie 的 expires 属性指定浏览器可发送 Cookie 的有效期。 当省略 expires 属性时,其有效期仅限于维持浏览器会话(Session)时间段内。这通常限于浏览器应用程序被关闭之前。 另外,一旦 Cookie 从服务器端发送至客户端,服务器端就不存在可以显式删除 Cookie 的方法。但可通过覆盖已过期的 Cookie,实现对客户端 Cookie 的实质性删除操作。8.1.2路径属性
Cookie的Path属性可用于限制指定Cookie发送范围的文件目录。
8.1.3域属性
通过 Cookie 的 domain 属性指定的域名可做到与结尾匹配一致。比如,当指定 example.com 后,除example.com 以外,www.example.com 或 www2.example.com 等都可以发送 Cookie。 因此,除了针对具体指定的多个域名发送 Cookie 之 外,不指定 domain 属性显得更安全。8.1.4安全属性
cookie的安全属性用于限制网页仅在HTTPS安全连接时才发送cookie。
8.1.5 HttpOnly属性
Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 Java 脚本无法获得 Cookie。其主要目的为防止跨站脚本攻击(Cross-site ing,XSS)对 Cookie 的信息窃取。 通过上述设置,通常从 Web 页面内还可以对 Cookie 进行读取操作。但使用 Java 的 document.cookie 就无法读取附加 HttpOnly 属性后的 Cookie 的内容了。因此,也就无法在 XSS 中利用 Java 劫持 Cookie 了。8.2饼干
Cookie:状态=启用
标头字段Cookie告诉服务器,当客户端想要获得HTTP状态管理支持时,它将在请求中包含从服务器接收的Cookie。当收到多个cookie时,也可以以多个cookie的形式发送。
9.其他标题字段
HTTP头字段是可自我扩展的。所以在Web服务器和浏览器的应用中,会出现各种不标准的表头字段。
以下是最常用的标题字段。
9.1 X-框架-选项
框架选项:拒绝
标题字段X-框架-选项属于HTTP响应标题,用于控制网站内容在其他网站的框架标签中的显示。它的主要目的是防止点击劫持攻击。标题字段“X-框架-选项”有以下两个可以指定的字段值:
DENY:拒绝 SAMEORIGIN:仅同源域名下的页面(Top-level-browsing-context)匹配时许可。(比如,当指定 http://sample.com/sample.html 页面为 SAMEORIGIN 时,那么 sample.com 上所有页面的 frame 都被允许可加载该页面,而 example.com 等其他域名的页面就不行了)9.2X-XSS-保护
x-XSS-保护:1
报头字段X-XSS-Protection属于HTTP响应报头,是针对跨站点脚本攻击(XSS)的对策,用于控制浏览器XSS保护机制的切换。可以在标题字段X-XSS-保护中指定的字段值如下:
0 :将 XSS 过滤设置成无效状态 1 :将 XSS 过滤设置成有效状态9.3 DNT
DNT: 1
报头字段DNT属于HTTP请求报头,其中DNT是“不追踪”的缩写,表示拒绝收集个人信息,是一种拒绝被精确广告追踪的方法。可以在标题字段DNT中指定的字段值如下:
0 :同意被追踪 1 :拒绝被追踪由于DNT报头字段的功能是有效的,因此网络服务器需要相应地支持DNT。
9.4 P3P
P3P: CP="CAO DSP LAW CURa ADMa DEVa阿泰PSAa PSDa IVAa IVDa OUR BUS IND
报头字段P3P属于HTTP响应报头。通过使用P3p(The Platform for Privacy Preferences,Online Platform for Privacy Preferences)技术,可以将网站上的个人隐私变成只有程序才能理解的形式,从而保护用户的隐私。
要设置P3P,请按照下列步骤操作:
步骤 1:创建 P3P 隐私 步骤 2:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml 步骤 3:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中七、HTTP响应状态码(重点分析)
1.状态代码概述
HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。 HTTP 状态码如 200 OK ,以 3 位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。 不少返回的响应状态码都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,状态码依然返回 200 OK。2.状态代码类别
类别 原因短语 1xx Informational(信息性状态码) 接收的请求正在处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向状态码) 需要进行附加操作以完成请求 4xx Client Error(客户端错误状态码) 服务器无法处理请求 5xx Server Error(服务器错误状态码) 服务器处理请求出错我们可以自己更改RFC2616中定义的状态代码,也可以由服务器创建状态代码,只要遵循状态代码的类别定义即可。
3.常见状态代码分析
HTTP状态码有很多种,有几十种。其中最常用的有以下14种。我们来看看。
3.1 200 OK
指示从客户端发送的请求通常在服务器端处理。
3.2 204无内容
代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。 一般在只需要从客户端向服务器端发送消息,而服务器端不需要向客户端发送新消息内容的情况下使用。3.3 206部分内容
它表明客户端发出了一个范围请求,服务器成功地执行了GET请求的这一部分。响应消息包含由内容范围报头字段指定的范围内的实体内容。
3.4 301永久移动
持久重定向。指示请求的资源已被分配新的URI。现在资源所指的URI应该在以后使用。也就是说,如果对应于该资源的URI已经被保存为书签,则应该根据由位置头字段提示的URI再次保存它。
3.5 302找到
临时性重定向。表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。 和 301 Moved Permanently 状态码相似,但 302 Found 状态码代表资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。3.6 303参见其他
表示由于请求的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。303 See Other 和 302 Found 状态码有着相同的功能,但 303 See Other 状态码明确表示客户端应采用 GET 方法获取资源,这点与 302 Found 状态码有区别。3.7 304未修改
表示客户端发送附带条件的请求时,服务器端允许请求访问的资源,但未满足条件的情况。304 Not Modified 状态码返回时,不包含任何响应的主体部分。304 Not Modified 虽然被划分到 3xx 类别中,但和重定向没有关系。3.8 307临时重定向
临时重定向。该状态代码的含义与302“已找到”相同。
3.9 400错误请求
表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。3.10 401未经授权
表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外,若之前已进行过 1 次请求,则表示用户认证失败。返回含有 401 Unauthorized 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。3.11 403禁止
表示服务器拒绝访问请求的资源。服务器不需要给出拒绝的详细原因,但是也可以在响应消息的实体体部分描述原因。
3.12 404未找到
指示在服务器上找不到请求的资源。另外,也可以在服务端拒绝请求,不想说明原因的时候使用。
3.13 500内部服务器错误
指示执行请求时服务器端出现错误。也可能是Web应用程序中的一个bug或者某种暂时的失败。
3.14 503服务不可用
表示服务器暂时过载或正在进行停机维护,现在无法处理请求。如果您事先知道缓解上述情况所需的时间,最好编写“重试后”头字段并将其返回给客户端。
八、HTTP消息实体
1.http消息实体概述
请仔细看看上面例子中每个组件对应的内容。
接下来,让我们看看消息和实体的概念。如果把HTTP消息看作是互联网货运系统中的一个盒子,那么HTTP实体就是消息中的实际货物。
报文:是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。(实体首部相关内容在上面第六点中已有阐述。)我们可以看到,上例右图中深红色框的内容是消息的实体部分,而蓝色框的两部分是实体头和实体体。左边图片中的粉红色方框就是消息体。
一般消息体等于实体体。只有在传输中进行编码操作时,实体体的内容才会发生变化,从而导致它与消息体的区别。
2.内容编码
HTTP 应用程序有时在发送之前需要对内容进行编码。例如,在把很大的 HTML 文档发送给通过慢速连接上来的客户端之前,服务器可能会对其进行压缩,这样有助于减少传输实体的时间。服务器还可以把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。这种类型的编码是在发送方应用到内容之上的。当内容经过内容编码后,编好码的数据就放在实体主体中,像往常一样发送给接收方。内容编码类型:
编码方式描述g表明实体采用 GNU 编码compress表明实体采用 Unix 的文件压缩程序deflate表明实体采用 zlib 的格式压缩的identity表明没有对实体进行编码,当没有 Content-Encoding 首部字段时,默认采用此编码方式3.传输编码
内容编码是消息体的可逆转换,与内容的具体格式细节密切相关。
传输编码也是作用于实体体的可逆变换,但它们是出于架构原因而使用的,与内容的格式无关。传输编码用于改变消息中的数据在网络上传输的方式。
4.分组编码
块编码将一条消息分成几个已知大小的块。块是并排发送的,所以发送前不需要知道整个消息的大小。分组编码是一种传输编码,是报文的属性。
块编码和持久连接
如果客户机和服务器之间的连接不是持久的,客户机不需要知道它正在读取的正文的长度,而只需要读取,直到服务器关闭正文的连接。
当使用持久连接时,在服务器写主体之前,它必须知道它的大小,并在内容长度头中发送它。如果服务器动态地创建内容,它在发送之前可能不知道主体的长度。
块编码为这个难点提供了解决方案,只要允许服务器分块发送主体,并说明每个块的大小。因为主体是动态创建的,所以服务器可以缓冲它的一部分,发送它的大小和相应的块,然后在发送主体之前重复这个过程。服务器可以使用大小为0的块作为主体结束的信号,以便保持连接并为下一次响应做准备。
让我们看一个块编码消息的例子:
5.多部分媒体类型
MIME中的多部分电子邮件包含多条消息,这些消息作为一条复杂的消息一起发送。每个部分都是独立的,有自己的集合描述它的内容,不同的部分通过分界字符串连接在一起。
相应地,HTTP协议也采用多部分对象集,发送的消息正文可以包含各种类型的实体。
多部分对象集合包含以下对象:
multipart/form-data:在 Web 表单文件上传时使用。multipart/byteranges:状态码 206 Partial Content 响应报文包含了多个范围的内容时使用。6.范围请求
假设你正在下载一个很大的文件,下载了四分之三,突然网络中断,那么你必须重新开始。为了解决这个问题,需要一个可恢复的机制,即可以从之前的下载中断恢复下载。要实现这个功能,这需要范围请求。
通过范围请求,HTTP客户端可以通过请求未能获得的实体的范围(或部分)来恢复下载该实体。当然,有一个前提,即从客户端最后一次请求实体的时间到发出范围请求的时间,对象没有发生变化。例如:
GET /bigfile.html HTTP/1.1
主持人:www.sample.com
范围:字节=20224-
在上面的例子中,客户端请求文档前20224字节之后的部分。
九.与超文本传输协议合作的网络服务器
在HTTP通信中,除了客户端和服务器端,还有一些用来辅助通信的应用。更重要的如下:代理、缓存、网关、隧道和代理。
1.机构
HTTP代理服务器是Web安全、应用集成和性能优化的重要组成部分。代理位于客户端和服务器之间,接收来自客户端的所有HTTP请求,并将它们转发给服务器(在转发之前,请求可能会被修改)。对用户来说,这些应用程序只是代表他们访问服务器的代理。
出于安全原因,代理通常用作转发所有网络流量的可信中间节点。代理还可以过滤请求和响应,安全或绿色上网。
2.高速缓存
浏览器第一次请求:
浏览器再次请求:
Web缓存或代理缓存是一种特殊的HTTP代理服务器,可以复制和保存代理传输的常用文档。下一个请求相同文档的客户端可以享受缓存的私有副本所提供的服务。客户端从附近的缓存下载文档的速度比从远程网络服务器快得多。
3.门
网关是一种特殊的服务器,作为其他服务器的中间实体。常用于将HTTP流量转换为其他协议。网关接收请求,就好像它是资源的源服务器一样。客户端可能不知道他们正在与网关通信。
4.人工地下通道
隧道是一种建立后在两个连接之间盲目转发原始数据的HTTP应用程序。超文本传输协议隧道通常用于通过一个或多个超文本传输协议连接转发非超文本传输协议数据,而不会窥探数据。
HTTP隧道的一个常见用途是通过HTTP连接传输加密的安全套接字层(SSL)流量,这样SSL流量就可以通过只允许网络流量通过的防火墙。
5.代理代理
代理代理是代表用户发起HTTP请求的客户端应用程序。发布网络请求的所有应用程序都是超文本传输协议代理。
涤纶_Woo
https://www.jianshu.com/p/6e9e4156ece3
1.《超文本传输协议 一篇文章带你详解 HTTP 协议(网络协议篇一)》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《超文本传输协议 一篇文章带你详解 HTTP 协议(网络协议篇一)》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/1624291.html