计算机网络_应用层

计算机网络_应用层

解答的问题

  1. 应用程序体系结构
  2. 进程通信的过程
  3. DNS
  4. HTTP

应用程序体系结构

主要有:CSP2P 。即 Client-ServerPear-to-Pear

客户 - 服务器体系结构

客户提出请求,而服务器响应客户的请求。

一般来说,服务器的 IP 地址是固定的,并且总是打开,其客户并不直接通信

对等体系结构

对等方之间互为客户和服务器,不必通过统一的服务器进行通信。

P2P 体系结构具有自拓展性(self-scalability)。即对等方通过向其他对等方提供服务而增加系统的服务能力,并且不需要庞大的服务器和服务器带宽。

但是仍然具有三方面的挑战

  • 对 ISP 友好。大多数住宅 ISP 的下载带宽远高于上载带宽,因此 P2P 的上载带宽需求给 ISP 带来了压力。
  • 安全性。P2P 的高度分布和开放性。
  • 激励。如何激励用户自愿提供带宽、存储和计算资源。

进程通信

进程(process)是端系统中程序的实体。同一端系统中,进程之间使用进程间通信机制进行通信;不同端系统中,通过交换网络报文(message)进行通信。

客户:发起通信的进程。

服务器:等待通信的进程。

进程与计算机网络之间的接口

进程之间通过套接字(socket)的软件接口与网络交换报文。

graph LR subgraph 端系统A A[进程1] B[socket] end subgraph 端系统B C[进程1] D[socket] end A --> B -->|Network| D --> C C --> D -->|Network| B --> A

套接字是应用程序与运输层之间的应用程序编程接口(Application Programming Interface, API)。对运输层的控制仅限于选择运输层协议、控制少数参数。

进程寻址

如何标识通信双方及其进程?对于通信的主机,使用 IP 地址进行标识;对于运行在其上的进程,使用端口号(port number)进行标识。

运输层协议选择

运输层协议可以提供的服务:

  1. 可靠数据传输:数据的无差错传输。
  2. 吞吐量:确保可用吞吐量总是至少为确定的速率。
  3. 定时:严格的时延。
  4. 安全性:数据加密、数据完整性、端点鉴别

实际可选择的传输层协议:

TCP UDP
面向连接的服务 无连接
可靠数据传输 不可靠数据传输
安全性(通过 SSL 实现) 无安全性
具有拥塞控制,能够在网络拥塞时抑制双方的发送进程。 没有拥塞控制,因此能够以任意选定的速率向网络层注入流量。

安全套接字层(Secure Socket Layer, SSL):在应用层加强 TCP 的安全性,因此需要客户端和服务器端在应用程序中增加 SSL 代码。

拥塞控制:当发送方和接收方之间的网络链路出现拥塞时,TCP 会抑制数据发送进程(发送方或接收方)。这未必会给通信进程带来好处,但是能够让网络带宽的共享更加公平。

由于 UDP 没有拥塞控制,因此可以以任意选定的速率进行通信,容易造成公共资源(带宽)的滥用,或者是网络攻击。因此中国运营商会对 UDP 包进行随机丢包处理,许多防火墙也会过滤大部分类型的 UDP 数据报。

DNS:因特网的目录服务

graph LR A[Hostname] ==>|"Ⅰ"| B[IP Address] C[Host Aliasing] -->|"Ⅱ"| D[Canonical Hostname] C -->|"Ⅱ"| B E[Mail Server Aliasing] -->|"Ⅲ"| D E -->|"Ⅲ"| B D .->|Load Distribution| F[IP_1] D .->|Load Distribution| F[...] D .->|Load Distribution| F[IP_n]

DNS 协议主要提供四种服务:

  1. 主机名到 IP 地址的转换;
  2. 主机别名规范主机名和 IP 地址的转换;例如 www.enterprise.com 实际上的规范名称是 relay1.westi-coast.enterprise.com
  3. 邮件服务器别名规范邮件服务器名和 IP 地址的转换;例如 xxx@hotmail.com 使用 hotmail.com 作为邮件服务器的别名,实际上的规范名称可能是 relay1.west-coast.hotmail.com
  4. 负载分配:即将指向同一个域名的流量分配到多个主机(IP)。即单一域名到 IP 地址集合的转换。

域名系统 DNS 是一个分布式数据库,由众多域名服务器组成,通常是运行 BIND(Berkeley Internet Name Domain)软件的 UNIX 机器。

DNS 协议并不直接为用户所用,而是给应用程序提供一种核心功能,那么 DNS 为什么属于应用层协议?

DNS 协议运行在 53 端口上,依赖于 UDP 协议。

为什么 DNS 是应用层协议?

  1. DNS 协议采用 C/S 模式运行在通信的端系统之间;
  2. DNS 协议依赖于传输层的 UDP 服务

域名结构

DNS 服务是将域名转换为对用 IP 地址的服务,因此首先研究域名(Domain Name)

graph BT subgraph 域名分级 D["顶级域名(TLD)"] E[二级域名] F[三级域名] end subgraph 域名 A[mail] B[.cctv] C[.com] end D --> C E --> B F --> A G["国家顶级域名 nTLD"] --> D H["通用顶级域名 gTLD"] --> D I["基础结构域名 in-addr.arpa"] --> D J["新顶级域名 New gTLD"] --> D K[找对应 IP 的域名] --> I L[利用 DNS 的 MX 记录] --> I

域名服务器

域名服务器采用分布式设计,这是为了避免集中式设计的几大缺陷

  1. 单点故障(a point of failure):DNS服务器故障
  2. 通信容量(traffic volume):DNS服务器的吞吐量
  3. 远距离的集中式数据库(distant centralized database):瓶颈链路
  4. 维护(maintenance):数据量大
graph LR A[集中式数据库] B ==> A C ==> A E ==> B F --> B G ==> C H ==> C D .-> E I ==> D A .- J[/单点故障/] A .- K[/通信容量/] A .- L[/维护/] M[/瓶颈链路/] .- D style J fill:#f9f,stroke:#333,stroke-width:4px style K fill:#f9f,stroke:#333,stroke-width:4px style L fill:#f9f,stroke:#333,stroke-width:4px style M fill:#f9f,stroke:#333,stroke-width:4px

分布式设计:

  • 根 DNS 服务器(Root Name Server)
    • 顶级域服务器(TLD Name Server)
      • 权威域名服务器(Authoritative Name Server):互联网上公共可访问的主机(例如 baidu.com),必须提供公共可访问的 DNS 记录。(“我”宣布“自己”在这几个 IP 地址上提供服务)
  • 本地 DNS 服务器:由 ISP 提供,主机在进行 DNS 查询时会使用其作为代理。

DNS 协议运行机制

递归查询迭代查询

实际实现 递归查询

实际上,请求主机到本地 DNS 服务器的查询是递归的,其他查询过程是迭代的。

从上面的过程可以看出,不考虑中间的 DNS 服务器,需要经过 1 次递归查询、2 次迭代查询,一共需要收发 8 份 UDP 数据报!

可以使用 DNS 缓存机制来加速查询。

DNS 缓存

DNS 服务器储存接收到的 DNS 回复,并保存一段时间。

因此可以绕过查询中的某些服务器。

DNS 记录与报文分析

DNS 记录

DNS 服务器使用资源记录(Resource Record)提供主机名到 IP 的映射。

1
(Name, Value, Type, TTL)

TTL (Time to Live):生存时间,决定了资源从 DNS 缓存中删除的时间。

记录类型 字段含义
A (Address) (Host Name, IP_v4 Address, A)
AAAA (Address) (Host Name, IP_v6 Address, A)
NS (Name Server) (Domain Name, DNS Host Name, NS)
CNAME (Canonical Name Server) (Host Aliasing, Canonical Name, CNAME)
MX (Mail Exchanger) (Mail Aliasing, Mail Canonical Name, MX)

除此之外还有 PTR、SOA

DNS 报文结构

报文首部

报文首部共有 6 部分,12 Bytes。每一部分都有 2 Bytes (16 bits) 的空间。

使用 Wireshark 进行数据帧分析,抓取访问 <www.ietf.org> 时发出的 DNS 查询。

使用 ipconfig /flushdns 刷新本地 DNS 缓存;

删除浏览器的缓存。

上图中选中的 4 个数据帧就是与本地 DNS 服务器之间的查询和响应报文。主机分别查询了域名 www.ietf.org 的 IPv4 和 IPv6 地址,并收到了回复。

查看第一个查询 IPv4 地址的 DNS 查询报文,观察其结构和字节流:

  1. 观察运输层协议可以知道,DNS 协议使用的是 UDP 数据报,占用 53 号端口;
  2. 各层封装包的头部数据长度
    1. 数据链路层,以太网 Ⅱ 协议的头部为 14 Bytes
    2. 网络层,IPv4 协议的头部为 20 Bytes
    3. 运输层,UDP 协议的头部为 8 Bytes
  3. 应用层,DNS 协议的头部数据长度固定为 12 Bytes,剩余18 Bytes 为数据。

下面具体研究 DNS 协议的各个数据字段:

Transaction ID: 0xe9d7

事务 ID,用于唯一标识一对 DNS 查询和回应。占用 2 Bytes。

Flags: 0x0100 Standard query

具有一系列标志,说明该 DNS 数据报 的特征。其中包含是请求还是回答、是否递归、回答是否来自权威服务器等。共 2 Bytes。

Questions / Answer RRs / Authority RRs / Additional RRs

即在首部后这四类数据区域出现的数量。每个数值 2 Bytes,共 8 Bytes。

查询区域

查询区域具有:需要查询的主机名DNS 记录的类型资源记录(RRs)的类别(这里是 [IN]ternet,因特网)。

注意到域名的二进制格式:03 www 04 ietf 03 org 00,其中的数字代表它后面那部分域名的长度。

Class字段还有 CH (chaos), CS (CSNET), HS (hesiod)

互联网的幽灵。

回答区域

DNS 回答报文如下所示。可以看到,对于域名 <www.ietf.org> 的查询,DNS 服务器成功返回了 4 个资源记录(RR)。

回答的资源记录具有 1 个 CNAME 记录,3 个 A 记录。

所有记录的格式是类似的:

  1. 域名 Name:2 Bytes 或不定长。该域名通常是查询部分域名的重复,因此会使用 2 Bytes 的 地址偏移指针 指向前面的重复值。

    指针格式:2 个高位上是 11,用于识别指针。其余 14 位代表从 DNS 报文的开始处计数(从 0 开始),直到目标字段的前一位所经过的字节数。例如:c0 0c: 1100 0000 0000 1100,高位上的 11 代表指针,剩余部分 00 0000 0000 1100 的十进制值为 12,恰好为报文头部字节数,因此 c0 0c 指向查询部分的开头字段,即查询的域名。

  2. RR 的类型 Type 和 RR 的类 Class

  3. 存活时间 TTL

  4. 数据长度 Data length:指接下来的数据的长度。

  5. 数据:变长字段(对应上面的数据长度字段),可以是 IP Address,也可以是规范主机名。