米葫芦网

HTTP远程变量选择算法—RVSA/1.0

热度:3℃ 发布时间:2024-11-17 17:21:28

本备忘录的状态
本文档讲述了一种Internet社区的Internet标准跟踪协议,它需要进一步进行讨论和
建议以得到改进。请参考最新版的“Internet正式协议标准”(STD1)来获得本协议的标准
化程度和状态。本备忘录的发布不受任何限制。
版权声明
Copyright(C)TheInternetSociety(2001).
摘要
HTTP答应web站点作者在单一URL下放置相同信息的多个版本。透明内容协商是用来
在存取URL时自动选择最佳变量的一种机制。一个远程变量选择算法能用来加速透明协商进
程。这篇文档定义了1.0版本的远程变量选择算法。
目录
1.介绍 2
2.术语和符号 3
3.远程变量选择算法 3
3.1输入 3
3.2输出 3
3.3计算总体品质因数 3
3.4确定及不确定的品质值 4
3.5确定结果 5
4.算法的使用 5
4.1使用品质因数为参数划分等级 5
4.2.1折叠接收报头元素 6
4.2.2忽略接收报头 7
4.2.3动态长度请求 7
4.3本地和远程算法的区别 8
4.3避免主要区别 8
4.3.2解决细微区别 8
5.0安全和隐私考虑 8
6.致谢 9
7.参考文献 9
8.作者地址 9
9.完整版权说明 9
1.介绍
HTTP答应web站点作者在单一URL下放置相同信息的多个版本。透明内容协商[2]是
用来在存取URL时自动选择最好版本的一种机制。远程变量选择算法能被HTTP服务器用来
为一个协商用户代理选择一个最好的变量。通过减少一个请求-响应往返,远程变量选择算
法的使用能够加速透明协商进程。
这篇文档定义了1.0版本的远程变量选择算法。此算法计算请求的接收报头里是否包含
足够的信息来进行一个选择,并且在包含足够信息的情况下,决定选择哪一个变量。
2.术语和符号
这篇说明使用HTTP透明内容协商说明[2]中的术语和符号。
3.远程变量选择算法
这篇文档定义了1.0版本的远程变量选择算法。为了实现这个定义,服务器可能运行任
何产生相同结果的算法。
注重:根据[2],服务器也可以返回一个列表响应,而不运行一个远程算法。因此,任
何时候,服务器只要可以运行一个远程算法,它就可以运行该算法的部分实现,只要部分实
现在不能计算真实结果时也返回列表响应。
3.1输入
算法通常为一个非凡的请求而运行,这个非凡的请求请求一非凡的透明可协商资源。它
将以下信息作为输入。
1. 资源的变量列表,正如资源的备用报头所示。
2. (部分)关于这个非凡请求的用户代理的功能和参数信息,和请求的接收报头里给
出的一样。
假如在备用报头里存在一个回撤变量描述{“fallback.Html”},这个算法必须将它解释为下
面的变量描述{“fallback.html”0.000001}。这个极低的品质因数确保了只有当所有其它
选择都用尽时回撤变量才会被选中。
3.2输出
作为它的输出,远程变量选择算法接着将产生合适的动作。存在两种可能:
选择响应
接收报头包含足够的信息来为可能的用户代理作出选择,而且在一个选择响应中必
须返回一个最佳变量。
列表响应
接收报头没有包含足够的信息为可能的用户代理作出选择。必须返回一个列表响
应,这样就答应用户代理自己作出选择。
3.3计算总体品质因数
远程变量选择算法的第一步,是计算列表中的个体变量的总体品质因数。
一个变量的总体品质Q的值为
Q=round5(qs*qt*qc*ql*qf)
这里round5是一个函数,它将一个浮点值四舍五入直到小数点后有5个十进制数,参
数qs,qt,qc,ql和qf按如下方式决定。
qs是变量描述中的源品质因数。
qt假如变量描述中没有类型属性,或者在请求中没有接收报头,媒体类型品质因数
就是1。否则,它就是接收报头在类型属性中给媒体类型赋的值。
注重:假如一个类型不能和接收报头中的任何元素匹配,接收报头就把这种类型的
品质因数赋为0。
qc假如在变量描述中没有字符集属性,或在请求中没有接收字符集报头,字符集
品质因数就是1。否则,字符集品质因数就是接收字符集报头在字符集属性中给字符集赋
的值。
ql假如在变量描述中没有语言属性,或在请求中没有接收语言报头,语言品质因
数就是1。否则,语言品质因数就是接收语言报头在语言属性中给列出的任何一种语言赋
予的所有的品质因数中的最高值。
qf假如在变量描述中没有特征属性,或在请求中没有接收特征报头,特征品质因
数就是1。否则,它就是特征属性的品质退化因数,参见[2]的6.4节。
例如,假如一个变量列表包含变量描述{“paper.html.en"0.7{type
text/html}{languagefr}}并且请求包含接收报头
Accept:text/html:q=1.0,*/*=0.8
Accept-Language:en;q=1.0,fr;q=0.5
远程变量选择算法会按下面方式为变量计算一个总体品质:
{"paper.html.fr"0.7{typetext/html}{languagefr}}

VVV
round5(0.7*1.0*0.5)=0.35000
按上面的接收报头,下面完整的变量列表
{"paper.html.en"0.9{typetext/html}{languageen}},
{"paper.html.fr"0.7{typetext/html}{languagefr}},
{"paper.ps.en"1.0{typeapplication/postscript}{languageen}}
会产生下面的计算式:
round5(qs*qt*qc*ql*qf)=Q
----------------------
paper.html.en:0.9*1.0*1.0*1.0*1.0=0.90000
paper.html.fr:0.7*1.0*1.0*0.5*1.0=0.35000
paper.ps.en:1.0*0.8*1.0*1.0*1.0=0.80000
3.4确定及不确定的品质值
一个计算好的总体品质值既可能是确定的,也可能是不确定的。假如计算时没有使用
任何接收报头中的‘*’通配符,并且不需要一个非凡接收报头不存在,那么它就是确定的。
相反,它就是不确定的。
比如,在这节里,paper.html.en和paper.html.fr的品质值是确定的,paper.ps.en
的品质值是不确定的,因为application/postscript类型和范围*/*匹配。
确定性可以定义地更正规,如下所示。一个总体品质值Q是确定的,假如在请求信息
按照如下方式改变之后还能计算出相同的品质值Q的话:
1.假如一个接收报头,接收字符集报头,接收语言报头,或接收特征报头从请求中丢失了,向
这个报头中加上一个空字段。
2.从接收报头中删除任何包含一个通配符‘*’的媒体域。从接收字符集报头,接收语言
报头,和接收特征报头中删除所有通配符‘*’。
这里是另外一个例子,变量{“blah.html”1{languageen-gb}{featuresblebber[x
y]}},假如它的接收报头是
Accept-Language:en-gb,fr
Accept-Features:blebber,x,!y,*和
Accept-Language:en,fr
Accept-Features:blebber,x,*
它的总体品质因数是1并且是确定的
假如接收报头是
Accept-language:en-gb,fr
Accept-Features:blebber,!y,*和
Accept-Language:fr,*
Accept-Features:blebber,x,!y,*
总体品质因数还是1,但是是不确定的,
3.5确定结果
最优变量,由远程变量选择算法决定的,是具有最高总体品质值的变量,或者当有许
多变量具有此相同的最高品质值时,是列表中的第一个具此值的变量。
当下列所有条件都满足时,远程变量选择算法的最终结果是选择响应:
a. 最优变量的总体品质值大于0。
b. 最优变量的总体品质值是一个确定的品质值。
c. 变量资源和可协商资源相邻。这个条件的存在确保了一个对选择响应的安全相关限
制得到满足。参见[2]的10.2和10.4节。
在所有其它情况下,最终结果都是列表响应。
上面对确定性的要求以一种戏剧性的方式影响对接收报头的解释。比如,它使得远程算
法将报头
Accept:image/gif;q=0.9,*/*;q=1.0解释成
‘我接收品质值为0.9的image/gif,并把其它媒体类型的品质类型赋为1.0。假如此信息
不够我自己作出选择,就不作选择而是发送变量列表"。
没有以上要求的话,解释就会是
‘我接收品质值为0.9的image/gif,和品质值为1.0的所有其它媒体类型"。
4.算法的使用
这一节讨论用户代理怎样以一种最佳方式使用远程算法。这节是非标准化的,把它包括
进来只是出于提供信息的目的。
4.1使用品质因数为参数划分等级
使用品质因数,用户代理不仅可以为一个非凡接收报头里的元素划分等级,而且也能表
示不同接收报头之间的优先等级。比如考虑下面的变量列表:
{"paper.english"1.0{languageen}{charsetISO-8859-1}},
{"paper.greek"1.0{languageel}{charsetISO-8859-7}}
并且假设用户选择“el”而不是“en”,这时用户代理能使“ISO-8859-1”的品质比“ISO-8859-7”
的高。假如接收报头是:
Accept-Language:gr,en;q=0.8
Accept-Charset:ISO-8859-1,ISO-8859-7;q=0.6,*
那么远程变量选择算法会选择English变量,因为这个变量的总体品质退化最少。但是假如
接收报头是
Accept-Language:gr,en;q=0.8
Accept-Charset:ISO-8859-1,ISO-8859-7;q=0.95,*
那么算法就会选择Greek变量。一般地,品质因数之间差额最大的接收报头获得最高优先权。
假如用户代理答应用户为一些报头设置品质因数,同时其它因数都是hard-coded的,它就
应该对hard-coded的因数使用一个低差额,对用户提供的因数提供一个高差额,所以用户
设置比内置设置具有更高的优先权。
4.2短请求的构造
在对透明可协商资源的一个请求中,用户代理不需要发送一个列出所有功能的长接收报
头。比如,不发送
Accept:image/gif;q=0.9,image/jpeg;q=0.8,image/png;q=1.0,
image/tiff;q=0.5,image/ief;q=0.5,image/x-xbitmap;q=0.8,
application/plugin1;q=1.0,application/plugin2;q=0.9
用户代理发送
Accept:image/gif;q=0.9,*/*;q=1.0
它能发送短报头,从而不冒获得一个次等image/tiff变量的选择响应的危险。例如,对变
量列表
{"x.gif"1.0{typeimage/gif}},{"x.tiff"1.0{typeimage/tiff}},
远程算法将为x.gif计算一个确定的总体品质0.9,并为x.tiff计算一个不确定的总体品
质因值1.0。因为最优变量拥有一个不确定的品质值,算法不会选择x.tiff,而是返回一个
列表响应,在此之后用户代理的选择算法会正确地选择x.gif。最终结果和发送长接收报头
得到的结果相同。
因此,用户能改变接收报头的长度以在首次请求发送速度,和远程算法拥有足够信息消除第
二次请求的机会之间获得最佳平衡。
4.2.1折叠接收报头元素
这节讨论一个列出所有功能和参数的长接收报头如何被安全地缩短。远程变量算法按某
种方式设计,使得它总可以这安全地缩短接收或接收字符集报头,它提取两个报头元素
‘A;q=f’和‘B;q=g’并用一个元素‘P;q=m’代替它们,这里P是一个匹配A和B的通配
符类型,m是f和g的最大值。这里是一些例子
text/html;q=1.0,text/plain;q=0.8-->text/*;q=1.0
image/*;q=0.8,application/*;q=0.7-->*/*;q=0.8
iso-8859-5;q=1.0,unicode-1-1;q=0.8-->*;q=1.0
注重上面的个‘;q=1.0’都是可选的,可以忽略:
iso-8859-7;q=0.6,*-->*
对于接收语言,可以安全地将所有具有相同主要标记符的语言域折叠为一个通配符:
en-us;q=0.9,en-gb;q=0.7,en;q=0.8,da-->*;q=0.9,da
也可以安全地将一个语言域折叠为一个通配符,或者将它替代为一个通配符,假如它的主要
标记符只出现一次:
*;q=0.9,da-->*
最后,在接收特征报头中,每一个特征表达式都能够被折叠为一个通配符,或者替代为一个
通配符:
colordepth!=5,*-->*
4.2.2忽略接收报头
根据HTTP/1.1说明[1],一个接收报头完全不存在于请求中等价于‘Accept:*/*’。因
此,假如接收报头被折叠成‘Accept:*/*’,用户代理可能完全忽略它。包含‘*’的接收字
符集,接收语言,或接收特征也可能被忽略。
4.2.3动态长度请求
一个能进行透明内容协商的用户代理也能缺省发送短请求。一些短接收报头为了已存的
使用HTTP/1.0的服务器的利益,也能被包括进来(参见[2]的4.2节)。这是一个例子:
GET/paperHTTP/1.1
Host:x.org
User-Agent:WuxtaWeb/2.4
Negotiate:1.0
Accept-Language:en,*;q=0.9
假如这样一个作为输入的缺省请求包含的接收报头和远程变量选择算法不匹配,用户代理就
能够发送‘Negotiate:trans’而不是‘Negotiate:1.0’,从而使算法失效。
假如用户代理发现了,不管是否接收到一个列表或选择响应,一个非凡的源服务器包含透明
协商资源,它就能动态设置对这个服务器的以后的请求的长度,例如GET/paper/chapter1
HTTP/1.1
Host:x.org
User-Agent:WuxtaWeb/2.4
Negotiate:1.0
Accept:text/html,application/postscript;q=0.8,*/*
Accept-Language:en,fr;q=0.5,*;q=0.9
Accept-Features:tables,*
这将增加远程变量选择算法拥有足够信息为用户代理作出选择的机会,因而会使协商进程最
优化。一个动态扩展的优良算法是用这些媒体类型,语言,字符集,和特征标记符来扩展报
头,这些都是在过去来自服务器的响应的变量列表中提到的。
4.3本地和远程算法的区别
一个用户代理只能最优化内容协商,即使使用远程算法,而它的本地算法一般会做出相
同的选择。假如用户代理收到一个包括由远程算法选择的变量X,而本地算法会选择Y,用
户代理有两种选择:
1. 在接下来的请求中重新得到Y。这不是最佳方案,因为它费时间。
2. 无论如何也要显示X。这不是最佳方案,因为它使最终结果依靠于会随机改变的因数。
对于对同一资源的下个请求,中间代理缓冲会返回一个列表响应,这会导致本地算法选
择并重新得到Y而不是X。和稳定的表示相比,一个随机地在X和Y之间转换的表示的
品质低得多。
因为上面的两种选择都没有吸引力,用户代理应该试着一起避免上面的两种情况。下面
的几节讨论了这该如何实现。
4.3避免主要区别
假如用户代理使这篇说明中的远程算法生效了,它应该按照惯例使用一个很类似远程算
法的本地算法。此算法也应该使用乘法组合品质因数。假如用户代理通过加法组合品质因数,
定义一个新远程变量选择算法会更有利,这个算法有一个新的主要版本号。
4.3.2解决细微区别
即使一个本地算法使用乘法组合品质因数,它还是可以使用扩展的品质公式像:
Q=round5(qs*qt*qc*ql*qf)*q_adjust
以解决维之间的非凡相互依靠,这种依靠源自用户代理的局限性。例如,假如用户代理,由
于某种原因,在翻译text/plain文档时不能处理iso-8859-7字符集,而text/plain-
iso-8859-7组合在变量描述中出现时,q_adjuster因数就会为0,否则为1。
通过选择性地扣留来自远程变量选择算法的信息,用户代理能确保假如本地q_adjust
小于1,远程算法永远不会作出一个选择。例如,为阻止远程算法返回一个text/plain-
iso-8859-7选择响应,用户代理应该小心永远不要产生一个精确说明text/plain和
iso-8859-7品质因数的请求。对一个请求的任一因数的忽略都会任何text/plain-
iso-8859-7变量的总体品质值成为不确定的,拥有不确定品质值的变量永远不会在一个选
择响应中返回。
一般地,对一个非凡的组合X-Y-X,假如本地q_adjust不等于1,一个远程选择可以
通过如下方式阻止,总是忽略来自接收报头的组合中的元素,并加上一个合适的通配符类型
来匹配忽略的元素,假如这样的类型还没有存在的话。
5.0安全和隐私考虑
这部分说明没有介绍任何[2]中还没有涉及到的安全和隐私考虑。参见[2]以获得和
接收报头相关的隐私风险。
6.致谢
有关HTTP内容协商的工作至少自1993年就已经做好了。作者不能够追溯这篇文档中的
许多观点的来源。许多HTTP工作组的成员对这篇说明中的协商模型作出了贡献。作者衷心
感谢那些对这篇文档早期版本作出评论的个人,包括BrianBehlendorf,DanielDuBois,
TedHardie,LarryMasinter,andRoyT.Fielding.
7.参考文献
[1]Fielding,R.,Gettys,J.,Mogul,J.,Frystyk,H.,and
T.Berners-Lee,"HypertextTransferProtocol--HTTP/1.1",RFC
2068,January1997.
[2]Holtman,K.,andA.Mutz,"TransparentContentNegotiationin
HTTP",RFC2295,March1998.
8.作者地址
KoenHoltman
TechnischeUniversiteitEindhoven
Postbus513
KamerHG6.57
5600MBEindhoven(TheNetherlands)
EMail:koen@win.tue.nl
AndrewH.Mutz
Hewlett-PackardCompany
1501PageMillRoad3U-3
PaloAltoCA94304,USA
Fax:+14158574691
EMail:mutz@hpl.hp.com
9.完整版权说明
Copyright(C)TheInternetSociety(1998).AllRightsReserved.
Thisdocumentandtranslationsofitmaybecopiedandfurnishedto
others,andderivativeworksthatcommentonorotherwiseeXPlainit
orassistinitsimplementationmaybeprepared,copied,published
anddistributed,inwholeorinpart,withoutrestrictionofany
kind,providedthattheabovecopyrightnoticeandthisparagraphare
includedonallsUChcopiesandderivativeworks.However,this
documentitselfmaynotbemodifiedinanyway,suchasbyremoving
thecopyrightnoticeorreferencestotheInternetSocietyorother
Internetorganizations,exceptasneededforthepurposeof
developingInternetstandardsinwhichcasetheproceduresfor
copyrightsdefinedintheInternetStandardsprocessmustbe
followed,orasrequiredtotranslateitintolanguagesotherthan
English.
Thelimitedpermissionsgrantedaboveareperpetualandwillnotbe
revokedbytheInternetSocietyoritssuccessorsorassigns.
Thisdocumentandtheinformationcontainedhereinisprovidedonan
"ASIS"basisandTHEINTERNETSOCIETYANDTHEINTERNETENGINEERING
TASKFORCEDISCLAIMSALLWARRANTIES,EXPRESSORIMPLIED,INCLUDING
BUTNOTLIMITEDTOANYWARRANTYTHATTHEUSEOFTHEINFORMATION
HEREINWILLNOTINFRINGEANYRIGHTSORANYIMPLIEDWARRANTIESOF
MERCHANTABILITYORFITNESSFORAPARTICULARPURPOSE.
RFC2296——HTTPRemoteVariantSelectionAlgorithm--RVSA/1.0HTTP远程变量选择算法—RVSA/1.0



网友评论
评论
发 布

更多软件教程
  • 软件教程推荐
更多+
Greenfoot设置中文的方法

Greenfoot设置中文的方法

Greenfoot是一款简单易用的Java开发环境,该软件界面清爽简约,既可以作为一个开发框使用,也能够作为集成开发环境使用,操作起来十分简单。这款软件支持多种语言,但是默认的语言是英文,因此将该软件下载到电脑上的时候,会发现软件的界面语言是英文版本的,这对于英语基础较差的朋友来说,使用这款软件就会...

07-05

Egret UI Editor修改快捷键的方法

Egret UI Editor修改快捷键的方法

Egret UI Editor是一款开源的2D游戏开发代码编辑软件,其主要功能是针对Egret项目中的Exml皮肤文件进行可视化编辑,功能十分强大。我们在使用这款软件的过程中,可以将一些常用操作设置快捷键,这样就可以简化编程,从而提高代码编辑的工作效率。但是这款软件在日常生活中使用得不多,并且专业性...

07-05

KittenCode新建项目的方法

KittenCode新建项目的方法

KittenCode是一款十分专业的编程软件,该软件给用户提供了可视化的操作界面,支持Python语言的编程开发以及第三方库管理,并且提供了很多实用的工具,功能十分强大。我们在使用这款软件进行编程开发的过程中,最基本、最常做的操作就是新建项目,因此我们很有必要掌握新建项目的方法。但是这款软件的专业性...

07-05

Thonny设置中文的方法

Thonny设置中文的方法

Thonny是一款十分专业的Python编辑软件,该软件界面清爽简单,给用户提供了丰富的编程工具,具备代码补全、语法错误显示等功能,非常的适合新手使用。该软件还支持多种语言,所以在下载这款软件的时候,有时候下载到电脑中的软件是英文版本的,这对于英语基础较差的小伙伴来说,使用这款软件就会变得十分困难,...

07-05

最新软件下载