应用层
应用层概述
网络应用体系结构
网络应用仅在端系统运行,核心网络设备不运行用户程序。
| 体系结构 | 通信方式 | 服务器特征 | 客户端特征 | 典型应用 |
|---|---|---|---|---|
| C/S | 通过服务器间接通信 | 固定 IP,长期在线,数据中心集群 | 动态 IP,断续在线,互不直接通信 | Web、Email |
| P2P | 主机直接通信 | 无固定服务器 | 既是客户也是服务方,自扩展性 | 迅雷、BT |
自扩展性:文件共享中,对等方增加带来负载增加,但同时服务能力也增加。
进程通信与寻址
进程(process):主机上运行的应用程序。同一主机内用 IPC,不同主机间通过网络交换消息。
Socket:应用层与传输层之间的编程接口,由操作系统提供,负责消息收发。
进程寻址:仅用 IP 无法区分同一主机上的多个进程,故采用 IP 地址 + 端口号。
- HTTP server:
80 - Mail server:
25
应用层协议
定义内容:
- 消息类别:request / response
- 消息语法:字段划分
- 消息语义:字段含义
- 时序规则:何时发送请求/响应
| 协议类型 | 定义方式 | 互操作性 | 示例 |
|---|---|---|---|
| 开放协议 | RFC | 允许互操作 | HTTP、SMTP |
| 专用协议 | 私有 | 封闭 | Skype |
传输服务需求与供给
| 需求维度 | 说明 | 典型应用 |
|---|---|---|
| 可靠性 | 部分应用需可靠传输(文件、Web),部分可容忍丢失(音频) | FTP、HTTP / 流媒体 |
| 实时性 | 低延迟要求 | 网络电话、交互游戏 |
| 吞吐量 | 带宽敏感 vs 弹性 | 多媒体 / 文件传输 |
| 安全性 | 保密、完整、认证 | 金融交易 |
TCP 提供的服务:
- 可靠传输、流量控制、拥塞控制
- 面向连接
- 不提供:定时、最小数据率保证、安全性
UDP 提供的服务:
- 不可靠数据传输
- 不提供:可靠性、流量控制、拥塞控制、定时、数据率保证、安全性、连接建立
为何存在 UDP? 以 DNS 为例,若用 TCP 则开销大、延迟长、服务器负担重。
SSL/TLS:在应用层提供加密的 TCP 连接,保证数据完整性与端认证。应用层通过 SSL socket API 将明文交给 socket,经互联网加密传输。
Socket 编程
系统调用与套接字
套接字描述符表(每进程一个)由操作系统维护,记录:
- 协议族(如
PF_INET) - 服务类型(如
SOCK_STREAM、SOCK_DGRAM) - 本地/远地 IP 地址与端口
TCP Socket 交互
TCP 面向连接,分三阶段:
1. 连接建立阶段:
| 调用方 | 系统调用 | 作用 |
|---|---|---|
| 服务器 | socket() | 创建套接字 |
| 服务器 | bind() | 绑定本地地址(熟知端口 + IP) |
| 服务器 | listen() | 设为被动方式,等待请求 |
| 服务器 | accept() | 提取连接请求,返回新连接套接字 |
| 客户端 | socket() | 创建套接字 |
| 客户端 | connect() | 发起连接建立请求 |
并发服务器:主进程调用
accept()后fork()从属进程处理连接,主进程继续监听。
2. 传送阶段:send() / recv()
3. 连接释放阶段:close()
服务器端: socket → bind → listen → accept → recv/send → close
客户端: socket → connect → recv/send → close
UDP Socket 交互
UDP 无连接,发送前不握手。发送方显式附加目标 IP 与端口,接收方提取发送方地址。
服务器端: socket → bind → recvfrom/sendto → close
客户端: socket → sendto/recvfrom → close
文件传送协议
FTP
FTP 基于 TCP,采用 C/S 方式,屏蔽异构系统差异。
服务器进程组成:
- 主进程:打开熟知端口
21,等待请求;接收请求后启动从属进程。 - 从属进程:处理单个请求,处理完毕即终止。
两个 TCP 连接:
| 连接 | 端口 | 作用 | 生命周期 |
|---|---|---|---|
| 控制连接 | 21 | 传送命令与响应 | 整个会话期间保持 |
| 数据连接 | 20 | 实际传输文件 | 每次传输时建立,完毕后释放 |
使用两个端口号使协议简单,且传输中可利用控制连接发送终止命令。
TFTP
TFTP 基于 UDP,熟知端口 69,需自身实现差错改正。
主要特点:
- 数据 PDU 固定 512 字节(最后一块可不足)
- 块编号从 1 开始
- 支持 ASCII 或二进制
- 类似 停等协议:发完一块等待确认,超时重发
若文件长度恰为 512 字节整数倍,最后需发送一个仅含首部的空数据 PDU 作为结束标志。
NFS
NFS 允许远程打开文件并在特定位置读写,仅传输少量修改数据,而非整个文件。
远程终端协议
TELNET 与 NVT
TELNET 基于 TCP,实现本地终端到远地主机的透明登录。
网络虚拟终端 NVT:
- 客户将本地击键转换为 NVT 格式 送交服务器
- 服务器将 NVT 格式转换为远地系统格式
- 返回数据时反向转换
NVT 作为统一中间格式,屏蔽异构系统的差异。
超文本传输协议与万维网
URL
统一资源定位符 URL 格式:
<<协议>://<<主机>:<<端口>/<路径>
使用 HTTP 的 URL:
http://<<主机>:<<端口>/<路径>
HTTP
工作过程:
- 服务器进程持续监听 TCP 端口
80 - 浏览器建立 TCP 连接后发送请求
- 服务器返回响应页面
- 释放 TCP 连接
主要特点:
- 基于 TCP,本身 无连接(交换完报文即释放)
- HTTP 1.0 无状态(stateless)
- HTTP 1.1 使用 持续连接(persistent connection)
请求一个文档的时间:
一个 RTT 用于建立 TCP 连接,一个 RTT 用于请求与响应, 为传输文档时间。
持续连接的两种方式:
| 方式 | 机制 | 优点 | 缺点 |
|---|---|---|---|
| 非流水线 | 收到前一个响应后才能发下一个请求 | 省去一个 RTT | 服务器空闲,资源浪费 |
| 流水线 | 未收到响应即可连续发送请求 | 所有对象仅需约一个 RTT,效率高 | 需服务器支持连续响应 |
代理服务器(Web Cache):
- 代表浏览器发出 HTTP 请求
- 缓存近期请求与响应
- 命中时直接返回本地缓存,减少访问互联网时延
HTTP 报文结构:
请求报文:
┌─────────────────────────────────────────┐
│ 方法 空格 URL 空格 版本 │ ← 请求行
│ 首部字段名 : 值 │ ← 首部行
│ ... │
│ [实体主体] │
└─────────────────────────────────────────┘
响应报文:
┌─────────────────────────────────────────┐
│ 版本 空格 状态码 空格 短语 │ ← 状态行
│ 首部字段名 : 值 │
│ ... │
│ [实体主体] │
└─────────────────────────────────────────┘
状态码分类:
| 类别 | 含义 | 示例 |
|---|---|---|
| 1xx | 通知信息 | 请求收到,正在处理 |
| 2xx | 成功 | 接受、知道 |
| 3xx | 重定向 | 需进一步行动 |
| 4xx | 客户差错 | 语法错误、无法完成 |
| 5xx | 服务器差错 | 服务器失效 |
Cookie:
- 服务器为用户生成唯一识别码
- 在 HTTP 服务器与客户之间传递状态信息
- 用于跟踪用户在该网站的活动
万维网文档技术
| 技术 | 作用 | 说明 |
|---|---|---|
| HTML | 超文本标记语言 | 定义页面结构与超链,浏览器解释标签并排版 |
| XML | 可扩展标记语言 | 传输数据而非显示数据 |
| XHTML | 可扩展超文本标记语言 | 更严格的 HTML,作为 XML 应用 |
| CSS | 层叠样式表 | 定义 HTML 文档布局与格式 |
动态文档 vs 静态文档 vs 活动文档:
| 类型 | 内容生成位置 | 特点 | 技术 |
|---|---|---|---|
| 静态文档 | 服务器预先存放 | 内容不变 | 普通 HTML |
| 动态文档 | 服务器端运行时创建 | 由应用程序根据请求生成 | CGI |
| 活动文档 | 客户端运行 | 服务器返回程序副本,由浏览器执行 | Java Applet |
CGI(通用网关接口):
- 定义动态文档创建、输入数据提供、输出结果使用的标准
- CGI 程序(脚本)由解释程序执行,非直接编译运行
Java 技术:
- 源程序编译为与机器无关的 字节码(bytecode)
- 由浏览器中的 JVM 解释执行
- 保证活动文档跨平台一致性
信息检索与社交应用
| 类型 | 机制 | 代表 |
|---|---|---|
| 全文检索 | 爬虫采集+索引数据库查询 | Google、百度 |
| 分类目录 | 人工审核编辑关键词与描述 | 雅虎、新浪 |
| 垂直搜索 | 特定领域/人群/需求 | 行业搜索引擎 |
电子邮件
体系结构
电子邮件系统三大构件:
| 构件 | 功能 | 协议 |
|---|---|---|
| 用户代理 UA | 撰写、显示、处理、通信(客户端软件) | — |
| 邮件服务器 | 发送/接收邮件,报告传送状态 | SMTP / POP3 / IMAP |
| 协议 | 发送与读取规则 | SMTP(推)、POP3/IMAP(拉) |
邮件不会在互联网中的某个中间邮件服务器落地。
电子邮件地址格式:
SMTP
- 基于 TCP,熟知端口
25 - 客户-服务器方式,命令-响应交互
- 文本协议(ASCII 码)
通信三阶段:
- 连接建立:发送方 SMTP 客户与接收方 SMTP 服务器建立 TCP 连接,不使用中间服务器
- 邮件传送:信封 + 首部 + 主体
- 连接释放:邮件发送完毕后释放 TCP 连接
邮件内容首部字段:
To::收件人地址Subject::主题Cc::抄送From/Date:发信人地址与日期Reply-To:回信地址
邮件读取协议
| 特性 | POP3 | IMAP |
|---|---|---|
| 连接方式 | 基于 TCP | 基于 TCP |
| 操作模式 | 离线 | 联机 |
| 下载策略 | 下载全部邮件 | 先下载首部,支持部分读取 |
| 文件夹管理 | 仅在客户端 | 客户端与服务器同步 |
| 邮件搜索 | 不支持 | 支持 |
| 联网需求 | 读取后可离线 | 查阅邮件必须联网 |
MIME
SMTP 局限:限于 7 位 ASCII,不能传送二进制/可执行文件,拒绝过长邮件。
MIME 不取代 SMTP,而是扩展邮件主体结构,定义非 ASCII 码传送编码规则。
新增 5 个首部字段:
MIME-VersionContent-DescriptionContent-IdContent-Transfer-EncodingContent-Type
内容传送编码:
| 编码 | 说明 | 适用场景 |
|---|---|---|
7bit | 7 位 ASCII,每行 ≤1000 字符 | 缺省 |
8bit | 8 位非 ASCII,每行 ≤1000 字节 | 短非 ASCII 文本 |
Binary | 任意长度字节串 | 原始二进制 |
Base64 | 3 字节 → 4 字节 ASCII,开销 25% | 任意二进制/非文本 |
Quoted-printable | 非 ASCII 字节转为 =XX 形式,开销 200% | 少量非 ASCII 数据 |
MIME Content-Type(类型/子类型):
| 类型 | 子类型举例 | 说明 |
|---|---|---|
text | plain, html, xml | 文本 |
image | gif, jpeg | 静止图像 |
audio | basic, mpeg | 音频 |
video | mpeg, mp4 | 视频 |
application | octet-stream, pdf, zip | 应用程序数据 |
message | http, rfc822 | 封装报文 |
multipart | mixed, alternative | 多部分组合 |
基于万维网的电子邮件
- 用户代理通过 HTTP 与邮件服务器交互
- 邮件服务器之间仍使用 SMTP
- 无需本地安装专用邮件客户端
简单网络管理协议
网络管理模型
五大功能:
- 故障管理、配置管理、计费管理、性能管理、安全管理
主要构件:
| 构件 | 作用 | 运行程序 |
|---|---|---|
| 管理站(NOC) | 网络管理核心 | 管理程序(SNMP 客户) |
| 被管设备 | 网络元素/网元 | 代理程序(SNMP 服务器) |
| 委托代理 | 协议转换与过滤 | 管理非 SNMP 设备 |
SNMP 体系结构
SNMP 由三部分组成:
| 组成部分 | 作用 |
|---|---|
| SNMP | 定义管理站与代理间交换的分组格式(变量名及其状态值) |
| SMI | 定义命名对象、对象类型、编码规则,确保语法语义无二义性 |
| MIB | 在被管实体中创建命名对象并规定类型,管理程序通过 MIB 信息管理网络 |
SMI 与 ASN.1
SMI 使用 ASN.1(抽象语法记法 1)定义所有 MIB 变量。
数据类型:
| 分类 | 类型 | 含义 |
|---|---|---|
| 简单类型 | INTEGER | 任意长度整数 |
BIT STRING | 二进制串 | |
OCTET STRING | 字节串 | |
NULL | 空值 | |
OBJECT IDENTIFIER | 对象标识符 | |
| 结构化类型 | SEQUENCE | 多类型有序组合 |
SEQUENCE OF | 同类型有序组合 | |
CHOICE | 多选一 | |
ANY | 任意类型 |
BER(基本编码规则):采用 TLV 方法编码
┌─────┬─────┬─────┐
│ T │ L │ V │
└─────┴─────┴─────┘
- T(标记):定义数据类型
- L(长度):定义 V 字段长度(单字节或多字节)
- V(值):定义数据值,可嵌套其他 TLV
MIB
MIB 仅包含 SNMP 可管理的对象。节点 mib-2 包含的信息类别:
| 类别 | 标号 | 信息 |
|---|---|---|
system | (1) | 主机或路由器操作系统 |
interfaces | (2) | 网络接口 |
ip | (4) | IP 软件 |
icmp | (5) | ICMP 软件 |
tcp | (6) | TCP 软件 |
udp | (7) | UDP 软件 |
SNMP 操作与报文
两种基本功能:
- 读(
get):检测被管对象状况 - 写(
set):改变被管对象状况
探询(polling):管理进程定时向被管设备发送探询信息。
- 优点:系统简单,限制管理通信量
- 缺点:不够灵活,管理设备数受限,开销大
陷阱(trap):被管对象代理检测到事件达到门限值时,主动向管理进程报告。
- 优点:仅在严重事件时发送,信息简单、字节少
传输层:使用无连接的 UDP
- 代理端使用熟知端口
161接收 get/set 报文 - 管理端使用熟知端口
162接收 trap 报文
SNMPv1 PDU 类型:
| PDU 编号 | 名称 | 用途 |
|---|---|---|
A0 | GetRequest | 查询一个或一组变量值 |
A1 | GetNextRequest | 读取 MIB 树上下一个变量 |
A2 | Response | 代理或管理者发送响应 |
A3 | SetRequest | 设置一个或多个变量值 |
A5 | GetBulkRequest | 读取大数据块 |
A7 | SNMPv2Trap | 报告异常事件 |
P2P 应用
目录服务演进
| 代际 | 代表 | 目录机制 | 缺点 |
|---|---|---|---|
| 第一代 | Napster | 集中式目录服务器,文件传输分散 | 可靠性差,性能瓶颈 |
| 第二代 | Gnutella | 全分布式,洪泛法查询 | 查询流量大,定位准确性受限 |
| 第三代 | BitTorrent / DHT | 分布式散列表,结构化覆盖网络 | — |
BitTorrent
- 所有对等方集合称为 洪流(torrent)
- 数据单元为固定长度的 文件块(chunk)
- 追踪器(tracker):基础设施结点,提供对等方列表
数据策略:
- 最稀有优先(rarest first):优先请求在相邻对等方中副本最少的文件块
- 一报还一报(tit-for-tat):优先向当前以最高数据率向自己传送文件块的相邻对等方发送数据
P2P 文件分发时间下界:
设文件长度为 bit,主机数 ,服务器上传速率 ,各主机上传/下载速率 / ,,。
C/S 方式:
P2P 方式:
当 很大时,P2P 方式上限趋于 或 ,而 C/S 随 线性增长。
分布式散列表 DHT
- 利用散列函数将资源名 映射为 资源名标识符 KID,结点 IP 地址 映射为 结点标识符 NID
- 每个结点仅维护部分目录,任何结点可发起查询
Chord 环:
- 结点按标识符数值从小到大沿顺时针排列成环形覆盖网络
- 每个资源由 Chord 环上与其标识符值最接近的下一个结点提供服务
指针表(finger table)加速:
- 对于结点 ,第 行计算
- 查询时,在路由表中选择位于目标范围内的最大后继结点转发,将 的线性查找降为