Skip to content
NotesComputer Networking

自顶向下的计算机网络笔记,覆盖应用层、传输层与网络基础。

第二章:应用层

2.1 网络应用原理 (Principles of Network Applications)

2.1.1 网络应用程序体系结构

  • 创建网络应用: 编写在不同终端系统上通过网络通信的程序。
    • 架构解耦: 网络核心设备(如路由器、高度交换机)仅在网络层及以下工作,不运行用户应用代码。
    • 快速迭代: 在终端系统上实现快速应用开发和分发,无需干预复杂的网络核心设施。
  • 客户端-服务器体系结构 (Client-Server Architecture):
    • 服务器 (Server):
      • 始终在线 (Always-on) 以承载高并发请求。
      • 拥有永久、固定的公网 IP 地址。
      • 现代架构中常部署于数据中心 (Data Centers) 以实现海量扩展能力。
    • 客户端 (Clients):
      • 按需发起通信,并向服务器请求各类资源。
      • 连接模式灵活,允许间歇性连接或处于移动状态。
      • 通常拥有由 ISP(互联网服务商)分配的动态或私有 IP 地址。
      • 隔离性: 客户端之间彼此在逻辑上不直接进行数据交换。
    • 典型例子: 网页浏览 (HTTP), 邮件发送 (SMTP), 远程资源拉取 (FTP)。
  • P2P 体系结构 (P2P Architecture):
    • 核心特征: 无需固定中心服务器,端到端互联。
    • 自扩展性 (Self-scalability): 每个 Peer 在作为“下载者”获取资源的同时,也在作为“服务器”为全网贡献上传带宽。
    • 环境挑战: 极其分散的管理逻辑,必须应对极高的节点流失率 (Churn),节点上下线极为频繁。
    • 典型例子: 文件分发 (BitTorrent), 通讯工具 (Skype), 加速引擎 (迅雷)。

2.1.2 进程通信 (Process Communication)

  • 进程定义: 在端系统(主机)上具体运行的一个程序实例。
    • 内部通信: 同一主机内的进程通过 OS 的进程间通信 (IPC) 技术交换数据。
    • 外部通信: 跨主机的进程通过网络交换报文 (Messages) 实现协作。
  • 客户端 vs 服务器进程:
    • 客户端进程: 主动发起首个通信动作并建立连接。
    • 服务器进程: 被动地在端口监听并等待外部连接。
    • 注: P2P 软件中,一个实体通常同时运行着两种逻辑进程。
  • 套接字 (Sockets): 进程与传输控制协议之间的 API 接口。
    • 门语境: 进程将数据推向“门口”,由传输层在街道(网络)中投递。
    • 开发权重: 开发者全权管理应用层;对传输层仅有协议选择权及极少数参数微调权。

2.1.3 寻址与标识 (Addressing)

  • 唯一性: 必须确定目标主机的 IP 地址 (IP Address)
  • 精确性: 使用 端口号 (Port Number) 定位具体的活跃进程。
  • 常用端口速查表:
    协议服务常驻端口传输层基础
    HTTP (Web)80TCP
    HTTPS (Secure Web)443TCP
    SMTP (Email)25TCP
    DNS (Domain Name)53UDP / TCP
    FTP (File Transfer)20, 21TCP
    Telnet (Remote)23TCP

2.1.4 应用层对传输服务的要求

不同应用对核心指标的敏感度差异巨大:

  1. 数据完整性:
    • 要求严格: 文本传输、银行转账、电子邮件(不容许一个比特的偏差)。
    • 容忍度高: 视频聊天、在线直播(丢失画面中几个像素块并不影响主体体验)。
  2. 吞吐量 (带宽):
    • 带宽敏感: 4K 视频流、大规模数据同步。
    • 弹性带宽: 下载大文件、普通文本浏览(快慢皆可接受)。
  3. 定时 (延迟 & 抖动):
    • 极高要求: 电竞游戏(毫秒级的延迟决定胜负)、网络电话。
  4. 安全性: 现代应用基本都要求加密(TLS/SSL)与身份验证。

2.2 Web 和 HTTP

2.2.1 HTTP 基础知识

  • HTTP (HyperText Transfer Protocol): Web 系统的核心交互协议。
  • 无状态 (Stateless): 协议本身不记录用户之前的访问行为。
    • 原因: 简化服务器端逻辑,避免大规模分布式环境下的状态同步风暴和崩溃恢复开销。

2.2.2 HTTP 连接模式分析

  1. 非持久连接:
    • 每请求一个对象都开一个新的 TCP 连接。
    • RTT (Round Trip Time): 分组往返一周的时间。
    • 时间成本: 2×RTT+传输时间
  2. 持久连接 (HTTP/1.1+):
    • 连接开启后复用,极大提升响应速度。
    • 流水线 (Pipelining): 客户端可连续发送请求而无需等待响应回包。

2.2.3 状态管理详解:Cookies

Cookies 解决了“无状态”下的用户身份识别问题:

  1. Set-Cookie: 服务器在 Header 中通过此字段派发唯一标识。
  2. Client Cache: 浏览器在本地文件中持久化记录。
  3. Automatic Resend: 后续对该站点的所有请求都会自动携带该标识。
  4. Backend Auth: 服务器根据数据库查询出对应的购物车、搜索历史和登录信息。

2.2.4 Web 缓存与性能建模

  • 场景: 1.54 Mbps 的接入链路面临拥塞。
  • 分析: 接入链路上的队头阻塞是由于高利用率(0.97)引起的。
  • 缓存效应:
    • 假设缓存命中率 0.4。
    • 有效链路压力降至 0.6× 原始流量,利用率从 0.97 直降至 0.58。
    • 用户端感知的延迟从“分钟级”优化到“秒级”。

2.2.5 HTTP 响应码手册

状态吗消息名称具体含义解析
200OK请求成功,内容正在包体中。
301Moved Permanently域名/路径永久迁移,旧地址已作废。
304Not Modified条件 GET 专用:缓存内容仍有效,无需重传。
400Bad Request客户端格式错误,服务器无法解析。
404Not Found资源不存在,请检查 URL。
500Internal Server Error服务器程序崩溃或配置异常。
505HTTP Version Not Supported服务器不支持此 HTTP 版本。

2.3 电子邮件 (Electronic Mail)

2.3.1 邮件系统核心三大件

  1. 用户代理 (UA): 读写工具。
  2. 邮件服务器:
    • 信箱: 持久化存储接收到的邮件。
    • 队列: 负责重发和中间转发逻辑。
  3. SMTP: 定义服务器间交换邮件的规则。

2.3.2 SMTP 指令集 (RFC 5321)

交互遵循“三阶段”逻辑:

  • HELO: 会话开启自报家门。
  • MAIL FROM: 说明这封信谁写的。
  • RCPT TO: 说明这封信寄给谁。
  • DATA: 正文内容的开始引导符。
  • QUIT: 正常的礼貌下线退出。
  • 主要限制: 报文数据必须严格编码为 7 位 ASCII。

2.4 DNS (域名系统)

2.4.1 DNS 服务深度定义

  1. 翻译器: 主机名 IP 地址。
  2. 别名管理: Canonical Name 与 Alias 之间的映射。
  3. 邮件路由: 支撑邮件交换服务器 (MX) 的寻找。
  4. 流量均衡: 通过多重 IP 响应实现天然的负载均衡。

2.4.2 分层式数据库架构

  • 根服务器: 解析引导的北极星。
  • 顶级域 (TLD): 负责 .com, .net, .org, .edu, .cn
  • 权威服务器: 具体机构内部的最终裁定服务器。
  • 本地服务器: 用户第一站,缓存的真实前哨阵地。

2.4.3 DNS 报文首部详情 (12 字节)

  • Identification (16 bits): 给每个 Query 编号。
  • Flags:
    • QR: 0为查询,1为响应。
    • AA: 授权应答标志。
    • RD: 是否要求递归。
    • RA: 服务器是否支持递归。

2.4.4 DNS 资源记录 (RR) 类型

每一条 DNS 记录是一个:(Name, Value, Type, TTL)

  • A (Address): 基本映射,Name 为域名,Value 为 IP。
  • NS (Name Server): 指定管理该域的 DNS 服务器名称。
  • CNAME (Canonical): 别名,Value 为真实的全名。
  • MX (Mail Exchange): 与域名相关的邮件服务器。

2.5 P2P 体系深度剖析

2.5.1 数学推导:分发时间对比

  • C/S 时间推导: 取决于服务器依次传出 N 份文件的时间。DCSNF/us
  • P2P 时间推导: 随着 N 增长,N 个用户同时上传,系统总上行带宽 ui 变得巨大,分发时间几乎不随 N 线性增长。

2.5.2 BitTorrent 工作机制

  • Chucking: 文件切片颗粒度为 256KB。
  • Tracker: 类似于集群的“指挥部”。
  • Rarest First (最稀缺块优先): 优先下载网络中副本最少的块,防止文件因由于个别节点退出而“死亡”。
  • 博弈策略 (Tit-for-tat):
    • Choked/Unchoked: 根据对方贡献的上传速度决定是否也向对方上传。
    • Optimistic Unchoking: 每 30s 随机解除 1 个对等方的阻塞,用于探索更优质的连接对。

2.6 视频流与内容分发网络 (CDNs)

2.6.1 方案演进:DASH (Dynamic, Adaptive Streaming over HTTP)

  • 思想: 将视频拆分为块,每个块以不同码率编码存储。
  • 清单文件 (Manifest): 记录了各码率块的 URL 模板。
    • 客户端算法: 自动根据下行链路实时带宽,平滑切换视频分辨率(如 4K 转 1080P),优先保证播放不卡顿。

2.6.2 CDN 案例:Akamai 关键指标

  • 部署规模: 在 130 多个国家的 1,350 多个网络中部署。
  • 数据平面: 处理每日超过 7 万亿次投递,峰值带宽 250+ Tbps。

2.6.3 Netflix 混合云架构

  • 控制平面 (AWS): 运行在公有云上,负责处理注册、搜索、智能推荐逻辑。
  • 数据平面 (OpenConnect): 在物理上极其靠近用户的端点部署自家的视频缓存节点,负责核心的位流投递。

2.7 套接字编程 (Socket Programming)

2.7.1 UDP 编程详析 (Python)

客户端 (发送不保证送达):

python
from socket import *
# AF_INET 表示 IPv4, SOCK_DGRAM 表示 UDP 数据报
client = socket(AF_INET, SOCK_DGRAM)
# 不需要建立连接,sendto 需显式传地址
client.sendto(b"hi", ("127.0.0.1", 12000))
# recvfrom 会接收到数据及其来源
data, addr = client.recvfrom(2048)
client.close()

2.7.2 TCP 编程详析 (Python)

服务器 (双级套接字模型):

python
from socket import *
# AF_INET 表示 IPv4, SOCK_STREAM 表示 TCP 流
welcomeSocket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
welcomeSocket.bind(('', 12000))
# 开始监听 (Queue 大小为 1)
welcomeSocket.listen(1)
while True:
    # accept 是阻塞的,成功握手后返回新的通话套接字
    conn, addr = welcomeSocket.accept()
    # 在专属连接中读取字节流
    raw = conn.recv(1024)
    # 处理并发送
    conn.send(raw.upper())
    # 关闭当前会话连接,welcomeSocket 继续访问监听
    conn.close()

计算机网络同步笔记 - 应用层全面总结(第 8 版内容)修订人:Antigravity状态:已完成

2.8 核心复习要点与问答 (Review Questions)

Q1: 解释为何 HTTP、FTP、SMTP 运行在 TCP 之上而非 UDP?

  • 可靠性需求: Web 浏览、文件传输和点点邮件都需要 100% 的数据准确性。丢弃任何一个比特都可能导致 HTML 无法渲染、执行文件损坏或测试错乱。
  • 流控制: TCP 的拥塞控制能够防止因应用速度过快导致的网络瘫痪。

Q2: 既然 HTTP 是无状态的,Web 站点如何实现“记住我”的功能?

  • 通过 Cookies。服务器下发一个唯一标识 ID 给浏览器,浏览器后续请求自动带上,服务器查库即可识别。

Q3: DNS 在解析过程中为什么要优先使用 UDP?

  • 低延迟优先: DNS 的单次查询响应报文通常很小。使用 UDP 可以省去三次握手的 RTT,让网页加载的第一阶段(域名解析)尽可能快。
  • 性能考量: 53 端口每秒需处理成千上万请求,UDP 无状态特性大幅降低了服务器的 CPU/内存压力。

Q4: BitTorrent 里的“最稀缺优先”策略意义何在?

  • 如果一个冷门的块只有少数节点拥有,一旦这些节点离线,该块就会在网络中消失导致整个文件坏死。优先下载稀缺块能增加该块在群体中的副本总数,提高系统的鲁棒性。

Q5: 什么是域名服务器的迭代查询与递归查询?其对服务器负荷有何不同影响?

  • 递归查询: 核心服务器(如根)代为查询,负荷极大,因此现实中根服务器通常配置为只接受迭代查询。
  • 迭代查询: 发起者自己逐步寻找,核心服务器只给线索。

2.9 实验案例:使用 Telnet/NC 探测应用层报文

2.9.1 获取 index.html 原始流

  1. 打开终端执行: telnet gaia.cs.umass.edu 80
  2. 建立连接后立即输入:
    text
    GET /kurose_ross/interactive/index.php HTTP/1.1
    Host: gaia.cs.umass.edu
    (连续两次回车)
  3. 观察状态行 HTTP/1.1 200 OK 以及各首部字段的实时反馈。

2.9.2 测试 SMTP 握手

  1. 执行: telnet mail_server_ip 25
  2. 响应: 220 ... ESMTP
  3. 键入: HELO mydomain.com
  4. 响应: 250 OK

2.10 应用层协议汇总表

协议全称默认端口传输层典型特征
HTTPHyperText Transfer Protocol80TCP无状态、持久/非持久、请求/响应
HTTPSHTTP over SSL/TLS443TCP加密、身份验证、更安全
FTPFile Transfer Protocol20, 21TCP控制/数据连接分离、有状态
SMTPSimple Mail Transfer Protocol25TCP通文本、推送型、持久连接
POP3Post Office Protocol v3110TCP离线阅读、拉取型、简单
IMAPInternet Mail Access Protocol143TCP远程同步、文件夹管理、多端
DNSDomain Name System53UDP层次化、分布式、资源记录 (RR)
DHCPDynamic Host Config Protocol67, 68UDP自动获取 IP、子网掩码、网关
TELNETRemote Terminal Protocol23TCP远程登录、明文传输 (不安全)
SSHSecure Shell22TCP加密远程登录、执行命令

全章知识点已通过教科书级别细化补充完毕。

附录 A:全流程综合场景演练 (Comprehensive Scenario Walkthrough)

为了更好地理解应用层协议的协同工作,我们模拟一个用户在浏览器输入 http://www.netflix.com 并播放一段视频的完整过程:

第一阶段:域名解析 (DNS Phase)

  1. 用户操作: 在地址栏键入 URL。
  2. 本地查询: 浏览器首先检查本地缓存。未命中后,向本地域名服务器 (LDNS) 发送递归查询请求。
  3. 层次解析: LDNS 代理用户,先后询问根服务器(获取 .com TLD 地址)、TLD 服务器(获取 netflix.com 权威 DNS 地址)。
  4. 最终映射: 权威 DNS 返回 Netflix Web 服务器的 A 记录(IP 地址)。
  5. 结果返回: LDNS 将 IP 返回给浏览器,并存入本地缓存。

第二阶段:Web 页面加载 (HTTP Phase)

  1. TCP 三路握手: 浏览器向目标 IP 的 80 端口发起 TCP 连接。
  2. 发送请求: 浏览器发送 GET / HTTP/1.1 请求,首部含 Host: www.netflix.comCookie: UserID=9876(若之前访问过)。
  3. 服务器响应: Web 服务器根据 Cookie 识别用户,返回 200 OK 及主页 HTML。
  4. 渲染与解析: 浏览器解析 HTML,发现内含 20 个图片和脚本引用。
  5. 开启持久连接: 浏览器利用现有的 TCP 连接,通过流水线 (Pipelining) 方式一次性发送 20 个对象的 GET 请求,避免了 20 次 TCP 开销。

第三阶段:视频分发与 DASH 播放 (Streaming Phase)

  1. 加载清单: 用户点击播放,浏览器请求 .mpd (Manifest) 文件。
  2. CDN 重定向: Netflix 的 DNS 系统发现用户来自北京,通过 CNAME 记录将请求导向距离用户最近的 OpenConnect 缓存节点 IP。
  3. 码率自适应:
    • 第 0-2 秒: 浏览器探测带宽为 2Mbps,请求 480P 分块。
    • 第 2-5 秒: 缓冲区充裕且带宽升至 10Mbps,浏览器通过 DASH 逻辑自动切换为 4K 分块。
  4. 播放缓冲: 播放器维持一个 10 秒的预加载缓冲区,以补偿网络抖动 (Jitter)

第四阶段:通信结束 (Closure Phase)

  1. 维持状态: 浏览器更新本地 Cookie,记录播放进度。
  2. 释放连接: 若长时间无活动,TCP 连接超时关闭。

计算机网络应用层 - 终极复习手册