Web应用
# Web 应用
# HTTP
# Web 与 HTTP
网页(Web Page)包含多个对象(objects)
- 对象:HTML文件、JPEG图片、视频文件、动态脚本等
- 基本HTML文件:包含对其他对象引用的链接
对象的寻址(addressing)
- URL(Uniform Resource Locator):统一资源定位器 RFC1738
- Scheme://host:port/path
示例
# HTTP 协议概述
- 超文本传输协议
- HyperText Transfer Protocol
C/S结构
- 客户—Browser:请求、接收、展示Web对象
- 服务器—Web Server:响应客户的请求,发送对象
示意图
- HTTP 版本
使用 TCP 传输服务
无状态(stateless)
- 服务器不维护任何有关客户端过去所发请求的信息
有状态的协议更复杂
- 需维护状态(历史信息)
- 如果客户或服务器失效,会产生状态的不一致,解决这种不一致代价高
# HTTP 连接
# 响应时间分析与建模
RTT(Round Trip Time)
- 从客户端发送一个很小的数据包到服务器并返回所经历的时间
响应时间(Response time)
- 发起、建立TCP连接:1个RTT
- 发送HTTP请求消息到HTTP响应消息的前几个字节到达:1个RTT
- 响应消息中所含的文件/对象传输时间
Total=2RTT +文件发送时间
响应时间图示
# 非持久性连接(Nonpersistent HTTP)
特点
- 每个TCP连接最多允许传输一个对象
- HTTP 1.0版本使用非持久性连接
工作过程示意图
存在的问题
- 每个对象需要2个RTT
- 操作系统需要为每个TCP连接开销资源(overhead)
浏览器的优化措施
- 打开多个并行的TCP连接以获取网页所需对象
- 会服务器端造成严重的负担
# 持久性连接(Persistent HTTP)
特点
- 每个TCP连接允许传输多个对象
- HTTP 1.1版本默认使用持久性连接
- 发送响应后,服务器保持TCP连接的打开
- 后续的HTTP消息可以通过这个连接发送
无流水(pipelining)的持久性连接
- 客户端只有收到前一个响应后才发送新的请求
- 每个被引用的对象耗时1个RTT
带有流水机制的持久性连接
- HTTP 1.1的默认选项
- 客户端只要遇到一个引用对象就尽快发出请求
- 理想情况下,收到所有的引用对象只需耗时约1个RTT
# HTTP 消息格式
HTTP协议有两类消息
- 请求消息(request)
- 响应消息(response)
# 请求消息
- ASCII:人直接可读
请示消息的实例
请求消息的通用格式
上传输入的方法
- POST 方法
- 在请求消息的消息体(entity body)中上传客户端的输入
- URL 方法
- 输入信息通过 request 行的 URL 字段上传
方法的类型
# 响应消息
响应消息实例
响应状态代码
- 位于消息的第一行
- 示例
- 200 OK
- 301 Moved Permanently
- 400 Bad Request
- 404 Not Found
- 505 HTTP Version Not Supported
# Cookie 技术
Cookie 技术
- 某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
- RFC6265 (opens new window)
Cookie 组件
- HTTP 响应消息的 cookie 头部行
- HTTP 请求消息的 cookie 头部行
- 保存在客户端主机上的 cookie 文件,由浏览器管理
- Web 服务器端的后台数据库
Cookie 工作原理示意图
-
- 可以做出面向特定用户的特定动作
Cookie 的作用
- 身份认证
- 购物车
- 推荐
- Web e-mail
- ...
Cookie 最大的问题是隐私问题
# Web 缓存/代理服务器技术
功能
- 在不访问服务器的前提下满足客户端的HTTP请求
作用
- 缩短客户请求的响应时间
- 减少机构/组织的流量
- 在大范围内(Internet)实现有效的内容分发
Web缓存/代理服务器
- 用户设定浏览器通过缓存进行Web访问
- 浏览器向缓存/代理服务器发送所有的HTTP请求
- 如果所请求对象在缓存中,缓存返回对象
- 否则,缓存服务器向原始服务器发送HTTP请求,获取对象,然后返回给客户端并保存该对象
- 缓存既充当客户端,也充当服务器
- 一般由ISP(Internet服务提供商)架设
图示
Web 缓存示例
# 条件性 GET 方法
目标
- 如果缓存有最新的版本,则不需要发送请求对象
缓存
- 在HTTP请求消息中声明所持有版本的日期
If-modified-since: <date>
服务器
- 如果缓存的版本是最新的,则响应消息中不包含对象
HTTP/1.0 304 Not Modified
示意图
编辑 (opens new window)