计算机网络_应用层
计算机网络_应用层
解答的问题
- 应用程序体系结构
- 进程通信的过程
- DNS
- HTTP
应用程序体系结构
主要有:CS 和 P2P 。即 Client-Server 和 Pear-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)进行标识。
运输层协议选择
运输层协议可以提供的服务:
- 可靠数据传输:数据的无差错传输。
- 吞吐量:确保可用吞吐量总是至少为确定的速率。
- 定时:严格的时延。
- 安全性:数据加密、数据完整性、端点鉴别
实际可选择的传输层协议:
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 协议主要提供四种服务:
- 主机名到 IP 地址的转换;
- 主机别名到规范主机名和 IP 地址的转换;例如
www.enterprise.com
实际上的规范名称是relay1.westi-coast.enterprise.com
。 - 邮件服务器别名到规范邮件服务器名和 IP 地址的转换;例如
xxx@hotmail.com
使用hotmail.com
作为邮件服务器的别名,实际上的规范名称可能是relay1.west-coast.hotmail.com
。 - 负载分配:即将指向同一个域名的流量分配到多个主机(IP)。即单一域名到 IP 地址集合的转换。
域名系统 DNS 是一个分布式数据库,由众多域名服务器组成,通常是运行 BIND(Berkeley Internet Name Domain)软件的 UNIX 机器。
DNS 协议并不直接为用户所用,而是给应用程序提供一种核心功能,那么 DNS 为什么属于应用层协议?
DNS 协议运行在 53 端口上,依赖于 UDP 协议。
为什么 DNS 是应用层协议?
- DNS 协议采用 C/S 模式运行在通信的端系统之间;
- 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
域名服务器
域名服务器采用分布式设计,这是为了避免集中式设计的几大缺陷:
- 单点故障(a point of failure):DNS服务器故障
- 通信容量(traffic volume):DNS服务器的吞吐量
- 远距离的集中式数据库(distant centralized database):瓶颈链路
- 维护(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 地址上提供服务)
- 权威域名服务器(Authoritative Name Server):互联网上公共可访问的主机(例如
- 顶级域服务器(TLD Name Server)
- 本地 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 查询报文,观察其结构和字节流:
- 观察运输层协议可以知道,DNS 协议使用的是 UDP 数据报,占用 53 号端口;
- 各层封装包的头部数据长度:
- 数据链路层,以太网 Ⅱ 协议的头部为 14 Bytes
- 网络层,IPv4 协议的头部为 20 Bytes
- 运输层,UDP 协议的头部为 8 Bytes
- 应用层,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 记录。
所有记录的格式是类似的:
域名
Name
:2 Bytes 或不定长。该域名通常是查询部分域名的重复,因此会使用 2 Bytes 的 地址偏移指针 指向前面的重复值。指针格式:2 个高位上是
11
,用于识别指针。其余 14 位代表从 DNS 报文的开始处计数(从 0 开始),直到目标字段的前一位所经过的字节数。例如:c0 0c
:1100 0000 0000 1100
,高位上的11
代表指针,剩余部分00 0000 0000 1100
的十进制值为 12,恰好为报文头部字节数,因此c0 0c
指向查询部分的开头字段,即查询的域名。RR 的类型
Type
和 RR 的类Class
。存活时间
TTL
。数据长度
Data length
:指接下来的数据的长度。数据:变长字段(对应上面的数据长度字段),可以是 IP Address,也可以是规范主机名。