http概述
《HTTP权威指南》读书笔记。
资源
MIME:
MIME type(Multipurpose Internet Mail Extension 多用途因特网邮件扩展)
http会给web传输对象打上数据格式标签,对应的就是response headers的content-type的内容。
浏览器会根据该类型调用不同的处理单元:显示图片,解析并格式化HTML文件,通过计算机声卡播放音频文件,或者运行外部插件软件来处理特殊格式化的数据。
MIME类型是一种文本标记:主要对象类型/子类型,如:text/html
URI:
每个web服务器资源都有名字,被称为统一资源标识符(Uniform Resource Identifier ,URI)
URI像因特网上的邮政地址,在世界范围内唯一标识并定位信息资源。
URI 有两种形式:URL , URN
URL:
统一资源定位符,由3部分组成:
- scheme(方案):说明访问资源所使用的协议类型。通常是:(http://)
- 服务器的因特网地址:域名或者公网ip(www.baidu.com)
- web服务器上的某个资源:文件路径(/specials/saw-blade.gif)
现在几乎所有的URI 都是URL
URN
统一资源名,URN作为特定内容的唯一名称使用,与目前资源所在地无关。
通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。
例如:
不论因特网标准文档RFC 2141位于何处,都可以用URN来命名它:
urn:ietf:rfc:2141
URN仍处于试验阶段,URN需要一个支撑架构来解析资源的位置,此类架构的缺乏延缓了其被采用的进度。
事务
HTTP事务
由一条请求命令和一个响应结果组成。
这种通讯是通过名为HTTP报文(HTTP message)的格式化数据块进行的
HTTP方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP method。
每个请求都包含一个方法,这个方法会告诉服务器要执行什么动作。
常见的http方法:
get,put,delete,post,head
状态码
一个三位的数字。
常见的状态码:200,302,404
伴随每个状态码,HTTP还会发送 原因短语,其主要是为了进行描述,处理过程用的是状态码。
下面这些返回结果,HTTP软件处理的方式是一样的,因为只识别状态码。
200 OK
200 Document attached
200 success
200 All‘s cool , dude
报文
由起始行,首部字段,主体,三部分组成。
连接
通过TCP
telnet程序可以将键盘连接到某个目标的TCP端口,可以连接所有TCP服务器,包括HTTP服务器。
web的结构组件
名词解析:
代理:客户端和服务器直接的HTTP中间实体
缓存:HTTP的仓库,使常用页面的副本可以保持在离客户端更近的地方。
网关:连接其他应用程序的特殊Web服务器
隧道:对HTTP通讯报文进行盲转发的特殊代理
Agent代理:发起自动HTTP请求的半智能WEB客户端。
-
代理
是web安全,应用集成,以及性能优化的重要组成模块。
接收客户端的HTTP请求,并转发给服务器,对于用户而言,这些应用程序就是一个代理,代表用户访问服务器。
出于安全考虑,通常会将代理作为转发所有web流量的可信任中间节点使用。可以将请求和响应进行过滤。
-
缓存
web cache 或者 proxy cache是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来,下一次请求同样的文档,客户端就可以直接去缓存里面找。无需经过因特网。
-
网关
是一种特殊的服务器,他作为其他服务器的中间实体,通常用于将HTTP流量转换成其他的协议,网关接收请求时,就好像自己是资源的源端服务器一样。
例如:一个HTTP/FTP网关,接收一个HTTP请求,解析后,生成一个FTP请求,找FTP服务器,得到内容后,构造一个HTTP相应,返回给HTTP请求者。
-
隧道
隧道是建立起来后,就会在两条连接之间,对原始数据进行盲转发的HTTP应用程序。HTTP/SSL隧道可以穿过只允许WEB流量的防火墙。
-
Agent代理
用户agent代理是代表用户发起http请求的客户端程序。所有发布WEB请求的应用程序都是HTTP agent 代理。网络蜘蛛,web机器人也是一种用户agent代理。
URL与资源
URL语法
通用URL语法:
方案://用户:密码@主机:端口/路径;参数?查询#片段
方案
以一个字母开始,由第一个“:”符号将其与URL的其余部分分隔开来,且与大小写无关。
主机与端口
通过ip或域名确定主机,默认使用80端口,端口组件标识了服务器正在监听的网络端口。
用户名和密码
FTP就需要添加用户名和密码才能登陆。
路径
很像一个分级的文件系统路径。每个路径段都有自己的参数组件
参数
为应用程序提供了访问资源所需的附加信息。例如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
参数名为type,值为d。
查询字符串
?后面的是查询组件,查询组件一般由key=value标识,用&进行分割。
片段
浏览器向服务器发送片段并没有用,这个片段不会传给服务器,服务器之会把整个文档返回,但是在浏览器中,会从片段处开始显示。
片段是给浏览器看的,服务器不会理片段的内容。
URL快捷方式
相对URL
与相对路径很像。
自动拓展URL
主机名扩展
输入yahoo ,自动补全www. 和.com这些字符。
历史扩展
浏览器存起你历史访问过的网页,给你拓展提示,chrome浏览器就有这种功能。
各种令人头疼的字符集
URL中用到的字符是以英语为中心的,大多数都用的US-ASCII字符集。而全球各个地方用的字符集是不一样的。所以需要进行编码和解码工作。
编码规则
%+2个16进制数。这样在传输过程中,就避免了字符乱码的问题。
字符受限
有一些保留的和受限的字符。
这部分大部分开发者都不必担心,有成熟的api可以调用,处理URL
HTTP报文
报文流
HTTP报文是HTTP应用程序之间发送的数据块。这些数据块以文本形式的元信息(meta-information)开头,这些信息描述了报文的内容和含义。
报文的组成部分
HTTP报文由三部分组成:
起始行:start line
首部:header
主体:body
报文语法
HTTP报文分两类:请求报文,响应报文。
请求报文格式:
响应报文格式:
起始行
请求报文的起始行说明要做什么
响应报文的起始行说明发生了什么
-
方法
get,head ; put,post ; trace(用于诊断); option ; delete
-
状态码
1xx : 信息性状态码
2xx : 成功状态码
3xx : 重定向状态码
4xx : 客户端错误状态码
5xx : 服务器错误状态码
首部
首部与方法配合工作,共同决定了客户端和服务器能做什么事情。
可以认为是修饰报文,提供一系列额外的信息。
首部主要分5类:
-
通用
服务器,客户端都可以用的,如Date
-
请求
请求报文特有,例如告诉服务器,我能接收什么类型的数据,Accept:*/*
-
响应
响应报文特有,例如告诉客户端,当前是跟谁在通讯:Server:goahead/2.1.8
-
实体
对应实体主体部分的首部。Content-Type: text/html
-
拓展
开发者自己定义。
连接管理
HTTP建立在TCP之上。
TCP相关名词:
-
Nagle算法 , TCP_NODELAY
nagle这个人,鼓励将大量的TCP数据绑定一起一起发,这样可以提供网络效率。
但是这会导致小的HTTP报文永远发不出去,所以可以设置TCP_NODELAY去避免这件事。
-
TIME_WAIT累积与端口耗尽
tcp端点关闭tcp连接时,会在内存中维护一个小的控制块,通常是所估计的最大分段使用期的两倍(2MSL,通常为2分钟)。
这里讲到的就类似于TCP攻击了,
HTTP连接处理
connection首部,用于相邻的HTTP应用程序提供一些特殊的交流模式。
connection首部标签中列出的所以首部,在转发给别人的时候,需要删除这些首部。所以connection首部也被称为“对首部的保护”。
串行事务处理时延
每次请求都建立一次TCP连接,等上一个连接完成,再去执行下一个连接,这样的总体时延就很长。为了解决这个问题,有以下方法:
-
并行连接
多条TCP连接发起并发HTTP请求。
-
持久连接
重用TCP连接,消除连接及关闭时延
-
管道化连接
共享TCP连接发起并发的HTTP请求。
-
复用的连接
交替传送请求和响应报文。(实验阶段)
并行连接
在客户带宽比较宽裕时,并行连接确实会提升web资源的加载速度,但是如果用户带宽不足,提升就很小。而且且打开连接会消耗内存资源,这会导致服务器产生很高的负荷,导致性能严重下降。
持久连接
HTTP/1.1(以及HTTP/1.0的增强版本)允许HTTP设备在事务处理结束之后,将TCP连接保持在打开状态,以便未来的HTTP请求重用现存的连接。
在事务结束之后仍然保持在打开状态的TCP连接,被称为持久连接。
重用已对目标服务器打开的空闲持久连接,就可以避开缓慢的连接建立阶段,而且已经打开的连接还可以避免慢启动 的拥塞适应阶段,以便更快速的进行数据传输。
持久以及并行连接
现代的web应用程序都会打开少量的并行连接且每个连接都是持久连接。
持久连接有两种类型:
http/1.0+的“keep-alive”
http/1.1的"persistent"
http/1.0+的“keep-alive”连接
如果服务器愿意为下一条请求将连接保持在打开状态,就在响应中包含相同的首部。如果响应中,没有Connection:Keep-Alive首部,客户端就认为服务器不支持keep-alive,会在发回响应报文后关闭连接。
“keep-alive”无法与不支持connection首部的代理进行互操作。
网景公司提出了一个拓展首部,proxy-connection来一定程度避免哑代理盲目转发Connection:Keep-Alive的问题,但对于一些情况,还是无法避免。
HTTP/1.1的持久连接
默认持久连接,除非对方发connection:close。
对于HTTP/1.1中的限制和规则,用到时再研究。
管道化连接
在持久连接上,可选的使用请求管道:
当第一条请求通过网络流向服务器时,第二第三条请求也可以开始发送了,在高延时网络条件下,这样做可以降低网络的环回时间,提高性能。有点类似于并行处理。
关闭连接的奥秘
content-length可以用来校验发过来的http报文长度是否正确。
正常关闭连接
完全关闭:close()
半关闭:shutdown()
这部分用到再回来看。
WEB服务器
web服务器主要执行以下任务:
- 建立连接(TCP/IP)
- 接收请求
- 处理请求
- 访问资源
- 构建响应
- 发送响应
- 记录事务处理过程
接受客户端连接
从TCP中,解析出IP,判断连接是哪个客户端。
一旦建立连接并被接受,服务器就会将新连接添加到其现存Web服务器连接列表中,做好监视连接上数据传输的准备。
Web服务器可以随意拒绝或立即关闭任意一条连接,例如:黑白名单。
反向DNS:在服务器中,对客户端IP地址转换成客户端主机名。
通过ident确定客户端用户,这种办法一般用在组织内部,在互联网上不能很好的工作。
接收请求报文
解析过程:
-
解析请求行
请求方法,请求URI,请求版本号,由空格分开,并由CRLF结束
-
读取报文首部
读取以CRLF结尾的报文首部。
识别CRLF结尾的首部结束空行。
-
读取请求主体
根据Content-Length首部指定,读出请求主体。
web服务器不定期的从网络上接收输入数据。网络连接可能随时都会出现延迟,Web服务器需要从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以解析的数据并理解其意义为止。
报文的内部表示法
就是对报文用内部的数据结构来存储,以达到内部可快速访问的目的。
不同的web服务器结构会以不同的方式为请求服务:
-
单线程Web服务器
一个事务结束之后才会去处理下一条连接
-
多进程及多线程Web服务器
预先创建一些线程/进程,有些服务器会为每条连接分配一个线程/进程,多线程/进程服务器都会对线程/进程的最大数量进行限制。
-
复用I/O的服务器
为支持大量的连接,需要使用I/O复用技术,设计的原则是只有在有事情可做时才会对连接进行处理。在空闲连接上等待的时候,并不会绑定线程和进程。
-
复用的多线程Web服务器
创建多个进程,使用I/O复用技术,去构造性能更强大的web服务器。
处理请求
Web服务器收到请求后,就可以根据方法,资源,首部,可选的主体部分来对请求进行处理。本书大部分内容都在讲怎么处理,此处不展开讨论。
对资源的映射及访问
将请求报文中URI映射为web服务器上适当的内容或内容生成器,以识别出内容的源头。
docroot
文档的根目录 docroot,最简单的映射就是把请求的URI作为名字,访问web服务器文件系统中的文件。
值得注意的是,不能让相对URL退到docroot之外。
-
虚拟托管的docroot
会在同一台web服务器上提供多个web站点。每个站点都有独立的文档根目录,虚拟托管的web服务器会根据URL或者host的首部的IP地址或主机名来失败要使用的正确文档根目录。
通过这种方式,尽管URI完全相同,托管在同一web服务器上的两个站点也可以拥有完全不同的内容。
-
用户的主目录docroot
/~name,这种形式的URI映射为此用户的私有文档根目录。
目录列表
Web服务器可以接收对目录URL的请求,其路径可以解析为一个目录,而不是文件。
可以让URL请求被解析处理,采取不同的动作:
- 返回错误
- 返回“index文件”
- 扫描目录,返回一个包含目录内容的HTML页面。(apache默认就会返回一个html目录)
动态内容资源的映射
cgi-bin就是存放这种动态内容资源,现代java servlet的前身就是cgi
服务器端包含项
web服务器还可以提供服务器端包含项(SSI)支持。如果某个资源被标识为存在服务器端包含项,服务器就会在发给客户端之前对资源内容进行处理。
类似于nodejs 中的模板引擎,goahead中的函数嵌入到asp文件。
访问控制
认证相关,12章重点描述。
可以根据ip进行访问控制,也可以根据账号密码进行控制。
构建响应
识别资源后,执行请求方法中的动作,返回响应报文。
应包含:状态码,首部,响应主体
响应实体
如果事务处理产生了响应主体,就将内容放在响应报文中回送过去,如果有响应主体的话,响应报文中通常包括
- 描述响应主体的MIME类型content-type
- 描述响应主体的长度content-length
- 实际报文的主体内容
MIME类型
Web服务器要负责确定响应主体的MIME类型。
web服务器可以用文件的拓展名来说明MIME类型。web服务器会为每个资源扫描一个包含了所有拓展名的MIME类型的文件,以确定其MIME类型。
简单来说就是以文件后缀名为索引,去查MIME类型表。
开发者可以按任意模式去建立文件与MIME类型的关系。
重定向
服务器有时候返回重定向响应而不是成功报文。重定向地址卸载location首部。
有什么作用呢?
-
永久删除资源
返回301,可以修改书签等
-
临时删除的资源
返回303,307,不要对书签进行更新
-
URL增强
返回303,307,重写url,根据原来的URL去生成一个新的带状态信息的URL。
-
负载均衡
返回303,307。服务器超载时可以重定向。
-
服务器关联
返回303,307 。服务器可以将客户端重定向到包含该客户端信息的服务器上去。
-
规范目录名称
有时候URI不带“/"符号,可以重定向到加上该符号的URI上。
发送响应
web服务器通过连接发送数据时,也会面临与接收数据一样的问题。服务器有很多条到各个客户端的连接
- 有些是空闲的
- 有些向服务器发送数据
- 有些向客户端发送数据
服务器记录连接的状态。特别注意持久连接的处理。
-
非持久连接
发送完响应后,服务器端关闭连接
-
持久连接
需要正确计算content-length首部,否则客户端无法知道响应什么时候结束。
记录日志
当事务结束时,web服务器会在日志文件中添加一个条目。来描述已执行的事务。详情查看21章
代理
web代理服务器是网络中的中间实体。
web的中间实体
有了web代理,客户端处理事务就会通过代理提供的优质服务来实现。
私有和共享代理
代理服务器可以是某个客户端专用的,也可以是很多客户端共享的。由此分为私有代理,公共代理。
-
公共代理
大多数代理都是公共代理。集中式代理的性价比更高,更容易管理。如高速缓存代理服务器,会利用用户间共同的请求,这样的话,汇入同一个代理服务器的用户越多,它就越有用。
-
私有代理
中庸的私有代理并不常见。例如:浏览器的辅助产品,在客户端直接运行的代理,有拓展浏览器特性,提高性能,或者为互联网服务器提供商提供广告。
代理与网关的对比
代理连接的是使用相同协议的应用程序。而网关连接的是两个或多个使用不同协议的端点。
网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器直接的事务处理。
代理和网关的区别比较模糊:
- 浏览器与服务器用的HTTP版本不同,代理就要进行协议转换工作
- 商业化的代理服务器也会实现网关的功能来支持SSL安全协议,SOCKS防火墙,FTP访问
代理的应用
- 儿童过滤器
- 文档访问控制
- 防火墙
- web缓存
- 反向代理(服务器加速器)
- 内容路由器
- 转码器
- 匿名者
代理会在哪里
代理服务器的部署
根据用途分
-
出口代理
作用,防火墙保护,降低带宽费用,提高因特网流量的性能。
-
访问(入口)代理
ISP ,internet server provider ,互联网服务器提供商。
访问代理主要是使用缓存代理,存储常用文档的副本,以提高用户的下载速度,降低因特网带宽耗费。
-
反向代理
部署在网络边缘,在web服务器之前,作为代替物使用,在那里他们可以处理所有传送给web服务器的请求,并且只在必要时服务器请求资源。
可以提高web服务器的安全特性,可以提高性能。
-
网络交换代理
把代理放在因特网对等交换点上,通过缓存减轻因特网节点的拥塞,并对流量进行监控。
代理的层次结构
代理可以级联起来,这样通过转发就可以实现。
靠近服务器的是父代理,靠近客户端的是子代理。
访问代理可以根据不同的情况,将报文转发给不同的代理,也就是动态选择代理。
例子:
-
负载均衡
根据当前父代理上的工作负载级别来决定如何选择父代理,以实现负载均衡。
-
地理位置附近的路由
根据地理位置找
-
协议/类型路由
特别的请求,找特别的代理。
-
基于订购的路由
给钱的,给更好性能的代理。
代理如何获取流量
流量怎么才能首先流向代理?
-
修改客户端
修改后,将http请求有意的发送给代理,而不是原始服务器、
-
修改网络
网络基础设施可以拦截网络流量将其导入代理。
-
修改DNS的命名空间
web服务器之前的代理服务器——代替物,会假扮web服务器的名字和IP地址。
-
修改web服务器
发送重定向命令。
客户端代理设置
-
手工配置
为代理指定主机和端口
-
PAC文件
指定PAC文件,PAC文件是一些小型的js程序,可以在运行过程中计算代理设置,访问每个文档时,js都会选择恰当的代理服务器。
-
WPAD
自动为浏览器找到合适的PAC文件。
代理与请求的一些棘手问题
-
代理URI与服务器的URI的不同
客户端直接向服务器发送请求时,URI中没有方案,主机或端口。
如果向代理发送时,则需要有完整的URI
-
与虚拟主机一样的问题
虚拟主机web服务器在没有“方案/主机/端口”信息时,无法找到物理主机。
可以使用host首部来承载主机和端口信息。
-
代理既可以处理代理请求,也可以处理服务器请求。
有一套规则,可以使得代理服务器处理各式各样的请求报文,当然也包括这种不带host的报文。值得注意的是,现代浏览器发起请求时,都会添加host首部。
-
转发过程中对URI的修改
代理服务器应该宽容一些,让决策权更多的交给服务器,代理你要拦截就拦截,不要做额外的事情。
-
URI客户端的自动拓展和主机名解析
如果你输入yahoo,那么自动拓展会帮你补全www.和.com。DNS配置允许用户只输入主机名的前缀。
-
没有代理时URI的解析
输入yahoo,去DNS服务器找,找不到,返回客户端,客户端自动拓展,去访问,成功返回IP
-
有显示代理的URI解析
不执行自动拓展,直接写死
-
有拦截代理时的URI解析
提供容错机制,对已停用的IP,要主动去DNS中找其他IP
追踪报文
via首部列出报文途径的每个中间节点有关的信息,每经过一个节点,就把这个中间节点添加到via列表的末尾。
每个via路标中,最多包含四个组件:
- 可选协议名(默认http)
- 协议版本
- 节点名
- 可选节点注释
注意:server首部用于原始服务器。
trace方法
当trace请求到达目的的服务器时,整条请求报文都会被封装在一条HTTP响应的主体中,送回给发送端。
max-forwards可以设置最大转发次数,到达最大转发次数之后,接收者即使不是原始服务器,也必须返回给客户端。
代理认证
proxy-authorization首部字段认证。可以检查这个字段,来判断是否让客户端进行访问。
代理的互操作性
客户端,服务器,代理有可能都是不同厂商制作的,实现的是不同版本的HTTP规范。这就涉及到一个兼容性问题。
-
处理代理不支持的首部的方法
对于代理不支持的首部,一律采用转发的方式处理。
-
OPTIONS:发现对可选特性的支持。
OPTIONS * HTTP/1.1 发给服务器,服务器会告诉客户端,自己能做什么,返回Allow头部。
缓存
web缓存是可以自动保存常见文档副本的HTTP设备。当web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。
-
冗余的数据传输
有了缓存,就可以减少冗余的数据传输。
-
带宽瓶颈
缓存可以缓解网络的瓶颈问题。
-
瞬间拥塞
缓存在破坏瞬间拥塞时,显得非常重要。
-
距离时延
每台网络路由器都会增加因特网流量的时延,转发线路太长,光速也会导致延时。
-
命中和未命中的
缓存无法保存世界上每份文档的副本。
如果用已有副本为到达缓存的请求提供服务,这被称为缓存命中。
如果请求没有缓存可用,而被转发,这被称为缓存未命中。
-
再验证
原始服务器的内容可能会发生变化,缓存要不时对其进行检测,这些“新鲜度检测”被称为HTTP再验证。HTTP定义了一些特殊请求,不用从服务器上获取整个对象,就可以快速检测出内容是否是最新的。
网络带宽珍贵,大部分缓存只有在客户端发起请求,且副本旧得足以需要检测时,才会对副本进行再验证。
再验证命中(缓慢命中):再验证请求被返回not modified
对缓存对象的再验证的工具:IF-Modified-Since首部。
-
命中率
缓存提供服务的请求所占的比例称为:缓存命中率(有时也叫文档命中率)
对于中等规模的web缓存来说,40%的命中率是很合理的。
-
字节命中率
由于文件大小不同,我们要尽量让大文件多命中更多一些。这样可以节省流量费用。
-
区分命中与未命中的情况
通过DATE首部,如果响应中的DATE首部的值与当前时间相比,响应中的时间较早,通常就可以认为命中了。也可以用age首部,通过这个首部可以分辨出这条响应的使用期。
-
-
缓存的拓扑结构。
-
私有缓存:专用缓存。
个人的缓存,包含单个用户最常见的页面
-
公有缓存:共享缓存。
包含某个用户团体的常用页面。
代理缓存,可以有效减少冗余流量。
-
代理缓存的层次结构
层次化缓存,在离客户近的地方部署一级缓存,这种缓存小型廉价,而在更高层次中,逐步采用更大,功能更强的缓存来装载多用户共享文档。
-
网状缓存,内容路由,对等缓存
-
网状缓存中,代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通讯决策。
-
内容路由器:会决定选择何种路由对内容进行访问、管理、传送的代理缓存。
-
对等实体:将缓存连接起来实现共赢的不同组织之间的关系。
-
兄弟缓存:提供可选的对等支持的缓存
HTTP扩展协议:因特网缓存协议 internet cache protocol,ICP ,超文本缓存协议hypertext caching protocol,HTCP,使http协议得以扩展,使其支持兄弟缓存。
-
-
-
缓存处理步骤
-
接收
读取输入的数据。
-
解析
将报文解析为片段,放入到易于操作的数据结构之中,等待缓存软件处理。
-
查询
获取URL,查找本地副本:可能在内存,磁盘,甚至附近的另一台计算机中。
-
新鲜度检查
-
创建响应
缓存会修改一下响应头的信息
-
发送
-
日志
大部分缓存都会保存日志文件,以及与缓存的使用有关的一些统计数据。
-
-
保持副本的新鲜
HTTP将保持副本新鲜度的机制称之为文档过期和服务器再验证
-
文档过期
通过特殊的HTTP cache-control首部和expires首部,HTTP让原始服务器向每个文档附加一个“过期日期”
客户端也可以明确提出阻止提供已缓存或未验证资源的首部。
如果客户端明确提出不要缓存的东西,要服务器的东西,就不会在缓存中读取。
-
服务器再验证
对于过期的文档,执行再验证,如果服务器上的文件没有发生变化,那么就只用更新首部即可。这是一种节省流量的方式。
再验证中有较多的学问,我们可以自由设计再验证的方式,我们可以认为某些情况是不需要重传的,有些情况是要重新缓存的,这个逻辑可以通过http头来进行设置。
-
-
控制缓存能力
-
no-store
不能缓存,缓存了要删除掉。
-
no-cache
一定要执行再认证之后才能发回来。
-
must-revalidate
在没有跟原始服务器进行再验证的请情况下,不能提供这个对象的陈旧副本。
-
max-age
表示过期秒数,设置为0,可以在每次请求时,都进行刷新。
-
Expries
实际过期日期,而不是秒数,很多服务器时钟是不同步的,这阳可能不太好。一般不用。
-
-
设置缓存控制
可以放在首部,也可以放在html中的http-equiv标签,进而与服务器通讯,来控制缓存。
-
详细算法
非专业处理缓存的,无需了解,知道有这么回事即可,用到再回来看。
-
缓存和广告
主要是讲述缓存和广告的矛盾问题,缓存命中率高,那么广告运营商就不知道这个广告被访问了多少次,这样的话,就无法计费。
可以在缓存中记录命中次数,然后发给原始服务器,这样的话,就可以即利用了缓存提高性能, 又保证了这个链接被点击多少次得到记录。
集成点:网关、隧道及中继
web是一种强大的内容发布工具,开发者可以在主体部分捎回其他协议的内容。
网关
就是一个中转,可以制定一系列的规则将响应主体内容放在正文里面,发送给客户端。
他可以对接服务器上的应用程序,可以对接服务器中的web服务,可以对接数据库,FTP服务。
网关的记录方式:
<客户端协议>/<服务器协议>
例如:*/HTTP 的客户端网关,就是说该网关与服务器之间用HTTP协议,与客户端使用任意协议。
协议网关
可以在浏览器手动配置网关。下面主要介绍服务协议转换器,服务器端安全网关,客户端安全网关,应用程序服务器。
-
HTTP/* 服务器端WEB网关
进行协议转换,解析客户端发过来的信息,构造一帧完全的报文,转发给响应的服务器程序。
-
HTTP/HTTPS : 服务器端安全网关
客户端用HTTP浏览web内容,网关会自动加密用户的对话。
-
HTTPS/HTTP:客户端安全加速器网关
需要确保解密后,网关与服务器之间的网络是安全的。
资源网关
最常见的网关是应用程序服务器,客户端通过HTTP连接到应用程序服务器,将请求通过网关API发送给运行在服务器上的应用程序。
第一个流行的应用程序网关API就是CGI,也就是通用网关接口。
-
CGI
会拖慢服务器性能,因此有人发明了,快速CGI——模拟了CGI,通过减少了每个请求建立或拆除新进程所带来的性能损耗。
-
服务器拓展API
CGI还不够,还需要一些对服务器自身定制的拓展API,可以提升性能。
应用程序接口和web服务
http可以作为一种连接应用程序的基础软件使用。应用程序之间的配合,比HTTP首部所能表达的信息要复杂得多,因此可以用xml文件进行传输,现在的话,比较流行用json。
隧道
web隧道可以通过HTTP应用程序访问非HTTP协议的应用程序。web隧道通过connect方法建立。connect是一种得到广泛应用的拓展方法。
connect方法请求隧道网关创建一条到达任意目的服务器和端口的TCP连接,并对客户端和服务器直接的后继数据进行盲转发。
SSL隧道
最初开发web隧道是为了通过防火墙来传输加密的SSL流量。通过建立隧道,使得原本无法通过防火墙的ssl报文通过了防火墙。
中继
中继是没有完全遵循HTTP规范的简单HTTP代理,中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。
盲中继容易实现,可以提供简单的过滤,诊断,内容转换等功能。
盲中继无法处理connection首部。
web机器人(爬虫)
爬虫是自活跃的用户代理。
爬虫及爬行方式
爬虫会递归的对各种信息性网站进行遍历,然后获取那个页面指向的所有页面,不断的深度搜索。爬虫会把它们碰到的文档全部拉回来,然后对这些文档进行处理,形成一个可搜索的数据库。
根集
用流行的WEB站点作为根集。
避免环路
搜索树,散列表去记录并判断URL是否被记录。
本章后面主要讲述如何做一个搜索引擎友好的网站,以及搜索与被搜索者之间的博弈关系。需要相关知识时,再回来看。
HTTP-NG
主要讲述HTTP面临的挑战,以及一些未来发展趋势。
HTTP发展中存在的四大问题:
-
复杂性
HTTP相当的复杂,
-
可扩展性
很多流传下来的HTTP应用中,都没有自主的功能性扩展技术,使协议扩展无法兼容
-
性能
HTTP中有部分效率不高,随着高延时,低吞吐量的无线访问技术的广泛使用,会变得更加严重。
-
传输依赖性
HTTP紧密围绕着TCP/IP网络协议栈设计,需要为替代协议栈提供更多的支持,才能作为一个更广阔的报文发送平台应用与嵌入式和无线应用程序之中。
HTTP-NG针对上诉问题,提出了一套解决方案,但是目前还没有被采用,需要这部分知识时再回来看。
客户端识别与cookie机制
本章讨论服务器用来识别其交谈对象的技巧
这部分内容与之前做的认证方式分析重合。
包括:基本认证,摘要认证,cookie机制,安全HTTP
实体与编码
实体=实体首部+实体主体
HTTP实体首部:
- content-type
- content-length
- content-language
- content-enconding
- content-location
- content-range
- content-md5
- last-modified
- expires
- allow
- etag
- cache-control
这个章节涉及一些信息论方面的知识,讲述如何传输效率高之类的问题。
国际化
网站国际化的主要问题:
字符集编码,语言标记
content-type:charset=
content-language:
修改浏览器语言时,会发accept-language头给后台。
内容发布与分发
讲述了现代web托管环境中部署服务器的方法
讨论了相互协作作业的方法
探讨重定向与负载均衡的技术,如何处理流量分发
解释日志的各种格式和各种常见问题