网络应用的体系结构
客户机/服务器结构
Client Server C/S (比如 WEB 应用)
服务器
- 7*24 小时提供服务
- 永久性访问地址/域名
- 利用大量服务器实现可扩展性
客户机
- 与服务器通信,使用服务器提供的服务
- 间歇性接入网络
- 可能使用动态 IP 地址
- 不会与其他客户机直接通信
点对点结构
Peer to Peer P2P (BT 文件下载)
- 没有永远在线的服务器
- 任意端系统/结点之间可以直接通讯
- 节点间歇性接入网络
- 节点可能改变 IP 地址
优点:高度可伸缩,缺点:实现起来复杂,难于管理
混合结构
Hybrid
Napster
- 文件传输使用 P2P 结构
- 文件搜索采用 C/S 结构 集中式
每个节点向中央服务器登记自己的内容,每个节点向中央服务器提交查询请求。
网络应用进程通信
端口号
进程寻址=端口号
主机寻址= IP 地址
应用层协议
- 网络应用需遵循应用层协议
- 公开的协议
- 由 RFC (Request for Comments)定义
- 允许互操作
- HTTP、SMTP…
- 私有协议
- 多数 P2P 文件共享应用
应用层协议内容
消息的类型(type)
- 请求消息
- 响应消息
消息的语法(syntax)/格式
- 消息中有哪些字段
- 每个字段如何描述
字段的语义(semantics)
- 字段中信息的含义
规则(rules)
- 进程何时发送/响应消息
- 进程如何发送/响应消息
网络应用的需求与传输层服务
网络应用的需求
数据丢失(data loss)/可靠性(reliability)
- 某些网络应用能够容忍一定的数据丢失:网络电话、在线视频
- 某些网络应用要求 100% 可靠的数据传输:文件传输、网络银行
时间(timing)/延迟(delay)
- 有些应用只有在延迟足够低时才有效:网路电话/网络游戏
带宽(bandwidth)
- 某些应用只有在带宽达到最低要求时才有效:网络视频
- 某些应该能够适应任何带宽,弹性应用。如 email
安全性
Application | Data loss | Bandwidth | Time Sensitive |
---|---|---|---|
file transfer | no loss | elastic | no |
no loss | elastic | no | |
Web documents | no loss | elastic | no |
real-time audio/video | loss-tolerant | hard require | yes, 100 msec |
stored audio/video | loss-tolerant | hard require | yes, few secs |
interactive games | loss-tolerant | few kbps up | yes, 100 msec |
instant messaging | no loss | elastic | yes and no |
Internet 提供的传输服务
TCP服务
面向连接
客户机/服务器进程间需要建立连接
可靠的传输
流量控制
发送方不会发送速度过快,超过接收方的处理能力
拥塞控制
当网络负载过重时能够限制发送方的发送速度
不提供时间/延迟保障
不提供最小带宽保障
UDP 服务
无连接
不可靠的数据传输
不提供可靠性保障
不提供流量控制
不提供拥塞控制
不提供延迟保障
不提供带宽保障
Application | Application layer protocol | Underlying transport protocol |
---|---|---|
SMTP | TCP | |
remote terminal access | Telnet | TCP |
WEB | HTTP | TCP |
file transfer | FTP | TCP |
streaming multimedia | proprietary(RealNetWorks) | TCP or UDP |
internet telephony | proprietary(Vonage、Dialpad) | typically UDP |
WEB 与 HTTP
HTTP 无状态的协议,stateless,服务器不维护任何有关客户端过去所发请求的信息。
有状态的协议往往更复杂,需要维护状态(历史信息),如果客户和服务器失效,会产生状态的不一致,解决这种不一致代价高。
HTTP 连接的两种类型
非持久性连接(Nonpersistent HTTP)
如一张网页包含10个图片链接,此时网速很慢的话,图片会一个接一个显示。
- HTTP 1.0 版本使用
非持久性连接存在的问题
- 每个对象需要两个 RTT
- 操作系统需要为每个 TCP 连接开销资源(overhead)
持久性连接(Persistent HTTP)
- HTTP 1.1 版本默认使用
无流水(pipelining)的持久性连接
- 客户端只有收到前一个响应后才发送新的请求
- 每个被引用的对象耗时一个 RTT
带有流水机制的持久性连接
- HTTP 1.1 的默认选项
- 客户端只要遇到一个引用对象就尽快发出请求
- 理想情况下,收到所有的引用对象只需耗时约一个 RTT
RTT(Round Trip Time)
从客户端发送一个很小的数据包到服务器并返回所经历的时间。
Cookie 技术
HTTP 协议无状态,但是很多应用需要服务器掌握客户端的状态,如网上购物。
某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。
Cookie 的组件
- HTTP 响应消息的 cookie 头部行
- HTTP 请求消息的 cookie 头部行
- 保存在客户端主机上的 cookie 文件,由浏览器管理
- WEB 服务器端的后台数据库
Cookie 应用
不限于如下应用:
- 身份认证
- 购物车
- 推荐
- Web e-mail
隐私问题
Web缓存/代理服务器技术
在不妨问服务器的前提下满足客户端的 HTTP 请求。
- 缩短客户请求的响应时间
- 减少机构/组织的流量
- 在大范围内(Internet)实现有效的内容分发(CDN)
与 Cookie 技术不同,Cookie 旨在解决功能上的问题,而缓存技术是在性能上进行优化处理。一个面向功能一个面向性能。
缓存既充当客户端也充当服务器。一般由 ISP 架设。
一致性问题
条件性 GET 请求,request header if-modified-since,response 304 Not Modified。
SMTP
- 使用 TCP 进行 email 消息的可靠传输
- 传输过程的三个阶段
- 握手
- 消息的传输
- 关闭
- 命令/响应交互模型
- 命令(command)ASCII 文本
- 响应(response)状态代码和语句
- email 消息只能包含 7 位 ASCII 码
SMTP VS HTTP
- HTTP 拉式 (pull)
- SMTP 推式 (push)
- 都使用命令/响应交互模型
- 命令和状态码都是 ASCII 码
- HTTP:每个对象封装在独立的响应消息中
- SMTP:多个对象在由多个部分构成的消息中发送
E-mail 消息格式
- SMTP:消息的传输/交换协议
- 文本格式消息
- 头部行 (header)
- to
- from
- subject
- 消息体 (body)
- 消息本身
- 只能是 ASCII 字符
- 头部行 (header)
Email 消息格式:多媒体扩展
MIME
多媒体邮件扩展,通过在邮件头部增加额外的行以声明 MIME 的内容类型
邮件访问协议 access protocol
从服务器获取邮件的协议,SMTP 是传输协议。
- POP Post Office Protocol 认证/授权(客户端-服务器)和下载
- IMAP Internet Mail Access Protocol
- 更多的功能
- 更加复杂
- 能够操纵服务器上存储的消息
- HTTP (基于 web 的客户端)
POP 协议
- 认证过程
- 客户端命令
- User:声明用户名
- Pass:声明密码
- 服务器响应
- +OK
- -ERR
- 客户端命令
- 事务阶段
- List:列出消息数量
- Retr:用编号获取消息
- Dele:删除消息
- Quit
- 下载并删除模式 (用户如果换了客户端软件,无法重读该消息)
- 下载并保持模式 (不同客户端都可以保留消息的拷贝)
- POP3 是无状态的
IMAP 协议
有状态的
- 所有消息统一保存在一个地方:服务器
- 允许用户利用文件夹组织消息
- IMAP 支持跨会话(Session)的用户状态
- 文件夹的名字
- 文件夹与消息 ID 之间的映射
DNS
Domain Name System。主要解决 Internet 上主机/路由器的识别问题。 IP 地址与域名的映射。
域名解析系统:多层命名服务器构成的分布式数据库,是一个应用层协议完成名字的解析。
DNS服务
- 域名向 IP 地址的翻译
- 主机别名
- 邮件服务器别名
- 负载均衡:Web 服务器
为什么不使用集中式 DNS
- 单点失败问题
- 流量问题
- 距离问题
- 维护性问题
分布式层次式数据库
- 根域名服务器 13个
- 顶级和权威域名解析服务器
- 权威(Authoritative)域名服务器
- 本地域名解析服务器 (不属于层级体系)
根域名服务器
- 本地域名解析服务器无法解析域名时,访问根域名服务器
- 根域名服务器的行为
- 如果不知道映射,访问权威域名服务器
- 获得映射
- 向本地域名服务器返回映射
顶级和权威域名解析服务器
顶级域名服务器(TLD top-level domain),负责com、org、net、edu等
顶级域名和国家顶级域名 (cn、uk)
- Network Solutions 维护顶级域名服务器
- Educause 维护 edu 顶级域名服务器
权威(Authoritative)域名服务器
组织的域名解析服务器,提供组织内部服务器的解析服务,由组织负责维护、服务提供商负责维护。自治的。
本地域名解析服务器
- 不严格属于层级体系
- 每个 ISP 有一个本地域名服务器
- 默认域名解析服务器
- 当主机进行 DNS 查询时,查询被发送到本地域名服务器
- 作为代理(proxy),将查询转发给(层级式)域名解析服务器系统
迭代查询
- 被查询服务器返回域名解析服务器的名字
- 我不知道这个名字但你可以问这个服务器
递归查询
- 将域名解析的任务交给所联系的服务器
DNS 记录缓存和更新
只要域名解析服务器获得域名-IP映射,就要缓存这一映射,一段时间过后,缓存条目失效(删除)。
本地域名服务器一般会缓存顶级域名服务器的映射,因此根域名服务器不经常被访问。
记录的更新/通知机制
- RFC 2136
- Dynamic Updates in the Domain Name System (DNS UPDATE)
DNS 记录和消息格式
资源记录(RR resource records)
RR format: (name, value, type, ttl)
type
- Type=A
- Name=主机域名
- Value=IP 地址
- Type=NS
- Name=域(edu.cn)
- Value=该域权威域名解析服务器的主机域名 指定了这个域的解析服务器是谁
- Type=CNAME
- Name=某一真实域名的别名
- Value=真实域名
- Type=MX
- Value是与name相对应的邮件服务器
DNS 协议
查询(query)和回复(repaly)的协议
消息格式相同
消息头部
- Identification:16位查询编号,回复使用相同的编号
- flags
- 查询或回复
- 期望递归
- 递归可用
- 权威回答
如何注册域名
在域名管理机构(如 Network Solutions)注册域名。
- 向域名管理机构提供权威域名解析服务器的名字和 IP 地址
- 域名管理机构向 com 顶级域名解析服务器中插入两条记录
(xxx.com, xxx.xxx.com, NS)
,(xxx.xxx.com, 111.111.111.111, A)
P2P
- 没有服务器
- 任意端系统之间直接通信
- 节点阶段性接入 Internet
- 节点可能更换 IP 地址
BitTorrent 协议
- tracker 跟踪参与 torrent 的节点
- torrent 交换同一个文件的文件块的节点组
- 文件划分为 256 KB 的 chunk
- 节点加入 torrent
- 开始没有 chunk,会逐渐积累
- 向 tracker 注册以获得节点清单,与某些节点(邻居)建立连接
- 下载的同时,节点需要向其他节点上传 chunk
- 节点可能加入或离开
- 一旦节点获得完整的文件,它可能(自私的)离开或(无私的)留下
- 获取 chunk
- 给定任一时刻,不同的节点持有文件的不同 chunk 集合
- 节点定期查询每个邻居所持有的 chunk 列表
- 节点发送请求,请求获取缺失的 chunk
- 稀缺优先
- 发送 chunk: tit-for-tat
- 向正在向自己发送 chunk 速率最快的四个节点发送,每10秒重新评估 top4
- 每 30 秒随机选择一个其他节点,向其发送 chunk
- 新选择节点可能加入 top4
- optimistically unchoke
上传速率高,则能找到更好的交易伙伴,从而更快的获取文件。
P2P 索引
P2P 系统索引:信息到节点位置(IP + PORT)的映射
文件共享(电驴)
- 利用索引动态跟踪节点所共享的文件的位置
- 节点需要告诉索引它拥有哪些文件
- 节点搜索索引,从而获知能从哪得到哪些文件
即时消息(QQ)
- 索引负责将用户名映射到位置
- 当用户开启 IM 应用时,需要通知索引它的位置
- 节点检索索引,确定用户的 IP 地址
集中式索引
中央目录服务器 centralized directory server,内容和文件传输是分布式的,但是内容定位是高度集中式的。
- 单点失效问题
- 性能瓶颈
- 版权问题(容易被发现,被打击)
洪范式查询 Query flooding
- 完全分布式架构
- Gnutella 采用这种架构
- 每个节点对它共享的文件进行索引,且只对它共享的文件进行索引
覆盖网络(overlay network)Graph 逻辑网络
- 节点 X 与 Y 之间如果有 TCP 连接,那么构成一个边
- 所有的活动节点和边构成覆盖网络
- 边:虚拟链路
- 节点一般邻居数少于 10 个
洪范式查询流程
- 查询消息通过已有的 TCP 连接发送
- 节点转发查询消息
- 如果查询命中,则利用反向路径发回查询节点
层次式覆盖网络
- 介于集中式索引和洪范查询之间的方法
- 每个节点或者是一个超级节点,或者被分配一个超级节点
- 节点和超级节点之间维持 TCP 连接
- 某些超级节点对之间维持 TCP 连接
- 超级节点负责跟踪子节点的内容