应用层协议原理

  1. 研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序
  2. 即将应用软件限制在端系统的方法.促进了大量的网络应用程序的迅速研发和部署

互联网应用程序体系结构

  1. 从应用程序研发者角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合
  2. 应用程序体系结构 (application architecture) :由应用程序研发者设计,规定了如何在各端系统上组织该应用程序

客户-服务器 (client-server)

  1. 总是打开的主机——服务器,它服务于来自许多其他称为客户的主机的请求
  2. 服务器具有固定周知的 IP 地址
  3. 著名应用程序
    1. Web
    2. FTP
    3. Telnet
    4. 电子邮件
  4. 配备大量主机的数据中心 (data center) 常被用于创建强大的虚拟服务器

P2P

  1. 应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方,这些对等方并不为服务提供商所有
  2. 具有自扩展性: 每个对等方都由于请求文件产生工作负载,但通过向其他对等方分发文件为系统增加服务能力

进程通信

Pasted image 20231023191228.png

  1. 进程 (process): In computing, a process is the instance of a computer program that is being excuted by one or many threads.) 是运行在端系统上的程序,当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信
  2. 不同端系统上的进程,通过跨越计算机交换报文 (message) 而相互通信

客户和服务器进程

  1. 在一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器。

进程和计算机网络间的接口

  1. 进程通过称为套接字 (socket) 的软件接口向网络发送报文和从网络接收报文
    1. 套接是同一台主机内应用层与运输层之间的接口
    2. 由于该套接字是建网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口 (Application Programming Interface, API)
  2. 应用程序开发者对运输层的控制仅限于于
    1. 选择运输层协议
    2. 设定几个参数,如最大缓存和最大报文长度等

进程寻址

  1. 为了标识接受进程,需要定义两种信息
    1. 主机的地址
    2. 在目的主机中指定接收进程的标识符 (目的地端口号)

可供应用程序使用的运输服务

  1. 通过研究可用的运输层协议提供的服务,选择一个最能为应用需求提供恰当服务的协议
  2. 按照应用程序服务要求分类
    1. 可靠数据传输
    2. 吞吐量
    3. 定时
    4. 安全性

可靠数据传输

  1. 如果一个协议提供了确保由应用程序的一端发送的数据正确、完全地交付给该应用程序的另一端的数据交付服务,就认为提供了可靠数据传输服务 (reliable data transfer)
  2. 运输层协议向应用程序提供的一个重要服务是进程到进程的可靠数据传输
  3. 容忍丢失的应用 (loss-tolerant application): 使用的运输层协议不提供可靠数据传输,发送进程的数据可能

吞吐量

  1. 可用吞吐量:发送进程能够向接收进程交付比特的速率
  2. 产生了一种能够以某种特定的速率提供确保的可用吞吐量的运输层协议,适用于带宽敏感的应用
  3. 带宽敏感的应用 (bandwidth-sensitive application):具有吞吐量要求的应用程序
  4. 弹性应用(elastic application):能够根据当时可用带宽或多或少地利用可供使用的吞吐量

定时

  1. 对于交互式实时应用程序有吸引力,如因特网电话、虚拟环境、电话会议和多方游戏
  2. 定时保证:发送方注入套接字的每个比特到达接收方的套接字不迟于特定时间限制

安全性

  1. 运输协议能够为应用程序提供一种或多种安全性服务
  2. 发送主机中运输协议能够加密发送进程传输的所有数据
  3. 接收主机中运输层协议能够将数据交付给接收进程前解密这些数据
  4. 运输层协议能够提供机密性、数据完整性和端点鉴别等安全性服务

因特网提供的运输服务

  1. 因特网为应用程序提供了两个运输层协议,即 UDP 和 TCP

TCP 服务

  1. TCP 服务模型包括面向连接服务可靠数据传输服务
  2. 面向连接的服务:
    1. 握手过程:在应用层数据报文开始流动之前,TCP 让客户和服务器互相交换运输层控制信息
    2. 握手阶段后,两个进程的套接字之间建立一个 全双工 的 TCP 连接 (TCP connection),当应用程序结束报文发送时,必须拆除该连接
  3. 可靠的数据传送服务:
    Pasted image 20231031150119.png
    1. 通信进程能够依靠 TCP,无差错、按适当顺序交付所有发送的数据
  4. 拥塞控制机制
  5. TCP 安全
    1. 安全套接字层 (Secure Sockets Layer,SSL):经过 SSL 增强的传输控制协议(TCP)不仅具备传统 TCP 的功能,而且还提供了关键的进程到进程安全性服务,包括加密、数据完整性和端点鉴别
    2. SSL 在应用层上实现

UDP 服务

  1. UDP 无连接没有握手过程,没有拥塞控制机制,UDP 协议提供不可靠的数据传送服务
    Pasted image 20231031152513.png

因特网运输协议所不提供的服务

  1. 今天的因特网通常能够为时间敏感应用提供满意的服务,但它不能提供任何定时或带宽保证

应用层协议

  1. 应用层协议 (application-layer protocol) 定义了运行在不同端系统上的应用程序进程如何相互传递报文
  2. 应用层协议定义了:
    1. 交换的报文类型
    2. 各种报文类型的语法
    3. 字段的语义
    4. 确定一个进程何时以及如何发送报文,对报文进行响应的规则
  3. 应用层协议分为定义在公共域中的协议和专用的协议
  4. 应用层协议只是网络应用的重要部分
    network-protocol.gif

Web 和 HTTP

  1. 万维网 (World Wide Web)是一个因特网应用,其使用的应用层协议是超文本传输协议(HyperText Transfer Protocol, HTTP) RFC 1945 RFC 2616
  2. Web 具有按需操作,获取信息便捷等特点
  3. Web 页面由对象 (object) 组成,一个对象是一个文件,多数 Web 页面含有一个 HTML 基本文件以及几个引用对象
  4. White 的静态博客的文件结构(入口是 index.html)
    Pasted image 20231031154854.png
  5. URL 地址由存放对象的服务器主机名对象的路径名组成

HTTP 概况

  1. HTTP 定义了 Web 客户向 Web 服务器请求 Web 页面的方式,以及服务器向客户传送 Web 页面的方式
  2. HTTP 使用 TCP 作为它的支撑运输协议
  3. HTTP 不保存关于客户的任何信息,所以 HTTP 是一个无状态协议(stateless protocol)

非持续连接和持续连接

  1. 根据每个请求/相应对经一个单独的 TCP 连接发送还是经相同的 TCP 连接发送划分
  2. 非持续连接 (non-persistent connection):Pasted image 20231031163253.png Pasted image 20231031164531.png Pasted image 20231031163437.png Pasted image 20231031163454.png 针对不同的 HostName 建立了两个并行的 TCP 连接 (Q: 怎么通过工具观察图 2 和图 3 的两个连接是否是持续的)
    1. 用户可以配置现代浏览器来控制连接的并行度
    2. 往返时间(Round-Trip Time, RTT):
      1. 一个短分组从客户到服务器然后再返回客户所花费的时间。
      2. RTT 包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延
      3. 点击超链接引起浏览器和 Web 服务器间发起一个 TCP 连接,涉及一次"三次握手"的过程 Pasted image 20231031165751.png
      4. 总的响应时间是两个 RTT 加上服务器传输(?) HTML 文件的时间
    3. 缺点:
      1. 必须为每一个请求的对象建立和维护一个全新的连接
      2. 每一个对象经受两倍 RTT 的交付时延
  3. 持续连接(persistent connection)
    1. 在采用 HTTP1.1 持续连接的情况下,服务器在发送响应后保持 TCP 连接打开,在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送 Pasted image 20231031171140.png

HTTP 报文格式

  1. 对 HTTP 报文格式的定义:RFC 1945 RFC 2616 RFC 7540

HTTP 请求报文

GET / HTTP/1.1
Host: cnhktrz3k5nc.hack-challenge.lug.ustc.edu.cn:13202
Cookie: session=eyJ0b2tlbiI6IjU2ODpNRVVDSVFEOUtzZWdBT2c5ZE9jdGkzUmJPSUVTSTdSTWQ5cDRQaW8vdWNxTXY3V0dhUUlnR0dIMHVROHhISWI4SzBNT2lidlFjVk0xaGoxZEdQZGNOYkpGbXJyZE45az0ifQ.ZUGxTw.PrwGL6P9rTzYpTfdu21r7irxBjQ
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close


----------------------------------------------------------
🌟 加上不显示的回车和换行符后,报文中的空格也是真实存在的 (感谢ChatGPT的帮助)
GET / HTTP/1.1\r\n
Host: cnhktrz3k5nc.hack-challenge.lug.ustc.edu.cn:13202\r\n
Cookie: session=eyJ0b2tlbiI6IjU2ODpNRVVDSVFEOUtzZWdBT2c5ZE9jdGkzUmJPSUVTSTdSTWQ5cDRQaW8vdWNxTXY3V0dhUUlnR0dIMHVROHhISWI4SzBNT2lidlFjVk0xaGoxZEdQZGNOYkpGbXJyZE45az0ifQ.ZUGxTw.PrwGL6P9rTzYpTfdu21r7irxBjQ\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Accept-Encoding: gzip, deflate\r\n
Upgrade-Insecure-Requests: 1\r\n
Sec-Fetch-Dest: document\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-Site: none\r\n
Sec-Fetch-User: ?1\r\n
Te: trailers\r\n
Connection: close\r\n\r\n 🌟 在表面上看来末尾有两个空行
🌟 使用ASCII编码转换为16进制,数据被注入套接字后穿过传输层、网络层、数据链路层、物理层(中间存在分组(?)等情况)以比特流的形式经过网络基础设施

G  E  T  SP /  SP H  T  T  P  /  1  .  1  CR LF ...
47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 63 6e 68 6b 74 72 7a 33 6b 35 6e 63 2e 68 61 63 6b 2d 63 68 61 6c 6c 65 6e 67 65 2e 6c 75 67 2e 75 73 74 63 2e 65 64 75 2e 63 6e 3a 31 33 32 30 32 0d 0a 43 6f 6f 6b 69 65 3a 20 73 65 73 73 69 6f 6e 3d 65 79 4a 30 62 32 74 6c 62 69 49 36 49 6a 55 32 4f 44 70 4e 52 56 56 44 53 56 46 45 4f 55 74 7a 5a 57 64 42 54 32 63 35 5a 45 39 6a 64 47 6b 7a 55 6d 4a 50 53 55 56 54 53 54 64 53 54 57 51 35 63 44 52 51 61 57 38 76 64 57 4e 78 54 58 59 33 56 30 64 68 55 55 6c 6e 52 30 64 49 4d 48 56 52 4f 48 68 49 53 57 49 34 53 7a 42 4e 54 32 6c 69 64 6c 46 6a 56 6b 30 78 61 47 6f 78 5a 45 64 51 5a 47 4e 4f 59 6b 70 47 62 58 4a 79 5a 45 34 35 61 7a 30 69 66 51 2e 5a 55 47 78 54 77 2e 50 72 77 47 4c 36 50 39 72 54 7a 59 70 54 66 64 75 32 31 72 37 69 72 78 42 6a 51 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28 4d 61 63 69 6e 74 6f 73 68 3b 20 49 6e 74 65 6c 20 4d 61 63 20 4f 53 20 58 20 31 30 2e 31 35 3b 20 72 76 3a 31 30 39 2e 30 29 20 47 65 63 6b 6f 2f 32 30 31 30 30 31 30 31 20 46 69 72 65 66 6f 78 2f 31 31 38 2e 30 0d 0a 41 63 63 65 70 74 3a 20 74 65 78 74 2f 68 74 6d 6c 2c 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 68 74 6d 6c 2b 78 6d 6c 2c 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 6d 6c 3b 71 3d 30 2e 39 2c 69 6d 61 67 65 2f 61 76 69 66 2c 69 6d 61 67 65 2f 77 65 62 70 2c 2a 2f 2a 3b 71 3d 30 2e 38 0d 0a 41 63 63 65 70 74 2d 4c 61 6e 67 75 61 67 65 3a 20 65 6e 2d 55 53 2c 65 6e 3b 71 3d 30 2e 35 0d 0a 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a 69 70 2c 20 64 65 66 6c 61 74 65 0d 0a 55 70 67 72 61 64 65 2d 49 6e 73 65 63 75 72 65 2d 52 65 71 75 65 73 74 73 3a 20 31 0d 0a 53 65 63 2d 46 65 74 63 68 2d 44 65 73 74 3a 20 64 6f 63 75 6d 65 6e 74 0d 0a 53 65 63 2d 46 65 74 63 68 2d 4d 6f 64 65 3a 20 6e 61 76 69 67 61 74 65 0d 0a 53 65 63 2d 46 65 74 63 68 2d 53 69 74 65 3a 20 6e 6f 6e 65 0d 0a 53 65 63 2d 46 65 74 63 68 2d 55 73 65 72 3a 20 3f 31 0d 0a 54 65 3a 20 74 72 61 69 6c 65 72 73 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 0d 0a 0d 0a
  1. 一个简单 (大嘘,对我来说很复杂了) 的 HTTP 请求报文 (来自 USTC Hackergame 2023),作为运输层的载荷被注入套接字
    1. 由普通的 ASCII 文本书写
    2. 请求行 (第一行)
      1. 方法字段
      2. URL 字段
      3. HTTP 版本字段
    3. 首部行 (后继行)
GET / HTTP/1.1
Host: cnhktrz3k5nc.hack-challenge.lug.ustc.edu.cn:13202 🌟 Web代理高速缓存要求
Cookie: session=eyJ0b2tlbiI6IjU2ODpNRVVDSVFEOUtzZWdBT2c5ZE9jdGkzUmJPSUVTSTdSTWQ5cDRQaW8vdWNxTXY3V0dhUUlnR0dIMHVROHhISWI4SzBNT2lidlFjVk0xaGoxZEdQZGNOYkpGbXJyZE45az0ifQ.ZUGxTw.PrwGL6P9rTzYpTfdu21r7irxBjQ
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0 🌟 用户代理/向服务器发送请求的浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5 🌟 表示用户想获得网页的语言版本
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close 🌟 不需要使用持续连接,发送完请求的对象后就关闭这条连接

请求报文的通用格式

Pasted image 20231101133831.png

  1. 在首部行后有实体体,当使用 GET 方法时实体体为空,使用 POST 方法时才使用实体体
  • 一段 POST 报文
POST / HTTP/1.1
Host: 202.38.93.111:12345
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest 🌟 通常被用于识别AJAX(Asynchronous JavaScript and XML)请求
Content-Length: 48 🌟 说明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目
Origin: http://202.38.93.111:12345
Connection: close
Referer: http://202.38.93.111:12345/
Cookie: session=eyJ0b2tlbiI6IjU2ODpNRVVDSVFEOUtzZWdBT2c5ZE9jdGkzUmJPSUVTSTdSTWQ5cDRQaW8vdWNxTXY3V0dhUUlnR0dIMHVROHhISWI4SzBNT2lidlFjVk0xaGoxZEdQZGNOYkpGbXJyZE45az0ifQ.ZUHm-g.kVPjkYgY94gYkzV03PmLKCKWuhI

QW5zd2VyMT0yMDIzLTA4LTEwJkFuc3dlcjI9SUNSUg==.txt 🌟 实体体
  • 服务器收到 HEAD 方法,用一个 HTTP 报文进行相应但不返回请求对象
HEAD / HTTP/2
Host: cnhktrz3k5nc.hack-challenge.lug.ustc.edu.cn:13202
Cookie: session=eyJ0b2tlbiI6IjU2ODpNRVVDSVFEOUtzZWdBT2c5ZE9jdGkzUmJPSUVTSTdSTWQ5cDRQaW8vdWNxTXY3V0dhUUlnR0dIMHVROHhISWI4SzBNT2lidlFjVk0xaGoxZEdQZGNOYkpGbXJyZE45az0ifQ.ZUGxTw.PrwGL6P9rTzYpTfdu21r7irxBjQ
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers


HTTP/2 200 OK
Server: nginx
Date: Wed, 01 Nov 2023 05:39:21 GMT
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Vary: Cookie
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Permissions-Policy: interest-cohort=()


  • PUT 方法用于上传对象到 Web 服务器上的指定路径
PUT /echo/put/json HTTP/1.1
Host: reqbin.com
Content-Type: application/json
Content-Length: 80

{
  "Id": 12345,
  "Customer": "John Smith",
  "Quantity": 1,
  "Price": 10.00
}
  • DELETE 方法删除 Web 服务器上的对象
DELETE /echo/delete/json HTTP/1.1
Host: reqbin.com
Accept: */*
Authorization: Bearer mt0dgHmLJMVQhvjpNXDyA83vA_PxH23Y

HTTP 响应报文

  1. 这是一段 HTTP 响应报文
HTTP/1.1 200 OK 🌟 协议版本 状态码 状态信息
Server: nginx
Content-Length: 90
Via: 1.1 google
Date: Tue, 31 Oct 2023 19:59:05 GMT 🌟 响应生成的时间
Age: 36693
Content-Type: text/html 🌟 实体体中的对象类型
Cache-Control: public,must-revalidate,max-age=0,s-maxage=3600
Connection: close 🌟 发送完报文后就关闭TCP连接

<meta http-equiv="refresh" content="0;url=https://support.mozilla.org/kb/captive-portal"/>
  1. 报文有三个部分
    1. 状态行 (status line)
      1. 协议版本
      2. 状态码
      3. 状态信息
    2. 首部行 (header line)
    3. 实体体 (entity body)
  2. 状态码和状态信息
  1. HTTP 服务器无状态,Web 服务器为了跟踪用户使用 cookie 技术
  2. Cookie 技术的组件
    1. 响应报文中的 cookie 首部行
    2. 请求报文中的 cookie 首部行
    3. 用户端系统浏览器管理的 cookie 文件 (macOS 保存在 ~/Library/Application Support/Google/Chrome/Default/Cookies 路径下)
    4. 位于 Web 站点的后端数据库
  3. cookie 在无状态的 HTTP 之上建立了一个用户会话层

Web 缓存

  1. Web 缓存器 (Web cache) / 代理服务器 (proxy server):能够代表初始 Web 服务器来满足 HTTP 请求的网络实体
    1. 正向代理:代理服务器靠近客户端并代表客户端发送请求
    2. 反向代理:当客户端将请求发送到网站的源服务器时,反向代理服务器会在网络边缘拦截这些请求。然后,反向代理服务器将向源服务器发送请求并从源服务器接收响应。
  2. Web 缓存器的优点
    1. 减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与 Web 缓存器之间的瓶颈带宽时
    2. 大大减少一个机构的接入到因特网的通信量
    3. 大大减低因特网上的 Web 流量

减少机构的接入到因特网的通信量的例子

h500 h500

  1. 条件:假设对象的平均长度为 1Mb ,机构内的浏览器对初试服务器的平均访问速率为每秒 15 个请求,假设 HTTP 请求报文小到可以忽略,主要关注 HTTP 响应报文
  2. 第一种情况下:
    1. 局域网上的 流量强度:(15 个请求 /s) x (1 Mb / 请求) / (100Mbps) = 0.15
    2. 接入链路上的流量强度:(15 个请求 /s) x (1 Mb / 请求) / (15 Mbps) = 1
  3. 优化方案:
    1. 将接入链路从 15Mbps 升级为 100Mbps
    2. 在机构网络中安装一个 Web 缓存器
  4. 在安装 Web 缓存器的情况下
    1. 假设该机构的缓存命中率为 0.4,40%的请求命中缓存响应在 10ms 内,剩下 60%需要请求初始服务器,平均时延为 0.4 x ( 0.010 s ) + 0.6 x (2.01 s) = 1.21 s
    2. 接入链路上的流量强度下降为:(15 个请求 /s) x (1 Mb / 请求) x 0.6 / (15 Mbps) = 0.6
  5. 通过使用内容分发网络(Content Distribution Network, CDN),Web 缓存器在因特网上发挥着越来越重要的作用

条件请求

  1. 条件 GET (conditional GET) 方法:
    1. 请求报文使用 GET 方法
    2. 请求报文中包含一个 "If-Modified-Since: " 首部行 (?)
  2. 条件请求:请求的执行结果会因特定首部的值不同而不同
  3. 验证器:
    1. last-modified:文件的最后修改时间
    2. etag:可以用于提供资源或其衍生品的 MD5 散列值
  4. 检查类型:HTTP 协议默认使用强验证类型
    1. 强验证类型
    2. 弱验证类型
  5. 条件首部:
    1. If-Match
    2. If-None-Match
    3. If-Modified-Since:如果远端资源的 Last-Modified 首部标识的日期比在该首部中列出的值要更晚,表示条件匹配成功。
    4. If-Unmodified-Since
    5. If-Range
  6. 缓存更新
    1. 当缓存为空或者无缓存时,被请求资源通过状态码为 200 OK 的 HTTP 响应报文返回 Pasted image 20231102100948.png
    2. 验证器首部行也随着资源在 HTTP 响应中返回,和资源一起被缓存起来
    3. Cache-Control 首部控制缓存是否失效,一旦失效客户端就发起条件请求否则使用缓存值,验证器的值会用作条件请求中 If-Modified-Since 和 If-Match 首部字段的参数
    4. 如果资源未发生变化,服务器返回状态码为 304 Not Modified 的响应Pasted image 20231102103202.png
    5. 如果资源发生变化,服务器返回 200 OK 响应码,连同新版本的资源,再次回到步骤 2 Pasted image 20231102103136.png

Email

Pasted image 20231103092045.png

  1. 组成部分:
    1. 用户代理 (user agent):Outlook, Apple Mail
    2. 邮件服务器 (mail server)
    3. 简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)
    4. 邮件访问协议 (mail access protocol)
  2. 一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中
  3. 如果邮件服务器客户端不能把邮件交付给接收方,则会在报文队列(message queue)中保持该报文并在以后尝试发送,如果一段时间后仍不成功,则客户端删除报文并以电子邮件形式通知发送方

简单邮件传输协议

  1. 不妨试着运行一个简单的 SMTP 服务器并且用 telnet 交互
import smtpd
import asyncore

class CustomSMTPServer(smtpd.SMTPServer):
    def process_message(self, peer, mailfrom, rcpttos, data):
        print('Received message from:', peer)
        print('Message addressed from:', mailfrom)
        print('Message addressed to  :', rcpttos)
        print('Message length        :', len(data))
        print('Data:')
        print(data)

server = CustomSMTPServer(('0.0.0.0', 25), None)

try:
    asyncore.loop()
except KeyboardInterrupt:
    server.close()
> telnet localhost 25
  1. 这是一段 SMTP 客户端和 SMTP 服务端交互案例
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: `From: "Bob Example" <[email protected]>`
C: `To: "Alice Example" <[email protected]>`
C: `Cc: [email protected]`
C: `Date: Tue, 15 Jan 2008 16:02:43 -0500`
C: `Subject: Test message`
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye
{The server closes the connection}
  • HELO/EHLO:这些命令发出 “Hello” 并在客户端和服务器之间启动 SMTP 连接。“HELO” 是该命令的基本版本;“EHLO” 用于一种特别类型的 SMTP。
  • MAIL FROM:这个命令告诉服务器谁在发送该电子邮件。如果 Alice 试图给她的朋友 Bob 发电子邮件,客户端可能会发送 “MAIL FROM:[email protected]”。
  • RCPT TO:这个命令用于列出电子邮件的收件人。如果有**多个收件人,客户端可多次发送该命令。如上例子中,Alice 的电子邮件客户端将发送: “RCPT TO: [email protected]"。
  • DATA:这个命令放在电子邮件的内容前,DATA 中的内容 (邮件报文格式)由 RFC 5322 - Internet Message Format 规定,并以 <CR><LF>.<CR><LF> 结尾
  • RSET:该命令重置连接,删除所有以前传输的信息,但不关闭 SMTP 连接。RSET 在客户端发送了错误信息的情况下使用。
  • QUIT:结束连接。

HTTP 主要是一个拉协议 (pull protocol),SMTP 主要是一个推协议 (push protocol),可以想象一下木板和绳子的不同之处。一块木板可将某物向前推,但不能将它拉回来。绳子可以拉动某物,但不能推动它。SMTP 将电子邮件“推”到邮件服务器,而 HTTP 将 Web 对象“拉”到用户的应用程序中

邮件访问协议

  1. 流行的邮件访问协议包括第三版的邮局协议 ( Post Office Protocol—Version 3, POP3 ) 、因特网邮件访问协议 ( Internet Mail Access Protocol, IMAP) 以及 HTTP
  2. IMAP 和 POP3 的区别:
IMAP POP 3
用户可以从任何设备上访问他们的电子邮件。 默认情况下,只能从下载邮件的设备上访问电子邮件。
服务器存储电子邮件;IMAP 充当服务器和客户端之间的中介。 若非另有配置,下载后,电子邮件就会从服务器上删除。
电子邮件不能离线访问。 电子邮件可以离线访问,但只能在其下载的设备上访问。
在用户点击之前,不会下载电子邮件的正文,但主题行和发件人姓名会迅速在电子邮件客户端弹出。 默认情况下,电子邮件会被下载到设备上,所以可能需要更长的时间来加载邮件内容。
IMAP 需要更多的服务器空间,因为电子邮件不会从服务器上自动删除。 POP 3 节省了电子邮件服务器的存储空间,因为电子邮件会自动从服务器中删除。

POP3

  1. 工作阶段
    1. 特许 (authorization)
    2. 事务处理
    3. 更新
  2. 下面是一段 POP3 交互案例
S: <wait for connection on TCP port 110>
C: <open connection>
S:    +OK POP3 server ready <[email protected]>
C:    APOP mrose c4c9334bac560ecc979e58001b3e22fb
S:    +OK mrose's maildrop has 2 messages (320 octets)
C:    STAT
S:    +OK 2 320
C:    LIST
S:    +OK 2 messages (320 octets)
S:    1 120
S:    2 200
S:    .
C:    RETR 1
S:    +OK 120 octets
S:    <the POP3 server sends message 1>
S:    .
C:    DELE 1
S:    +OK message 1 deleted
C:    RETR 2
S:    +OK 200 octets
S:    <the POP3 server sends message 2>
S:    .
C:    DELE 2
S:    +OK message 2 deleted
C:    QUIT
S:    +OK dewey POP3 server signing off (maildrop empty)
C: <close connection>
S: <wait for next connection>
  • APOP :APOP 命令使用了一个加密的哈希值(MD 5 散列值)来验证用户的身份。当客户端连接到邮件服务器时,服务器会发送一个带有时间戳的随机字符串。然后客户端将该字符串和用户的密码进行组合,并使用 MD5 算法进行哈希运算。最后,客户端发送用户名和计算得到的哈希值给服务器,以完成身份验证。
  • STAT:获取收件箱中邮件的统计信息
  • LIST:请求邮件服务器列出所有存储的邮件及其长度
  • RETR:发送对应的邮件
  • DELE:给邮件做删除标记
  • QUIT:结束该 POP3 会话并删除标记为删除的邮件
  1. POP3 在服务器端保留状态信息,但不在会话过程中携带状态信息,简化了 POP3 服务的实现

IMAP

  1. IMAP 协议为用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令
  2. IMAP 还为用户提供了在远程文件夹中查询邮件的命令,按指定条件去查询匹配的邮件
  3. IMAP 具有允许用户代理获取报文某些部分的命令
  4. IMAP 服务器维护了 IMAP 会话的用户状态信息
C: <open connection>
S:   * OK IMAP4rev1 Service Ready
C:   a001 login mrc secret
S:   a001 OK LOGIN completed
C:   a002 select inbox
S:   * 18 EXISTS
S:   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S:   * 2 RECENT
S:   * OK [UNSEEN 17] Message 17 is the first unseen message
S:   * OK [UIDVALIDITY 3857529045] UIDs valid
S:   a002 OK [READ-WRITE] SELECT completed
C:   a003 fetch 12 full
S:   * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700"
      RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)"
      "IMAP4rev1 WG mtg summary and minutes"
      (("Terry Gray" NIL "gray" "cac.washington.edu"))
      (("Terry Gray" NIL "gray" "cac.washington.edu"))
      (("Terry Gray" NIL "gray" "cac.washington.edu"))
      ((NIL NIL "imap" "cac.washington.edu"))
      ((NIL NIL "minutes" "CNRI.Reston.VA.US")
      ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL
      "<[email protected]>")
      BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028
      92))
S:   a003 OK FETCH completed
C:   a004 fetch 12 body[header]
S:   * 12 FETCH (BODY[HEADER] {342}
S:   `Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)`
S:   `From: Terry Gray <[email protected]>`
S:   `Subject: IMAP4rev1 WG mtg summary and minutes`
S:   `To: [email protected]`
S:   `Cc: [email protected], John Klensin <[email protected]>`
S:   `Message-Id: <[email protected]>`
S:   `MIME-Version: 1.0`
S:   `Content-Type: TEXT/PLAIN; CHARSET=US-ASCII`
S:
S:   )
S:   a004 OK FETCH completed
C    a005 store 12 +flags \deleted
S:   * 12 FETCH (FLAGS (\Seen \Deleted))
S:   a005 OK +FLAGS completed
C:   a006 logout
S:   * BYE IMAP4rev1 server terminating connection
S:   a006 OK LOGOUT completed
  1. From ChatGPT 3.5:在 POP3会话中,状态信息通常包括邮件的状态,比如已读或未读、已删除或未删除。这些信息保存在邮件服务器上,在会话期间,可以通过命令和响应来查询和修改这些状态。在 IMAP 会话中,状态信息更加灵活和丰富。它包括邮件夹(也称为邮箱或文件夹)的状态,比如邮件数、未读邮件数等,还包括每封邮件的状态,比如已读或未读、已删除或未删除。IMAP 还允许客户端保存自己的会话状态,比如当前选定的文件夹、搜索条件等,以便在断开连接后能够恢复会话。
  2. 现代用户代理应用程序中显示的用户文件夹结构 (图片来自 Apple Mail)
    h300 h300

DNS

  1. 标识主机的两种方式:主机名 (hostname), IP 地址
  2. 域名系统 (Domain Name System, DNS)的主要任务:进行 主机名到 IP 地址转换 的目录服务
  3. DNSPasted image 20231103150341.png
    1. 一个由分层的 DNS 服务器 (DNS server) 实现的分布式数据库
    2. 一个能够使得主机能够查询分布式数据库的应用层协议
    3. 运行在 UDP 上,使用 53 号端口
  4. DNS 通常是由其他应用层协议所使用的,包括 HTTP、SMTP 和 FTP 将用户提供的主机名解析为 IP 地址
  5. DNS 还提供一些重要的服务
    1. 主机别名 (host aliasing)
    2. 邮件服务器别名 (mail server aliasing)
    3. 负载分配 (load distribution) ⬇️
    4. Pasted image 20231103154100.png
  6. 在 DNS 记录的环境中,TTL (单位 second) 是一个数值,它确定 DNS 缓存服务器在连接到权威性 DNS 服务器并获取记录的新副本之前可以为 DNS 记录提供服务的时间

DNS 报文格式

Pasted image 20231106084448.png

  1. 前 12 字节:首部区域
    1. 标识符:用于标识查询,会被复制到对查询的回答报文中 (16 bit)
    2. 标志字段:(16 bit)
    3. 有关数量的字段:问题数,回答 RR 数,权威 RR 数,附加 RR 数(对应下方的问题区域和回答区域,各 16 bit)
  2. 问题区域:
    1. 名字字段:包含正在被查询的主机名字
    2. 类型字段:指出有关该名字正在被询问的问题类型
    3. Class 字段:主要用来指定网络类别
  3. 回答区域:包含了对最初请求的名字的资源记录

标志字段格式

Field Description Length (bits)
QR Indicates if the message is a query (0) or a reply (1) 1
OPCODE The type can be QUERY (standard query, 0), IQUERY (inverse query, 1), or STATUS (server status request, 2) 4
AA Authoritative Answer, in a response, indicates if the DNS server is authoritative for the queried hostname 1
TC TrunCation, indicates that this message was truncated due to excessive length 1
RD Recursion Desired, indicates if the client means a recursive query 1
RA Recursion Available, in a response, indicates if the replying DNS server supports recursion 1
Z Zero, reserved for future use 3
RCODE Response code, can be NOERROR (0), FORMERR (1, Format error), SERVFAIL (2), NXDOMAIN (3, Nonexistent domain), etc. 4

问题 RR 格式

Field Description Length (octets)
NAME Name of the requested resource Variable
TYPE Type of RR (A, AAAA, MX, TXT, etc.) 2
CLASS Class code 2

回答 RR 格式

Field Description Length (octets)
NAME Name of the node to which this record pertains Variable
TYPE Type of RR in numeric form (e.g., 15 for MX RRs) 2
CLASS Class code 2
TTL Count of seconds that the RR stays valid (The maximum is 231−1, which is about 68 years) 4
RDLENGTH Length of RDATA field (specified in octets) 2
RDATA Additional RR-specific data Variable, as per RDLENGTH

在 DNS 数据库中插入记录

  1. 注册登记机构 (registrar) 是一个商业实体,它验证该域名的唯一性,将该域名输入 DNS 数据库(如下面所讨论的那样),对提供的服务收取少量费用。
  2. 因特网名字和地址分配机构 (Internet Corporation for Assigned Names and Numbers, ICANN) 向各种注册登记机构授权
  3. 当注册一个域名时并提供 Web 和 Mail 服务时
    1. 向域名登记注册机构提供基本和辅助权威服务器的名字和 IP 地址
    2. 向权威 DNS 服务器中插入 Web 服务器 www.example.com 的类型 A 资源记录和用于邮件服务器 mail.example.com 的 MX 资源记录

P2P 文件分发

  1. 在本节中我们将研究一个非常自然的 P2P 应用,即从单一服务器向大量主机 (称为对等方) 分发一个大文件
  2. 在 P2P 文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器

P2P 体系结构的扩展性

  1. 考虑一个用于两种体系结构类型的简单定量模型,将一个文件分发给一个固定对等方集合 Pasted image 20231106155558.png
  2. 服务器的上载速率, 第 i 对等方接入链路的上载速率, 第 i 对等方接入链路的下载速率
  3. 被分发的文件长度, 要获得的该文件副本的对等方的数量
  4. 分发时间 (distribution time):所有 N 个对等方得到该文件副本所需要的时间
  5. 假设互联网核心具有足够的带宽,服务器和客户端没有参加任何其他网络应用,所有上传和下载访问贷款能被全部用于分发该文件

客户-服务器体系结构

  1. 服务器必须向 个对等方的每个传输该文件的一个副本。因此该服务器必须传输 比特。因为该服务器的上载速率是 , , 分发该文件的时间必定是至少为
  2. 表示具有最小下载速率的对等方的下载速率,即 。具有最小下载速率的对等方不可能在少于 秒时间内获得该文件的所有 F 比特。因此最小分发时间至少为
  3. 观察得到
  4. 对于足够大的 N,客户-服务器分发时间由 确定,所以分发时间随着对等方 的数量线性增加

P2P 体系结构

  1. 该服务器必须经过其接入链路至少发送该文件的每个比特一次,最小分发时间至少是
  2. 具有最低下载速率的对等方不能以小于 秒的分发时间获得所有 比特
  3. 系统整体的总上载能力等于服务器的上载速率加上每个单独的对等方的上载速率, ,系统必须向这 个对等方的每个交付 比特,总共交付 比特,且不能以快于 的速率完成,因此最小的分发时间至少是
  4. 同上得
  5. 如果我们认为一旦每个对等方接收到一个比特就能够重分发一个比特的话,则存在一个重新分发方案能实际取得这种下界
  6. 假设所有对等方具有相同的上载速率 ,设置 小时, Pasted image 20231106172311.png
  7. 对于 P2P 体系结构最小分发时间不仅总是小于客户-服务器体系结构的分发时间,并且对于任意 0.5 的对等方数量 N, 总是小于 1 小时

BitTorrent

  1. 术语
    1. 洪流 (torrent):参与一个特定文件分发的所有对等方的集合
    2. 洪流中的对等方彼此下载等长度的文件块 (chunk)
    3. 追踪器 (tracker):每个洪流具有的基础设施节点,当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。以这种方式,追踪器跟踪参与在洪流中的对等方
    4. 疏通 (unchoked):使数据的发送和接收流畅进行的对等方
  2. 领近对等方:新对等方加入洪流时,追踪器随机从参与对等方的集合中选择对等方的一个子集,并将这些对等方的 IP 地址发送给 Alice,Alice 持有对等方的这张列表,试图与该列表上的所有对等方创建并行的 TCP 连接,所有这样与 Alice 成功地创建一个 TCP 连接的对等方为"邻近对等方”
  3. 最稀缺优先 (rarest first) 技术:针对 Alice 没有的块在她的邻居中决定最稀缺的块(最稀缺的块就是那些在她的邻居中副本数量最少的块),并首先请求那些最稀缺的块

视频流和内容分发网

  1. 视频媒体:视频是一系列的图像,通常以一种恒定的速率 (如每秒 24 或 30 张图像) 来展现。一幅未压缩、数字编码的图像由像素阵列组成,其中每个像素是由一些比特编码来表示亮度和颜色。视频的一个重要特征是它能够被压缩,因而可用比特率来权衡视频质量
  2. 对流式视频最为重要的性能度量是端到端吞吐量
  3. HTTP 的动态适应流 (Dynamic Adaptive Streaming over HTTP, DASH):视频编码为几个不同的版本,每个版本具有不同的比特率,对应于不同的质量水平。客户动态地请求来自不同版本且长度为几秒的视频段数据块。当可用带宽量较高时,客户自然地选择来自高速率版本的块;当可用带宽量较低时,客户自然地选择来自低速率版本的块。客户用 HTTP GET 请求报文一次选择一个不同的块
  4. HTTP 服务器存在一个告示文件 (manifest file),为每个版本提供了一个 URL 及其比特率

内容分发网

  1. 提供流式视频服务建立单一大规模数据中心的问题
    1. 用户远离数据中心,端到端吞吐量受瓶颈链路的吞吐量限制,若吞吐量小于视频消耗速率,容易产生停滞时延
    2. 流行的视频可能经相同的通信链路发送多次
    3. 单点故障,如果数据中心或其通向因特网的链路崩溃,它将不能够分发任何视频流
  2. 内容分发网 (Content Distribution Network, CDN):CDN 管理分布在多个地理位置上的服务器,在它的服务器中存储视频(和其他类型的 Web 内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的 CDN 位置
  3. CDN 服务器安置原则
    1. 深入:该原则是通过在遍及全球的接入 ISP 中部署服务器集群来深入到 ISP 的接入网中,但因为这种高度分布式设计,维护和管理集群的任务成为挑战
    2. 邀请做客:通过在少量关键位置建造大集群来邀请到 ISP 做客,邀请做客设计通常产生较低的维护和管理开销,可能以对端用户的较高时延和较低吞吐量为代价

CDN 操作

集群选择策略

  1. 集群选择策略 (cluster selection strategy):动态地将客户定向到 CDN 中的某个服务器集群或数据中心
    1. 地理上最为领近 (geographically closest)
      1. 一种所有基于 DNS 的方法都内在具有的问题是,某些端用户配置使用位于远地的 LONS
      2. 就网络路径的长度或跳数而言,地理最邻近的集群可能并不是最近的集群
    2. 实时测量 (real-time measurement)
      1. CDN 能够让它的每个集群周期性地向位于全世界的所有 LDNS 发送探测分组
      2. 但是许多 LDNS 被配置为不会响应这些探测