URL与资源
-
URI包括URL和URN
- 前者通过资源位置来识别资源,后者通过名字来识别
- HTTP只处理URL
-
URL的最后通过#添加片段组件
- 可以利用这一字段指向HTML文档中的特定图片或和章节
- HTTP服务器通常只处理整个对象,所有片段一般不传送非服务器,而是浏览器获得整个资源后根据片段显示部分资源
- 例如可以通过 ${URL}#连接管理 让打开的窗口正中对准连接管理一节,而不是最上方
-
URL字符集
- URL本身只能使用安全字符集中的字符(US-ASCII)
- 为了URL的通用性和可以移植新,通过转义表示法来表示不安全的字符
- 包含一个%和两个表示字符的ASCII十六进制数
-
空格
- %20
-
~
- %7E
- 当然安全字符本身也可以被编码
- 有些程序以此绕过对URL进行模式匹配的程序如WEB过滤程序
-
传输方案
-
http
- 默认为80端口
-
https
- 默认为443端口
-
mailto
- 用于传输email
-
ftp
- 从FTP服务器下载或上传文件
-
rtsp
- 传输音/视频媒体资源
-
file
- 访问主机文件
- 格式:
file://<host>/<path> - 如果省略主机名,默认为本机
-
http
连接管理
-
HTTPS比HTTP多了一层TSL或者SSL的安全层
- 位于HTTP和TCP之间
- TCP连接通过源IP,源端口号,目的IP,目的端口号确定唯一连接
-
并行连接
- 一个HTML页面可能包含多个资源(文字,图片,视频等)
- 如果收到一个资源才请求下一个则太慢,我们可以并行请求
-
缺陷
- 但是如果网络带宽太小,并行请求都去竞争有限的带宽,则每个对象都会加载很慢
- 并且大量的连接会消耗很多内存资源,特别会对服务器造成压力
- 所以一般浏览器只会少量并行(4个左右)
-
持久连接
- 一次传输完成后不断开TCP连接,避免了建立和关闭连接的消耗
-
缺陷
- 一不小心可能会积累大量空闲连接,消耗服务器和客户端资源
- HTTP1.1默认为持久连接(Connection:Keep-Alive)
-
哑代理
- 代理服务器可能不支持keep-alive连接,但是他仍然会直接转发客户端的持久连接请求首部到服务器。
- 如果服务器同意持久连接并告知给客户端,客户端会以为该连接保持打开而不会执行关闭连接操作
- 当客户端在同一连接上发送下一个请求时,代理却忽略了该请求
- 此时浏览器一直阻塞,直到连接超时
- 因此实际上代理服务器不会转发HTTP1.0的Connection首部
-
管道化连接
- HTTP1.1在持久连接的基础上支持管道连接
- 可以不用等第一条消息返回响应就发送下一条消息
web服务器
-
种类
- 单线程
- 多线程/进程
- I/O复用
- I/O复用的多线程
-
重定向的可能原因
- 资源移动到新位置或被重命名
- 负载均衡
- 重定向到负载较轻的服务器
代理
-
代理和网关的区别
- 代理连接的是使用相同协议的端点
- 网关连接的可能是使用不同协议的端点
- 网关扮演协议转换器的角色,可以使非HTTP协议的服务器为客户端提供HTTP服务
- 实际上代理和网关的边界很模糊
-
代理的优点
- 过滤内容
- 访问控制
- 可设置服务器只接受来自特定代理服务器的访问请求(反向代理)
- 可禁止客户端访问某些网站,或者记录访问(正向代理)
- 防火墙
- 缓存
- 转码器
- 降低饱和度使得能在电视上观看
- 重新排版使得能在手机上显示
- 匿名代理
-
客户端的代理配置
- PAC文件(proxy auto-configuration)
- javascript程序,自动判断URL是否需要重定向到代理服务器
-
代理URI和服务器URI的不同
- 原始的请求行不包含服务器地址和端口部分
- 由于代理需要知道目标服务器的名称才能转发,于是基于代理的请求发送完整的URI
- 现在一个WEB物理主机上可能会有多个服务器,也就是同一个IP地址对应多个网址
- 与上面的处理方式不同,虚拟web服务器通过Host首部来承载主机和端口信息
-
浏览器对URL的解析
- 没有代理时,会尝试自动扩展,例如加入www前缀
- 有显式代理时,不自动拓展
缓存
-
优点
- 减少冗余数据传输
- 缓解带宽瓶颈
- 互联网带宽远小于以太网带宽
- 避免瞬间拥堵
- 突发事件如爆炸性新闻可能导致许多人访问同一个网页造成瞬间拥堵
- 减少距离时延
- 客户端和服务器之间的地理距离造成延迟
-
缓存的处理步骤
- 接受请求报文
- 解析处URL和各种首部
- 查询本地缓存
- 新鲜度检测
- 创建响应报文
- 发送回客户端
- 记录日志
-
缓存过期
- 原始服务器可以通过cache-control或者expires首部告知客户端缓存过期时间
-
服务器再验证
- 缓存过期不意味着缓存的内容被更改了
- 客户端可以向服务器验证缓存是否被修改了,如果没有,仍然可以直接返回缓存
- 验证首部
- If-Modified-Since
- If-None-Match
- 如果没有修改,服务器就返回304 Not Modified
-
缓存与广告
- 缓存会减少向原始服务器的访问次数,从而减少了广告商(如Google)的收益
- 所以广告商会添加Cache-Control:no-cache避免缓存
网关
隧道
- 隧道允许用户痛殴HTTP连接发送非HTTP流量
-
使用隧道的常见原因就是在HTTP连接中嵌入非HTTP流量
- 在SSL加密后,网关无法识别HTTP首部,于是不知道将流量发往何处
- 因此需要先告知网关要连接的主机和端口,然后建立隧道
- 这样,这类流量可以穿透只允许HTTP流量通过的防火墙
-
通过HTTP中的CONNECT方法创建
- 为了避免通过建立的SSL隧道传输恶意信息(而非SSL信息),可以对客户端进行代理认证
WEB爬虫
-
为了避免重复访问某一页面甚至产生环路,爬虫需要记录所访问的页面
- 树或散列表
- URL转换为定长数字的位图
-
不同的URL可能指向同一个资源
- 例如省略了80端口或者省略了默认的index.html页面
- 因此爬虫需要自动规范化URL再判断
-
避免循环的方式
- 规范化URL
- 广度优先的爬行
- 限制爬虫从一个web站点获得网页的数量
-
拒绝爬虫访问
- 网站管理员可以通过robots.txt文件告知爬虫哪些页面不允许被访问
- 这一标准并无强制约束力
客户端识别方法
-
HTTP首部
User-AgentAuthorization-
From- 包含email地址
- 为了防止搜集个人信息,一般浏览器不发送
- 一般是由爬虫发送
-
胖URL
- 在URL开始或者结束的地方添加用户状态信息
-
存在的问题
- 丑陋
- 可能泄露信息
- 不小心包URL发送给其他人
- 不能缓存
- 服务器需要重写HTML,增加了负载
cookie
-
种类
- 会话cookie
- 临时的,退出浏览器即被删除
- 持久cookie
- 储存在硬盘上
- 一般用来记录配置文件和登录信息
- 唯一区别在于过期时间
- 会话cookie
- cookie由服务器发送,客户端储存
- 带有cookie首部的请求不应该被缓存
-
Set-Cookie属性
- Expires
- 定义实际生存期
- Domain
- 只向特定域名的服务器发送cookie
- 例如只向amazon.com发送
- Path
- 为服务器的特定文档(路径)分配
- Secure
- 只在HTTPS时发送cookie
- Max-Age
- 生存时间
- 生存时间
- Expires
认证
-
步骤
-
HTTP基本认证
- 用冒号分割用户名和密码,然后用base-64编码
- base-64编码虽然使得密码不再是明文,但是很容器解码
- 并且第三方可以在传输过程中捕获密码
- 可以和SSL结合使用
安全HTTP
-
使用RSA算法的非对称加密虽然安全到但是计算很慢
- 现在一般采取混合加密系统
- 即用非对称加密传递对称**,然后通过对称**通信
-
数字证书
- 用于身份认证
- 大多数证书采用X509的标准格式
-
HTTPS
- 默认端口为443
- 默认端口为443
重定向
-
HTTP重定向
- 返回302状态码
- 增加了时延
-
DNS重定向
- 一个域名可以对应多个IP
- DNS服务器可以将域名每次都解析到负载最轻的IP