Chap 2 应用层
2.1 应用层原理
- 网络应用的体系结构:
- 客户-服务器 (C/S) 模式 (可扩展性差, 性能随用户数量增加会有断崖式下降)
- 对等体 (P2P) 体系结构
- 混合体
- 进程通信: 同一主机内, 使用进程间通信机制通信 (操作系统定义); 不同主机, 通过交换报文来通信
- 对进程进行编址 addressing:
- 进程为了接受报文, 必须有一个标识 SAP: IP 地址, 所采用的传输层协议是 TCP 还是 UDP, TCP/UDP 的端口号;
- 本质上, 一对主机的进程之间的通信由 2 个端节点构成.
- 对进程进行编址 addressing:
- 传输层提供的服务 - 层间信息的代表: 如果 socket api 每次传输报文都要携带双方地址和内容, 会过于繁琐.
- 用个代号标示通信的双方或单方: socket;
- 就想 OS 打开文件返回的句柄一样 – 对句柄的操作就是对文件的操作;
- TCP socket: 相当于本地 IP 本地 TCP 端口, 对方 IP 对方 TCP 端口的本地标识 (用于指明应用进程会话的本地标识);
- UDP socket: 两个进程之间的通信需要之前无需建立连接 (每个报文都是独立传输的). 用一个整数表示本应用实体的标示: 本 IP, 本端口. 但是传输报文时, 必须提供对方 IP, port; 接受报文时, 传输层需要上传对方的 IP, port.
- 应用层需要传输层提供的服务? 如何描述传输层的服务?
- 数据丢失率
- 延迟
- 吞吐
- 安全性
- TCP 服务
- 可靠的传输服务
- 流量控制: 发送方不会淹没接受方
- 拥塞控制: 当网络出现拥塞时, 能抑制发送方
- 不能提供的服务: 时间保证、最小吞吐保证和安全
- 面向连接: 要求在客户端进程和服务器进程之间建立连接
- UDP 服务:
- 不可靠的数据传输
- 不提供的服务: 可靠, 流量控制, 拥塞控制, 时间带宽保证, 建立连接
- 存在的必要性:
- 能够区分不同进程
- 无需建立连接
- 不做可靠性的工作
- 没有流量控制, 拥塞控制, 应用能够按照设定的速度发送数据
2.2 Web and HTTP
- Web 页: 由一些对象组成. 含有一个基本的 html 文件, 其中包含若干对象的引用 (以 url 的形式表示: 协议名+用户:口令+主机名+路径名+端口)
- HTTP: 超文本传输协议
- Web 的应用层协议
- 客户/服务器模式
- 使用 TCP
- 客户发起一个与服务器的 TCP 连接, 端口号为 80
- 服务器接受客户的 TCP 连接 (服务器有 waiting socket 和 connection socket, 每建立一个连接, 弹出一个 connection socket, 同时 waiting socket 始终存在)
- 在浏览器与 Web 服务器交换 HTTP 报文
- TCP 连接关闭
- 无状态服务器: 服务器不需要维护客户端的状态
- 建立连接需要一次往返 (建立连接请求 + 建立连接确认), http 请求对象, 返回对象 (响应报文)

- 非持久 (最多只有一个对象在 TCP 连接上发送, 下载多个对象需要多个 TCP 连接 – HTTP 1.0) 和持久 (多个对象在一个 TCP 连接上传输 – HTTP 1.1) HTTP
- 非流水方式的持久 HTTP: 客户端只有在收到前一个响应后才能产生一个请求, 每个引用对象花费一个 RTT
- 流水方式的持久 HTTP: 客户端遇到一个引用对象就立即产生一个请求, 所有引用 (小) 对象只花费一个 RTT 是可能的
- HTTP 请求报文
- 两种类型: 请求, 响应
- ASCII: 请求行 (GET, POST, HEAD 命令), 首部行, 换行回车符 (表示报文结束)
- 提交表单输入
- Post 方式
- URL 方式
- HTTP 响应报文
- 状态行 (协议版本, 状态码和相应状态信息), 首部行, 数据 (如请求的 HTML 文件)
- 用户 - 服务器的状态: cookies
- 组成部分:
- 在 HTTP 响应报文中有一个 cookie 的首部行
- 在 HTTP 请求报文含有一个 cookie 的首部行
- 在用户端系统中保留有一个 cookie 文件, 由用户的浏览器管理
- 在 Web 站点有一个后端数据库

- 组成部分:
- Web 缓存 (代理服务器 proxy server) – 不访问原始服务器, 就满足客户需求
- 用户设置浏览器: 通过缓存访问 Web
- 浏览器将所有的 HTTP 请求发给缓存
- 缓存既是客户端又是服务器
- 用很小的缓存就可以解决大多数需求 ( 28 分布, 访问的趋同性)
- 安装本地缓存效果远好于扩宽链路
- 条件 GET 方法: 如果缓存中的对象拷贝是最新的, 就不要发送对象
2.3 FTP: 文件传输协议
- 向远程主机上传文件或从远程主机接收文件
- 客户/服务器模式
- 客户端: 发起传输的一方
- 服务器: 远程主机
- 控制连接与数据连接分开
- FTP客户端与FTP服务器服务器通过端口21联系, 并使用TCP为传输协议
- 客户端通过控制连接获得身份确认
- 客户端通过控制连接发送命令浏览远程目录
- 收到一个文件传输命令时, 服务器打开一个到客户端的数据连接
- 一个文件传输完成后, 服务器关闭连接
- 特点
- 服务器打开第二个 TCP 数据连接用来传输另一个文件
- 控制连接: 带外 (“out of band”) 传送
- FTP服务器维护用户的状态信息: 当前路径, 用户帐户与控制连接对应 – 有状态
2.4 Email
- 三个组成部分:
- 用户代理 (“邮件阅读器”, 阅读, 编辑, Foxmail, Outlook)
- 邮件服务器
- 简单邮件传输协议: SMTP

- SMTP [RFC 2821]
- 使用TCP在客户端和服务器之间传送报文, 端口号为25
- 直接传输: 从发送方服务器到接收方服务器
- 传输的3个阶段
- 握手
- 传输报文
- 关闭
- 命令/响应交互
- 命令: ASCII文本
- 响应: 状态码和状态信息
- 报文必须为7位ASCII码
2.5 DNS (Domain Name System)
- IP 地址标识主机, 路由器. DNS 负责域名 - IP 地址的转换.
- DNS的主要思想:
- 分层的、基于域的命名机制
- 若干分布式的数据库完成名字到IP地址的转换
- 运行在UDP之上端口号为53的应用服务
- 核心的 Internet 功能, 但以应用层协议实现
- 在网络边缘处理复杂性
- DNS主要目的:
- 实现主机名-IP地址的转换(name/IP translate)
- 其它目的:
- 主机别名到规范名字的转换: Host aliasing
- 邮件服务器别名到邮件服务器的正规名字的转换: Mail server aliasing
- 负载均衡: Load Distribution
- DNS 域名结构
- 一个层面命名设备会有很多重名
- DNS 采用层次树状结构的命名方法
- Internet 根被划分为几百个顶级域
- 通用的 (generic): .com, .edu, .gov, .int, .mil, .net, .org, .firm, .hsop, .web, .arts, .rec;
- 国家的 (contries): .cn, .us, .nl, .jp;
- 每个(子)域下面可划分为若干子域 (subdomains)
- 树叶是主机
- 区域 (zone)
- 区域的划分有区域管理者自己决定
- 将DNS名字空间划分为互不相交的区域, 每个区域都是树的一部分
- 名字服务器
- 每个区域都有一个名字服务器: 维护着它所管辖区域的权威信息 (authoritative record)
- 名字服务器允许被放置在区域之外, 以保障可靠性
- 顶级域 (TLD) 服务器: 负责顶级域名: 如com, org, net, edu和gov; 和所有国家级的顶级域名, 如cn, uk, fr, ca, jp)
- 区域名字服务器维护资源记录
- 资源记录 (resource records)
- 作用: 维护域名 - IP地址 (其它) 的映射关系
- 位置: Name Server 的分布式数据库中
- RR格式: (domain_name, ttl, type, class, Value)
- Domain_name: 域名
- Ttl - time to live : 生存时间 (权威, 缓冲记录)
- Class 类别: 对于Internet, 值为IN
- Value 值: 可以是数字 域名或ASCII串
- Type 类别: 资源记录的类型

- 资源记录 (resource records)
- DNS大致工作流程
- 应用调用解析器 (resolver)
- 解析器作为客户向 Name Server 发出查询报文 (封装在UDP段中)
- Name Server 回响应报文(name/ip)

- 本地名字服务器 (Local Name Server)
- 并不严格属于层次结构
- 每个ISP (居民区的ISP、公司、大学, 都有一个本地DNS服务器)
- 也称为“本地名字服务器”
- 当一个主机发起一个DNS查询时, 查询发送到其本地DNS服务器
- 起着代理的作用, 将查询转发到层次结构中
- 两种查询:

2.6 P2P 应用
- 没有(极少)一直运行的服务器; 任意端系统直接通信; 利用 peer 的服务能力; peer 节点间歇上网, 每次 IP 地址都有可能变化.
- 服务器上载 N 份文件, N 个客户端下载的时间下限
- C/S 模式下, $\max{\dfrac{F}{d_{min}}, N\dfrac{F}{u_s}}$.
- P2P 模式下, $\max{\dfrac{F}{d_{min}}, N\dfrac{F}{u_s+\sum Nu_c}}$.
- 两大问题: 如何定位所需资源; 如何处理用户的加入与离开.
- overlay 覆盖网 (应用层逻辑网络)
- 非结构化 P2P
- 集中化目录 (有一个节点维护全局目录信息)
(单点故障, 性能瓶颈, 版权侵犯) - 完全分布式 (没有节点维护全局目录信息) 洪泛 (flooding) 式查询

- 混合体 (组长维护局部目录信息)

- 集中化目录 (有一个节点维护全局目录信息)
- DHTC (Distributed Hash Table) (结构化) P2P
- Hash
- DHT方案
- 环形DHT 以及覆盖网络
- Peer波动
2.7 CDN
-
多媒体: 视频
- 视频:固定速度显示的图像序列
- 网络视频特点:
- 高码率: >10x于音频,高的网络带宽需求
- 可以被压缩
- 90%以上的网络流量是视频
- 数字化图像:像素的阵列
- 每个像素被若干bits表示
- 编码:使用图像内和图像间的冗余来降低编码的比特数
- 空间冗余(图像内)
- 空间编码例子: 不是发送 N 个相同的颜色 (全部是紫色) 值, 仅仅发送2各值: 颜色 (紫色) 和重复的个数 (N)
- 时间冗余 (相邻的图像间)
- 时间编码例子: 不是发送第 i+1 帧的全部编码, 而仅仅发送和帧 i 差别的地方
- 空间冗余(图像内)
- CBR: (constant bit rate): 以固定速率编码
- VBR: (variable bit rate): 视频编码速率随时间的变化而变化
-
多媒体流化服务: DASH (Dynamic, Adaptive Streaming over HTTP)
- 服务器:
- 将视频文件分割成多个块
- 每个块独立存储, 编码于不同码率 (8-10种)
- 告示文件 (manifest file): 提供不同块的URL
- 客户端:
- 先获取告示文件
- 周期性地测量服务器到客户端的带宽
- 查询告示文件,在一个时刻请求一个块, HTTP头部指定字节范围
- 如果带宽足够, 选择最大码率的视频块
- 会话中的不同时刻, 可以切换请求不同的编码块 (取决于当时的可用带宽)
- 服务器:
-
CDNs (Content Distribution Networks)
- 挑战: 服务器如何通过网络向上百万用户同时流化视频内容 (上百万视频内容)?
- 选择1: 单个的、大的超级服务中心“megaserver”
- 服务器到客户端路径上跳数较多, 瓶颈链路的带宽小导致停顿
- “二八规律”决定了网络同时充斥着同一个视频的多个拷贝, 效率低 (付费高、带宽浪费、效果差)
- 单点故障点, 性能瓶颈
- 周边网络的拥塞
- 选项2: 通过CDN, 全网部署缓存节点, 存储服务内容, 就近为用户提供服务, 提高用户体验
- enter deep: 将CDN服务器深入到许多接入网
- 更接近用户,数量多,离用户近,管理困难
- Akamai, 1700个位置
- bring home: 部署在少数 (10个左右) 关键位置,如将服务器簇安装于POP附近 (离若干1stISP POP较近)
- 采用租用线路将服务器簇连接起来
- Limelight

- enter deep: 将CDN服务器深入到许多接入网
-
NetFlix 案例

2.8 套接字编程
2种传输层服务的socket类型:
- TCP: 可靠的, 字节流的服务
- UDP: 不可靠 (数据UDP数据报) 服务
TCP 套接字编程
服务器首先运行,等待连接建立:
- 服务器进程必须先处于运行状态
- 创建欢迎socket
- 和本地端口捆绑
- 在欢迎socket上阻塞式等待接收用户的连接
客户端主动和服务器建立连接:
- 创建客户端本地套接字 (隐式捆绑到本地port)
- 指定服务器进程的IP地址和端口号, 与服务器进程连接
- 当与客户端连接请求到来时
- 服务器接受来自用户端的请求, 解除阻塞式等待, 返回一个新的socket (与欢迎socket不一样), 与客户端通信
- 允许服务器与多个客户端通信
- 使用源IP和源端口来区分不同的客户端
- 连接 API 调用有效时,客户端 IP 与服务器建立了 TCP 连接
|
|
|
|
例子: C 客户端 (TCP)
|
|
例子: C服务器 (TCP)
|
|
UDP 套接字编程
UDP: 在客户端和服务器之间没有连接
- 没有握手
- 发送端在每一个报文中明确地指定目标的IP地址和端口号
- 服务器必须从收到的分组中提取出发送端的IP地址和端口号
UDP: 传送的数据可能乱序, 也可能丢失
Client/server socket 交互: UDP

样例: C客户端 (UDP)
|
|
样例: C服务器(UDP)
|
|
2.10 小结
-
应用程序体系结构
- 客户-服务器
- P2P
- 混合
-
应用程序需要的服务品质描述:
- 可靠性、带宽、延时、安全
-
Internet传输层服务模式
- 可靠的、面向连接的服务: TCP
- 不可靠的数据报: UDP 流行的应用层协议:
- HTTP
- FTP
- SMTP, POP, IMAP
- DNS
-
Socket编程
-
应用层协议报文类型:请求/响应报文:
- 客户端请求信息或服务
- 服务器以数据、状态码进行响应
-
报文格式:
- 首部:关于数据信息的字段
- 数据:被交换的信息
-
控制报文vs. 数据报文
- 带内、带外
-
集中式 vs. 分散式
-
无状态 vs. 维护状态
-
可靠的 vs. 不可靠的报文传输
-
在网络边缘处理复杂性