标注:看《HTTP权威指南》所记的笔记,用于防止自己看过又忘记
URI(统一资源标识符)
- URL(统一资源定位符)
- 通过描述资源的位置来标识资源
- 描述了一台特定服务器上某资源的特定位置
- 格式
- 方案(协议类型)
- 客户端怎样访问资源
- 服务器的位置
- 资源位于何处
- 资源路径
- 服务器上哪个特定的本地资源
- 方案(协议类型)
- 通用格式
- frag: HTPP服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器,浏览器从服务器获得了整个资源之后,会根据片段显示部分资源。
- 绝对URL
- 相对URL
- 资源可移植性
- 基础URL
- URN(统一资源名)
- 通过名字来识别资源
- 作为特定内容的唯一名称使用,与目前资源所在地无关
- 试验阶段
HTTP报文
- 起始行
- 首部字段
- 主体
方法
- HEAD
- 与GET类似,但在响应中只返回首部
- 意义
- 在不获取资源的情况下了解资源的情况
- 通过响应中的状态码查看某个对象是否存在
- 通过查看首部测试资源是否被修改了
- PUT
- 让服务器用请求的主体部分创建一个由所请求的URL命名的新文档
TCP相关时延
- TCP连接建立握手
- TCP慢启动拥塞控制
- 数据聚集的Nagle算法
- 用于捎带确认的TCP延迟确认算法
- TIME_WAIT时延和端口耗尽
Connection首部允许发送端指定与连接有关的选项
- HTTP应用程序收到一条带有Connection首部的报文时,接收端会解析发送端请求的所有选项,并将其应用,然后会在将此报文转发给下一跳地址之前,删除Connection首部及Connection首部中列出的所有首部,还可能会有少量没有作为Connection首部值列出,但一定不能被代理转发的逐跳首部。包括proxy-Authenticate
提高HTTP连接性能
- 并行连接
- 持久连接
- 管道化连接
- 复用连接
Web服务器做些什么
- 建立连接
- 接受请求
- 处理请求
- 访问资源
- 构建响应
- 发送响应
- 记录日志
代理
- 即是服务器又是客户端
- 私有代理
- 公共代理
- 与网关对比
- 代理连接的是两个或多个使用相同协议的应用程序
- 网关连接的是两个或多个使用不同协议的端点(协议转换器)
- 为什么使用代理
- 儿童过滤器
- 集中式文档访问控制
- 安全防火墙
- Web缓存
- 反向代理
- 内容路由器
- 转码器
- 匿名者
- 代理部署
- 出口代理
- 访问(入口)代理
- 反向代理
- 网络交换代理
- 代理如何获取流量
- 修改客户端
- 修改网络
- 修改DNS命名空间
- 修改web服务器
缓存
- 提高性能并减少流量
- 缓存处理步骤
- 接收-解析-查找-新鲜度检测-创建响应-发送-日志
- 缓存过期
- Cache-Control, Expires, If-Modified-Since,If-None-Match
- 何时使用实体标签和最近修改日期
- 服务器响应了一个实体标签(Etags),客户端就必须使用实体标签验证,如果服务器响应了Last-Modified值,客户端就可以使用If-Modified-Since。如果实体标签和最后修改日期都提供了,客户端就应该使用这两种方式验证。(服务器必须两个条件都满足才能响应304)
- 控制缓存
- (响应首部)Cache-Control:no-store
- 禁止缓存
- Cache-Control:no-cache
- 可以本地缓存,但是在与服务器进行新鲜度再验证之前,不能提供给客户端
- Cache-Control:max-age
- 处于新鲜状态的秒数
- s-maxage仅适用于共享缓存
- Cache-Control:must-revalidate
- 没有跟服务器进行新鲜度再验证之前,不能提供给客户端旧版本,可以提供新鲜版本
- (响应首部)Expires
- 实际的过期日期而不是秒数,不推荐使用(很多服务器时钟不同步)
- 试探性过期
- 如果响应中没有Cache-Control:max-age和Expires首部,缓存可以计算出一个试探性最大使用期
- LM-Factor算法(文档中包含最后修改日期就可以用这个算法)
- 计算缓存与服务器对话时间跟服务器声明的文档最后修改时间的差值,取这个间隔的一部分
- LM-Factor算法(文档中包含最后修改日期就可以用这个算法)
- 默认新鲜周期
- 如果响应中没有Cache-Control:max-age和Expires首部,缓存可以计算出一个试探性最大使用期
- (响应首部)Cache-Control:no-store
- 判断文档是否足够新鲜
- 需计算使用期
- 新鲜生存期
网关
- 网关
- 客户端网关(*/http)
- 服务器网关(http/*)
- 常见类型
- 服务器协议转换器(http/*)
- 服务器端安全网关(http/https)
- 客户端安全网关(https/http)
- 应用程序服务器
- 是服务器端网关
- 将目标服务器与网关结合在一个服务器中实现
- CGI
- 隧道
- web隧道允许用户通过HTTP连接发送非HTTP流量,就可以在HTTP上捎带其他协议数据了
- 最常见的原因: 要在HTTP连接中嵌入非HTTP流量,这类流量就可以穿过只允许Web流量通过的防火墙(通过防火墙来传输加密的SSL流量)
- web隧道使用HTTP的CONNECT方法建立起来的
- 为了降低隧道的滥用,网关应该只为特定的知名端口(443)打开隧道
- 中继
- 没有遵循HTTP规范的简单HTTP代理,负责处理HTTP中建立连接的部分,然后对字节盲转发。
机器人
Web机器人
- 在无需人类干预的情况下自动进行一系列Web事务处理的软件程序
- 爬虫
- 递归的追踪web链接的机器人会沿着HTML超链接创建的网络爬行
- 根集
- 爬虫开始访问的URL初始集合,随时间推移而增长
- 好的根基包括一些大的流行Web站点,一个新创建页面的列表,一个不经常备链接的无名页面列表
- 机器人必须知道它们到过何处,避免环路
- 环路的危害
- 会使爬虫陷入可能会将其困住的循环之中,时间都耗费在获取相同的页面了,并且消耗掉很多网络带宽,可能无法获取其他页面了。
- 爬虫不断获取相同的页面时,对另一端的Web服务器也造成打击(可能击垮Web站点,阻止真实用户的访问)
- 大量重复的页面充斥着爬虫应用程序,这样的应用程序变得毫无用处(比如返回数百份完全相同页面的因特网搜索引擎)
- 爬虫对访问过的地址管理技术
- 树和散列表
- 大量的URL需要具备快速的搜索结构
- 有损的存在位图
- 大量的URL占用空间大
- 检查点
- 已访问的URL列表保存到硬盘防止机器人程序崩溃
- 分类
- 机器人集群,每个机器人分配特定的URL
- 树和散列表
- 环路的危害
- URL别名
- 看起来不一样实际上指向的同一资源
- 避免循环和重复
- 规范化URL(大多数机器人都试图规范化URL为标准格式来消除别名)
- 广度优先的爬行
- 即使碰到了陷阱也可以在回到环路中获取的下一个页面之前从其他站点获取页面,避免深度优先访问一个站点再也无法访问其他站点
- 节流
- 限制一段时间内机器人可以从一个Web站点获取的页面数量
- 限制URL的大小
- 拒绝爬行超出特定长度的URL(环路使URL长度增加)
- URL/站点黑名单
- 模式检测
- 拒绝爬行带有重复组件的URL
- 内容指纹
- 获取页面内容的字节计算出一个校验和。如果是已经见过的校验和就不会再爬行此页面
- 校验和函数尽量保证不同页面拥有不同校验和
- 适当忽略页面内容的某些部分(比如嵌入的链接可动态修改的)
- 获取页面内容的字节计算出一个校验和。如果是已经见过的校验和就不会再爬行此页面
- 人工监视
- 要有诊断和日志功能
- 行为不当的机器人
- 失控的机器人
- 机器人发起的请求比正常请求快,造成web服务器负载高,拒绝正常的访问。
- 失效的URL
- 很长的错误URL
- 爱打听的机器人(侵犯隐私)
- 动态网关访问
- 失控的机器人
- 拒绝机器人访问
- 机器人在访问web站点的任意URL之前应该能先获取(周期性获取并缓存直到过期)robots.txt并处理,根据响应结果确定自己有没有权限访问。
- robots.txt格式
- User-Agent行说明哪些机器人受此记录影响
- Disallow,Allow行 说明这些机器人禁止或允许访问哪些URL
- robots.txt的缺点
- 是web站点管理员所有而不是各部分内容的作者所有
- HTML页面的作者可以直接在HTML文档添加robot-control标签来限制访问
- 通过METE标签控制机器人的爬行和索引行为