首页 > 代码库 > HTTP协议

HTTP协议

1.URI是一类更通用的资源标识符,URL实际上是它的一个子集。URI是一个通用的概念,由两个主要的子集URL和URN构成。URL是通过描述资源的位置来标识资源的,URN是通过名字来标识资源的,与其当前所处位置无关。

HTTP规范将更通用的概念URI作为其资源标识符。但实际上HTTP应用程序处理的只是URI的子集URL。

 

2.连接管理:

HTTP连接实际上就是TCP连接和一些使用连接的规则。

TCP为HTTP 提供了一条可靠的比特传输管道

串行连接

并行连接

持久连接 Keep-alive

管道化连接

关闭连接

 

 3.web服务器

服务器应该实现的基本任务:

接收客户端连接:处理新连接 ,识别客户端主机名

接收请求报文:

  从网络连接中中读取请求报文,转换成内部数据结构处理,如字典

  连接的输入/输出处理结构: 单线程web服务器,多进程及多线程web服务器,复用I/O的服务器(同时监听所有连接上的活动,根据状态变化绑定线程和进程),复用的多线程I/O结构web服务器。

处理请求:

对资源的映射和访问(静态映射访问和动态内容的映射)

构建响应:(响应实体,MIME类型,重定向)

发送响应:

记录事务日志:

 

4.代理:

HTTP代理服务器是代表客户端完成事务处理的中间人,既是web服务器,又是web客户端。

代理与网关的区别,代理是连接两个或多个使用相同协议的应用程序,而网关连接的是两个或多个使用不同协议的端点,扮演的是协议转换器角色

文档访问控制

安全防火墙

web缓存

反向代理:假扮web服务器,被称作替代物或反向代理,接收请求转发给其他服务器的通信,按需定位所请求的内容,提高访问web服务内容的性能

内容路由器

转码器

匿名代理(删除请求身份特性,如user-agent之类的)

 

代理服务器的部署:

 出口代理

 访问入口代理

反向代理

网络交换代理

 

代理如何获取流量的:(使客户端流量流向代理)

修改客户端,将客户端配置为使用代理服务器:

 手工配置

pac文件:小型的javascript文件,可以再运行过程中 计算代理设置,是一种更动态的代理配置解决方案。访问每个文档时,js函数都会选择恰当的代理服务器。

WPAD协议:WPAD协议的算法会使用发现机制的逐级上升策略自动为浏览器查找合适的PAC 文件。

 

修改网络 基础设施上的交换设备及路由设备,对HTTP流量进行拦截,导入一个代理(这种代理称为拦截代理)

修改DNS的命名空间

修改web服务器(重定向到代理上去)

 Via首部:该字段列出了与报文途径的每个中间节点(代理或网关)有关的信息。报文每经过一个节点,都必须将这个中间节点添加到

Via列表的末尾

 Server响应首部字段对原始服务器使用的软件进行了描述,如果响应报文是代理转发的,一定要确保代理没有修改Server首部

 

TRACE 方法:跟踪经代理链传输的请求报文,观察报文经过了哪些代理,以及每个代理是如何对请求报文进行修改的。

TRACE响应的Content-Type为message/http,状态为200 OK

Max-Forwards (最大转发次数 )首部来限制TRACE和OPTIONS请求所经过的代理跳数

 

缓存:

 缓存的处理步骤:

1.接收 :缓存从网络中读取抵达的请求报文

2.解析:缓存对报文进行解析,提取首部和URL

3.查询:查询是否有本地副本可用,没有,就获取一份副本(并将其保存在本地)

4.新鲜度检测:查看已经缓存副本是否足够新鲜,如果不是就询问服务器是否有任何更新

5.创建响应:缓存会用新的首部和已缓存的主体来构建一条响应报文

6.发送:缓存通过网络将响应发回给客户端

7.日志:缓存可选地创建一个日志文件条目来描述这个事务

 如何保持副本的新鲜:

 HTTP有一些简单的机制可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下,保持已缓存的数据与服务器的数据之间充分一致。HTTP将这些简单的机制称为

文档过期和服务器再验证

文档过期:

通过特殊的HTTP Cache-Control首部和Expire首部,HTTP让原始服务器向每个文档附加了一个“过期日期”。

过期日期首部:

Expires 首部   (HTTP/1.0+)

Cache-Control : max-age 首部:max-age 最大试用期,第一次生成文档到文档不再新鲜为止, 以秒为单位

以上两者所做的事情本质上市一样的,但是Cache-Control使用的是相对日期,绝对日期依赖于计算机时钟的正确设置,因此倾向于使用新的Cache-Control首部。

缓存只有在文档过期时它才与服务器进行再验证:

用条件方法进行再验证:

条件请求首部:

If-Modified-Since: Date 再验证  如果从指定日期之后文档被修改过了,就执行请求的方法,可以与Last-Modified服务器响应首部配合使用

If-None-Match:实体标签验证

 

缓存控制:使用期 和 新鲜度 算法

 ---------------------------

集成点:网关、隧道及中继

 网关(gateway):为了解决单个应用程序无法处理所有这些能想到的资源的问题。开发者提出了网关的概念。

网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。应用程序可以(通过HTTP或其他已定义的接口)请求网关来处理某条请求,网关可以提供一条响应。网关可以向数据库发送查询语句,或者生成动态的内容,就像一个门一样:进去一条请求,出来一个响应。

 

协议网关:

HTTP/*:服务器端Web网关,请求流入原始服务器时,服务器端web网关会将客户端HTTP请求转换为其他协议。

HTTP/HTTPS:服务器端安全网关

HTTPS/HTTP:客户端安全加速器网关,这些网关位于web服务器之前,通常作为不可见的拦截网关或反向代理使用。它们接收完全的HTTPS流量,并对其进行解密,并向web服务器发送普通的HTTPl流量。

 

资源网关:

应用程序服务器,是最常见的服务器端网关,会将目标服务器与网关结合在一个服务器中实现,与客户端通过http进行通信,并与服务器端的应用程序相连。

应用程序服务器 与 服务器上的应用程序 通过 网关应用编程接口相连,例如 wsgi (python web服务器网关接口)

CGI:

第一个流行的应用程序网关API 就是通用网关接口(Common Gateway Interface CGI),

早期的网关接口(CGI)实现过程中,服务器和网关是相互独立的应用程序,因此它们的责任是分得很清楚的,

这个简单的协议(输入请求 ,转交,响应),是最常用服务器扩展接口CGI的本质

 

CGI 应用程序是独立于服务器的,所以可以用任意语言实现。

CGI在服务器和众多的资源类型之间提供了一种简单的、函数形式的粘合方式,用来处理各种需要的转换。这个接口还能很好地保护服务器,防止一些糟糕的扩展对它造成的破坏(如果这些扩展直接与服务器相连,造成的错误可能会引发服务器崩溃)

但是这种分离会造成性能的崩溃,为每条CGI请求引发一个新进程的开销是很高的,会限制那些使用CGI的服务器的性能,并且会加重服务端机器资源的负担。

 

服务器扩展API,会绑定服务器自身的结构上,如果基于某种协议实现 ,api才可移植到不同的服务器 ,如wsgi

--------------------------------

HTTP可以作为一种连接应用程序的基础软件来使用,在将应用程序连接起来的过程中,一个更为棘手的问题是在两个应用程序之间进行协议接口的协商,以便应用程序可以进行数据的交换。应用程序之间要配合工作,所要交互的信息比HTTP首部所能表达的信息要复杂得多。

web服务 ,就是构建在标准的web技术(比如HTTP)之上的。可以用XML通过SOAP来交换信息。

XML 提供了一种创建数据对象的定制信息

SOAP 简单对象访问协议,是向HTTP报文中添加XML信息的标准方式

 

------------------------

 Web机器人:

web爬虫:

web爬虫是一种机器人,它们会递归地对各种信息性web站点进行遍历,获取第一个页面,然后获取那个页面指向的所有页面,以此类推。递归地追踪这些web链接的机器人会沿着HTML链接创建网络的“爬行”。

从根集开始:爬虫开始访问的URL初始集合被称作为根集。

 

HTML的robot-control元标签

robot.txt的缺点就是它是web站点管理员所有的,而不是各部分内容的作者所有的,

HTML页面的作者有一种更直接的方式可以限制机器人访问那些独立的页面,可以在HTML文档中添加robot-contro元l标签

 

 客户端识别与Cookie机制

1.http首部(承载用户的相关信息)

From

User-agent

Referer

2.客户端IP地址(不可靠)

3.用户登录(HTTP认证机制)

4.胖URL

5.cookie(是当前识别用户,保持持久会话的最好方式)

cookie的类型:会话cookie 、持久cookie

之间的唯一区别在于过期时间

 cookie的基本思想就是让浏览器积累一组服务器特有的信息,以后每次访问服务器时都将这些信息提供给他。浏览器要负责存储cookie信息

 cookie的域属性:

产生cookie的服务器可以向set-cookie响应首部添加一个Domain属性来控制哪些站点可以看到那个cookie.

cookie的路径属性:

这个属性列出的URL路径前缀下所有的cookie都是有效的

cookie的成分:

现在使用的Cooke规范有两个不同的版本,cookies version 0和 cookies version1 ,后者是对前者的扩展,但没有前者应用广泛

 

cookie vesion 0

Set-Cookie首部属性,各项用分号隔开

NAME=VALUE  ,在后继对站点的访问会将其送会给web服务器

Expires ,可选,指定一个日期,定义cookie的实际生存期,过期则不在存储或发布这个cookie,不指定,cookie则在用户会话结束时(关闭浏览器)过期

Domain, 可选,浏览器只向指定的域中的服务器主机发送cookie,这样服务器就将cookie限制在了特定的域中。如果没有指定,就默认为产生Set-Cookie响应的服务器主机名

Path ,可选,可以为服务器上特定的文档分配Cookie,如果Path属性是一个URL 路径前缀,就可以附加一个cookie.如果没有指定路径,就将其设置为产生

Set-Cookie响应的URL路径。

Secure ,可以,如果包含了这一属性,就只有在http使用SSL安全连接时,才会发送cookie

Cookie首部:

客户端发送请求,会将所有与域、路径和安全过滤器相匹配的未过期Cookie都发送给这个站点,所有的Cookie都被组合到Cookie请求首部字段值中。

 

Cookie version 1

这个版本1标准引入了Set-cookie2首部和cookie2首部,但他也能与版本0 进行互操作(详细参考RFC2965)

 

cookie与会话跟踪:

可以用cookie在用户与某个web站点进行多项事务处理时对用户进行跟踪。

 

-------------------------------------

HTTP基本认证机制 (Basic Authentication

HTTP 提供了一个原生的质询/响应(challenge / response)框架

HTTP定义两个官方认证协议:基本认证和摘要认证

基本认证的安全缺陷:

密码是以明文进行传输的

即使密码以难以解密的方式加密,仍然可以以重放的方式取得授权

将基本认证与加密数据传输(例如SSL)配合使用,会使基本认证更安全

 

摘要认证:

用摘要保护密码,客户端不会发送密码,而是会发送一个“指纹”或密码的“摘要”,这是密码的不可逆扰码。客户端和服务器都知道这个密码,因此服务器可以验证所提供的摘要是否与密码相匹配。

用随机数防止重放攻击

随机数是在WWW-Authentication质询中从服务器传给客户端的

摘要认证的核心是对公共信息、保密信息、和有时限的随机数值这个组合的单向摘要

------------------------------

安全HTTP

数字加密

密码:

密码学是对报文进行编/解码的机制与技巧。

密码学基于一种名为密码的秘密代码。

密码是一种编码方案,一种有特殊的报文编码方式和一种稍后使用的相应解码方式的结合体。

加密之前的原始报文称为明文。

使用了密码之后的编码报文成文密文。

密码参数称为密钥

数字密钥只是一些数字,是编/解码算法的输入。编码算法就是一些函数,这些函数会读取一块数据,并根据算法和密钥值对其进行编/解码

对称密钥加密技术 symmetric-key :在编码时使用的密钥值和解码时一样。

流行的对称密钥加密算法包括:DES、Triple-DES、RC2和RC4

好的加密算法会迫使攻击者试遍每一个可能的密钥,才能破解代码。

暴力尝试所有的密钥值称为枚举攻击。

可用密钥值的数量取决于密钥中的位数,以及可能的密钥中有多少是有效的。

长密钥对密码安全有着非常重要的影响。

对称密钥加密技术的缺点之一就是发送者和接收者在互相对话之前,一定要有一个共享的保密密钥。

公开密钥加密技术:没有为每对主机使用单独的加密/解密密钥。而是使用了两个非对称密钥:一个用来对主机报文编码,另一个用来解码,编码密钥是众所周知的,但是只有主机才知道私有的解密密钥

数字签名:

除了加/解密报文之外,还可以用加密系统对报文进行签名(sign),以说明是谁编写的报文,同时证明报文未被篡改过,这种技术称为数字签名。

数字签名是附加在报文上的特殊加密校验码

使用数字签名的好处:

签名可以证明是作者编写了这条报文,只有作者才会有最机密的私有密钥。因此只有作者才会计算这些校验和。

签名可以防止报文被篡改,如果被修改,校验和就不再匹配了。

数字签名通常是用非对称公开密钥技术产生的,因为只有所有者才知道其私有密钥,所以可以将作者的私有密钥当作一种”指纹“使用。

数字证书:certs

 服务器证书中包含很多字段

web站点的名称和主机名

web站点的公开密钥

签名颁发机构的名称

来自签名颁发机构的签名

 

HTTPS:

https协议与一组强大的对称、非对称和基于证书的加密技术结合在一起

HTTPS就是在安全的传输层上发送的HTTP。

在将HTTP报文发送给TCP之前,先将其发送给一个安全层,对其进行加密。

HTTP安全层是通过SSL及其现代替代协议TLS来实现的,(通常用术语SSL来表示SSL或者TLS)

对Web服务器发起请求时,我们需要一种方式来告知web服务器去执行HTTP的安全协议版本,这是在URL的方案中实现的

如果URL的方案为https,客户端就会打开一条到服务器端口443(默认情况下)的连接,然后与服务器握手,以二进制格式与服务器交换一些SSL安全参数,附上加密的HTTP命令

在发送加密的HTTP报文之前,客户端和服务器要进行一次SSL握手,在这个握手过程中,要完成以下工作:

交换协议版本号

选择一个两端都了解的密码

对两端的省份进行认证

生成临时的会话密钥,以便加密信道

在通过网络传输任何已加密的HTTP数据之前,SSL已经发送了一组握手数据来建立通信连接了。

 

SSL握手思想(简化版本)

1.客户端发送可供选择的密码并请求证书

2.服务器发送选中的密码和证书

3.客户端发送保密信息,客户端和服务器生成密钥

4.客户端和服务器互相告知,开始加密过程。

服务器证书:

 SSL支持双向证书,将服务器证书承载回客户端,再将客户端的证书回送给服务器,而现在浏览时并不经常使用客户端证书。

而安全HTTPS事务总是要求使用服务器证书的。

服务器证书是一个显示了组织的名称、地址、服务器DNS域名以及其他信息的X.509 v3派生证书。

 站点证书的有效性验证:

日期检测

签名颁发者可信度检测

签名检测

站点身份检测

OpenSSL

 OpenSSL 是SSL和TLS最常见的开源实现,OpenSSL项目目标是开发一个强壮的、具有完备功能的商业级工具集,以实现SSL和TLS协议以及一个全功能的通用加密库。

===========================

实体、编码、国际化

实体首部:

Content-Length:实体的大小,报文中实体主体的字节大小,这个大小是包含了所有内容编码的,例如如果使用了gzip压缩,该首部就是压缩后的大小。

除非使用了分块编码,否则该首部是带有实体主体报文必须使用的。

使用Content-Length首部是为了能够检测出服务器崩溃而导致的报文截尾,并对共享持久连接的多个报文进行正确的分段

 检测截尾:

没有Conten-Length的话,客户端无法区分到底是报文结束时正常的连接关闭,还是报文传输过中由于服务器崩溃而导致的连接关闭,客户端需要通过Conten-Length来检测报文截尾.

Content-Length与持久连接:

Content-length对于持久连接是必不可少的,因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束,如果没有content-length,HTTP应用程序就无法知道某个实体主体在哪儿结束。

在采用分块编码(chunked encoding)时,使用持久连接可以没有Content-Length首部。

内容编码:

实体摘要:

服务器使用Content-MD5 首部发送对实体运行MD5算法的结果,生成一个数据的校验和,这样接收方可以通过检验这个校验和来捕获所有意外的实体修改了,只有产生响应的原始服务器可以计算并发送Content-MD5首部,中间缓存或代理不应该修改或添加这个首部,否则会验证端到端完整性这个目的相冲突。

Content-MD5首部是在对内容做了所有需要的内容编码之后,还没有做任何传输编码之前,计算出来的。

为了验证报文的完整性,客户端必须先进行传输编码的解码,然后计算所得到的未进行传输编码的实体主体的MD5

媒体类型和字符集:

Content-type 首部字段说明了实体主体的MIME类型。MIME类型是标准化的名字,用以说明实体基本媒体类型。客户端应用程序使用MIME类型来解释和处理其内容。

MIME类型是由一个主媒体类型后面跟一条斜线以及一个子类型组成,子类型用于进一步描述媒体类型

内容编码:

是和内容的具体格式细节紧密相关

Conten-encoding:

传输编码:

使用传输编码是为了改变报文中的数据在网络上的传输方式,同内容的格式无关

经过内容编码的报文,只是对报文的实体部分进行了编码,

而对于经过传输编码的报文来说,编码作用在整个报文上,报文自身的结构发生了 变化。

Transfer-encoding:

告知接收方为了可靠地传输报文,已经对其进行了何种编码

TE:

用在请求首部中,告知服务器可以使用哪些传输编码扩展。

 

有条件的请求:

仅当资源改变时才请求副本,有条件的请求时标准的HTTP请求报文,但仅当某个特定条件为真时才执行。

有条件请求是通过以“IF-”开头的有条件的首部来实现的。

 

范围请求:

Accept-Range:bytes

Range:

HTTP客户端可以通过请求曾获取失败的实体的一个范围 (或者说一部分),来恢复下载该实体。前提是从客户端上一次请求该实体到这次

发出范围请求的时间段内,该对象没有改变过。

Range首部在流行的点对点(Peer-to-Peer,P2P)文件共享客户端软件中得到广泛应用,它们从不同的对等实体同时下载多媒体文件的不同部分。

 

=================

国际化:

HTTP字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符,每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。

把二进制编码转换为字符要经过两个步骤:

1.文档中的二进制码被转换成字符代码,它表示了特定编码字符集中某个特定编号的字符。

2.字符代码用于从编码的字符集中选择特定的元素。

MIME中的charset标记综合描述了字符编码方案和编码后的字符集映射关系。

国际化字符系统的关键目标是把语义(字母)和表示(图形化的显示形式)隔离开来。HTTP只关心字符数据和相关语言及字符集标签的传输,字符形状的显示是由用户的图形显示软件(包括浏览器、操作系统、字体等)完成的。

字符集术语:

字符:是指字母、数字、标点、表意文字、符号,或其他文本形式的书写“原子”,由统一字符集(Universal Character Set,UCS,它的非正式名字是Unicode)首创,为多种语言的很多字符开发了一系列标准化的文本名称

字形:描述字符的笔画图案或唯一的图形化形状。

编码后的字符:分配给字符的唯一数字编号

代码空间:计划用于字符代码值的整数值范围

代码宽度:每个(固定大小的)字符代码所用的位数

字符库:特定的工作字符集(全体字符的一个子集)

编码后的字符集:组成字符库(从全球的字符中选出若干字符)的已编码字符集,并为每个字符分配代码空间中的一个代码。即它把数字化的字符代码映射为实际的字符。

字符编码方案:把数字化的字符代码编码成一系列二进制码(并能相应地反向解码)的算法。字符编码方案可用来减少识别字符所需要的数据总量(压缩),解决传输限制、统一重叠编码字符集.

字符编码方案规定如何让把字符的代码数字打包装入内容比特,以及在另一端如何将其解包回字符。

字符编码方案有以下3种类型:

固定宽度

可变宽度(无模态)

可变宽度(有模态)

常见的编码方案:

8位固定宽度恒等编码:只能支持有256个字符代码范围的字符集

UTF-8:是一种流行的为UCS设计的字符编码方案,UTF-8表示UCS变换格式,为字符代码值使用的是无模态的变宽编码,

第一字节的高位表示编码后的字符所用的字节数,所需的每个后续字节都含有六位的代码值。

语言标记与HTTP:

Content-Language: 描述实体的目标受众语言

========================

内容协商 与 转码:

客户端驱动的协商

服务端驱动的协商

透明协商(代理驱动)

 ===========================

内容发布与分发

web主机托管

 对内容资源的存储、协调以及管理的职责统称为web主机托管。主机托管web服务器的主要功能之一

 

=========================

重定向技术

HTTP重定向

DNS重定向:

DNS允许将几个IP地址关联到一个域中,可以配置DNS解析程序,或对其进行编程,以返回可变的IP地址。解析程序返回ip地址时所基于的原则可以很简单(轮转),亦可以很复杂(比如查看几台机器的负载,并返回负载最轻的服务器的IP地址)

DNS轮转:使用了DNS主机名解析中的一项特性,在web服务器集群中平衡负载。这是一种单纯的负载均衡策略,没有考虑任何与客户端和服务器的相对位置,或服务器当前的负载有关的因素。

DNS轮转通常都不会平衡单个客户端的负载(一个客户单通常会在很长一段时间内连接到一台服务器上),但在分散多个客户端的总负荷方面做得相当好。

其他基于DNS的重定向算法:

负载均衡算法

邻接路由算法:web服务器集群在地理上分散时,DNS服务器会尝试着将用户导向最近的web服务器。

故障屏蔽算法:

 

任播寻址:(实验技术)

IP MAC转发:

IP地址转发:

网元控制协议:NECP (Network Element Control Protocol)允许网元(NE,路由器和交换价等负责转发IP分组的设备)与服务器元素(SE,Web服务器和代理缓存等提供应用层请求的设备)进行交互。

------------------------

代理自动配置:PAC

PAC的基本思路是让浏览器去获取一个称为PAC的特殊文件,这个文件说明了每个URL所关联的代理。必须配置浏览器,为这个PAC文件关联一个特定的服务器。这样浏览器每次启动时都可以获取这个PAC文件了。

PAC文件是个JavaScript文件,其中必须定义函数:

function FindProxyForURL(url,host)

浏览器要为请求的每条URL调用这个函数

其返回值为一个字符串,用来说明浏览器应该到哪里请求这个URL,返回值可以是所关联的代理名称列表,或者是字符串“DIRECT“(这个字符串说明浏览器应该绕开所有的代理,直接连接原始服务器)

PAC存在的主要问题是必须要对浏览器进行配置,让它知道要从哪个服务器获取PAC文件,因此他就是一个全自动配置的系统。

-----------------------------------------

Web代理自动发现协议(WPAD)

其目标是在不要求终端用户手工配置代理设置,而且不依赖透明流量拦截的情况下,为web浏览器提供一种发现并使用附近代理的方式。由于可供选择的发现协议有很多,而且不同的浏览器的代理使用配置也存在差异,因此定义web代理自动发现协议时,普通的问题被复杂化。

 ==============================

日志记录

 

 

 

 

 

 

 

 

 

 

 

HTTP协议