应用层
1. 域名系统
1.1 使用背景
在Internet的应用层中,许多应用都遵循客户机client/服务器server模式。客户端/服务器应用程序分为两类:
- 一种可以直接被用户使用:e-mail
- 支持其他应用程序的应用程序:DNS
DNS是一种支持程序
![image-20211224085950473](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224085950473.png)
TCP/IP使用IP唯一确定一台主机到因特网的连接。名字比IP更容易记忆。需要实现名字到地址或者地址到名字的映射系统。
map name to a address or map address to a name
因特网发展初期,使用**主机文件(host file)**实现映射。
host file构成
- 一列是名字
- 一列是地址
每台主机主机文件存储在磁盘中,并以一个标准主机文件为依据,定期进行更新。当程序或者用户需要将某一名字映射到一个地址时,主机就查询主机文件。
问题:
- 主机文件太大,无法存储在每一台计算机中
- 每次发生变化时,无法更新世界上的所有主机
解决:
-
方案1:存储在一台单独的主机上,允许每一台需要映射的计算机访问这个集中化的信息。
- 缺点:造成较大的通信量
-
方案2:将巨大的信息分成很多很小的部分,每一部分存储在不同的计算机中。
需要映射的计算机可以寻找最近的一台持有信息的计算机。
1.2 名字空间
分配给机器的名字必须从名字空间name space 中选择。
【IP地址唯一】----->【名字唯一】
Name Space按两种方式进行组织:
{
F
l
a
t
H
i
e
r
a
r
c
h
i
c
a
l
\begin{cases}Flat\\Hierarchical\end{cases}
{FlatHierarchical
1.2.1 平面地址空间
一个名字分配个一个地址,空间中的名字是一个无结构的字符序列 a sequence of characters without structure。名字之间也可能没有公共部分;即使有公共部分,也没有实际含义。
缺点:
- 必须集中控制才能避免二义性和重复性
1.2.2 层次化地址空间
名字的组成 { p a r t 1 :组织的性质 p a r t 2 : 组织的名字 p a r t 3 : 组织的部门 . . . . . . . 名字的组成\begin{cases}part1:组织的性质\\part2:组织的名字\\part3:组织的部门\\.......\end{cases} 名字的组成⎩ ⎨ ⎧part1:组织的性质part2:组织的名字part3:组织的部门.......
分配和控制名字的机构可以分散化decentralied,
组织的性质和名字可以由中央组织定义,其他部分的分配可以交给这个组织自身。
1.3 域名空间
为了获得层次结构名字空间,设计了Domain Name Space。所有的名字由根在顶部的倒置的树结构定义:
树最多有128级:0级~127级
![image-20211224095359363](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224095359363.png)
1.3.1 标签
树上的每一个节点有一个label,label最多为63个字符。根节点的标号是一个空字符串null
DNS要求同一节点分出来的子节点有不同的label:确保名字的唯一性。
![image-20211224095614899](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224095614899.png)
1.3.2 域名
每一个节点都有一个域名。
一个全的domain name是用.分割的标识号序列。
domain name总是从节点向上读到根节点。最后一个标号是根节点的标号。这表示一个完全的域名总是以一个空标号结束,即最后一个字符是.
1.3.2.1 Fully Qualified Domain Name
如果一个label以空字符串结束,那么他就是全称域名full qualified domain name
全称域名包含一台主机的所有名字的域名。它包含所有的标号,从最具体的标号到最一般的标号,能唯一定义一台主机的名字,如:
challenger.act.fhda.edu.
是一个全称域名。
1.3.2.2 Partially Qualified Domain Name
如果一个域名不是以空字符串结束,那么称为部分域名partially Qualified Domain Name
![image-20211224100843498](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224100843498.png)
当这个需要解析的名字属于和客户端相同的站点same site时,使用部分域名。解析程序能提供省略的部分,称为后缀suffix,以创建FQDN。
1.3.3 域
domain是域名空间的一棵子树。
域的名字是树顶部节点的域名。
一个域本身也可以划分为多个域,即子域subdomain
![image-20211224101910573](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224101910573.png)
1.4 分布式名字空间
一台计算机存储的问题:
- 通信量大
- 不安全
1.4.1 名字服务器的层次结构
将信息分布在多台称为DNS服务器(DNS server)的计算机中。
一种方法:将整个空间划分为基于第一级的域,并进一步划分为更小的subdomain。
每一台服务器对一个大的域或者较小的域是负责的
与建立名字的层次结构一样,也建立了服务器的层次结构
![image-20211224103044499](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224103044499.png)
1.4.2 空间
一个服务器responsible或者has authority的范围称为一个Zone。
Zone和Domain的区别:
- 如果一个服务器负责一个域,并且这个域没有被划分更小的subdomain,那么此时domain和zone是相同的。
- 如果被划分为更小的subdomain
- 子节点的信息会放在更低层次的服务器中
- 原来的服务器只保存这些较低服务器的某种参照
![image-20211224103718231](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224103718231.png)
1.4.3 根服务器
Root Server:whose ZONE consists of the whole tree
根服务器通常不保存关于域的任何信息,只是将其授权给其他的服务器,并保存这些服务器的参照关系。
目前有多个根服务器,每一台都覆盖了整个域名空间, 这些服务器分布在世界各地。
1.4.4 主服务器和辅服务器
D N S 定义了服务器类型 { primary server secondary server DNS定义了服务器类型\begin{cases}\text{primary server}\\\text{secondary server}\end{cases} DNS定义了服务器类型{primary serversecondary server
-
primary server:存储了授权区域有关文件的服务器,它负责创建creating、维护maintaining和更新updating区域文件,并将区域文件存储在本地磁盘中。
-
**secondary server:**从一个服务器(主服务器或者是辅服务器)传输transfer一个区域的全部信息,并将文件存储在它的本地磁盘中。辅助服务器既不创建也不更新区域文件。如果需要更新,那么必须是由主服务器完成,由主服务器发送到辅助服务器。
一台服务器可能是某个特定区域的主服务器,也可能是别的区域的辅服务器。
-
主服务器能够从磁盘文件中装载所有信息,辅助服务器从主服务器中装载信息。
-
当辅助服务器从主服务器中下载信息时,这称为区域的传递。【辅服务器作为备份】
1.5 网络中的DNS
域名空间被划分为三个部分:
D
o
m
a
i
n
n
a
m
e
s
p
a
c
e
{
G
e
n
e
r
i
c
d
o
m
a
i
n
s
I
n
v
e
r
s
e
d
o
m
a
i
n
c
o
u
n
t
r
y
d
o
m
a
i
n
s
Domain\ name \ space\begin{cases}Generic\ domains\\Inverse \ domain\\country\ domains\end{cases}
Domain name space⎩
⎨
⎧Generic domainsInverse domaincountry domains
1.5.1 通用域
Generic domain:按照已经注册主机的一般行为对主机进行定义。
树中的每一个节点定义一个域,他是域名空间数据库的一个索引。
1.5.2 国家域
country domain使用两个字母的国家缩写,如us代表美国,第二级Label是组织机构,如州。
1.5.3 反向域
inverse domian用于将地址映射为名字。
应用:反向或者指针PTR查询。
![image-20211224111223498](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224111223498.png)
1.6 解析
name-address resolution:将名字映射为地址或者将地址映射为名字
1.6.1 解析程序
DNS是一个客户机/服务器应用程序,需要将地址—>名字或者名字—>地址时需要调用一个解析程序resolver的DNS服务程序。
resolver用一个映射访问最近的一个DNS服务器,然后进行递归解析或者迭代解析。
1.6.2 绑定名字到地址
名字到地址的映射:DNS服务器检查通用域或者国家与查找相应的映射
1.6.3 绑定地址到名字
地址到名字的映射:DNS服务器进行PTR查询,使用inverse domian。
IP地址必须反过来,并将in-addr和arpa两个标号附加在最后,以创建反向域能够接收的域。
1.6.4 递归搜索
客户端解析程序从名字服务器中请求递归应答的方式:
- 如果服务器是这一域名的授权服务器,他会检查数据库并做出相应
- 不是授权服务器,通常会发给父服务器,并等待响应。
- …一直迭代向上…直到找到
- 找到后迭代返回
![image-20211224114151069](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224114151069.png)
1.6.5 迭代搜索
客户端解析程序从名字服务器中没有请求递归应答,那么映射可以以迭代的形式进行
- 如果服务器时该名字的授权服务器,那么发送应答
- 不是,它返回那个他认为可以解析该查询的服务器地址
![image-20211224114616321](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224114616321.png)
1.6.6 缓存
服务器向另一个服务器请求映射并得到回应时,将回应发送回客户端之前,先将信息存储在高速缓存中。
下次查询时通过高速缓存解决问题。但是通知这个响应来自高速缓存而非授权信息。
高速缓存存在问题:
- 映射过期
解决方式:
- TTL信息添加在映射上,TTL定义了服务器可以将信息放入高速缓存的时间,超时后该信息无效
- 每一台服务器对每一个映射保留一个TTL计数器。高速缓存定期检查,清除TTL已经过期的映射
2. 远程登录、电子邮件和文件传输
因特网的服务 { r e m o t e l o g g i n g e − m a i l F i l e t r a n s f e r 因特网的服务\begin{cases}remote\ logging\\e-mail\\File\ transfer\end{cases} 因特网的服务⎩ ⎨ ⎧remote logginge−mailFile transfer
2.1 远程登录
需求:用户希望在远程网站上运行许多个程序run application programs at a remote site,但是产生的结果能传送到本地的网站。
无法为每一个服务创建客户/服务器应用程序。
更好的方式是使用通用的general - purse 客户/服务器程序,让用户能访问远程计算机上的所有的应用程序。
允许用户在远程计算机上登录-----登录后使用计算机提供的服务------结果返回到本地的计算机上
2.1.1 TELNET
TELNET是一个通用的客户/服务应用程序。
2.1.2 Logging
本地登录 local log-in :登录到本地的分时系统,称为本地登录。
过程:
- 用户击键或者运行仿真程序
- 击键被终端驱动程序所接受
- 终端驱动程序将字符传递给操作系统
- 操作系统解释字符,调用所需的应用程序或者实用程序
远程登录 remote log-in :需要使用TELNET
过程
- 使用TELNET客户程序和服务器程序
- 击键发送给终端驱动程序
- 本地OS接受字符,但并不解释
- 字符被送到TELNET客户机,TELNET将字符转换成网络虚拟终端NVT字符的通用字符集
- 传送给本地的TCP/IP协议栈
- 将NVT文本通过因特网传输到远程的TCP/IP协议栈
- 传给那里的OS
- 传送给远程的TELNET服务器,TELNET服务器将其转换成远程计算机可以理解的字符
- 字符传送给伪终端驱动程序
- 最后传送给OS,在传送给适当的应用程序
![image-20211224201219330](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224201219330.png)
2.1.3 网络虚拟终端
异构的系统 heterogeneous systems 打交道:TELNET定义了一个通用的接口network virtual terminal NVT。
- 客户TELNET将来自本地终端的字符转换为NVT形式,然后传递给网络
- 而服务器TELNET将来自NVT形式的数据或者命令转换成远程计算机可以接受的形式
![image-20211224201735217](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224201735217.png)
-
NVT字符集【NVT character set】
两者都是八位字符集
{ 数据字符 d a t a c h a r a c t e r :最高位为 0 控制字符 c o n t r o l c h a r a c t e r :最高位为 1 \begin{cases}数据字符data \ character:最高位为0\\控制字符control\ character:最高位为1\end{cases} {数据字符data character:最高位为0控制字符control character:最高位为1
2.1.4 Embeding
TELNET使用一个TCP/IP连接,服务器使用熟知端口23,客户使用临时端口
使用同一个连接发送数据字符和控制字符。
TELNET将控制字符嵌入到数据字符中:区别数据和控制字符时使用控制解释IAC
![image-20211224202258677](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224202258677.png)
2.1.5 Options
TELNET提供额外的协商选项,提供额外特性。
使用控制字符来定义选项:
![image-20211224202449942](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224202449942.png)
Options Negotiation 选项协商
为使用上述选项,使用4个控制字符:
- WILL:请求激活;接收激活
- WONT:决绝请求激活;提供禁止选项
- DO:同意激活选项;请求激活选项
- DONT:同意禁止选项;请求禁止选项
希望回显的例子:
![image-20211224203206294](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224203206294.png)
suboption negotiation 子选项协商
有些选项需要附加信息,如定义一个中断的类型或者速率,协商要包括一个字符串或者数字来定义类型或者速率。
![image-20211224203351514](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224203351514.png)
(6)Mode of Opration
操作方式 { d e f a u l t m o d e 默认方式:回显由客户完成,一行完成前不发送 c h a r a c t e r m o d e 字符方式:每一个字符从客户机发送给服务器 l i n e m o d e 行方式:行编辑由客户完成,然后客户将整行发给服务器 操作方式\begin{cases}default \ mode默认方式:回显由客户完成,一行完成前不发送\\ character\ mode字符方式:每一个字符从客户机发送给服务器\\line\ mode行方式:行编辑由客户完成,然后客户将整行发给服务器\end{cases} 操作方式⎩ ⎨ ⎧default mode默认方式:回显由客户完成,一行完成前不发送character mode字符方式:每一个字符从客户机发送给服务器line mode行方式:行编辑由客户完成,然后客户将整行发给服务器
2.2 电子邮件
电子邮件的一般架构:
- 用户代理 user agent
- 报文传输代理 message transfer agent
- 报文访问组件 message access agent
2.2.1 架构
2.2.1.1 架构一:仅需要两个UA
电子邮件的发送方与接收方是在一个系统内的用户(或者相同应用程序),他们直接或者间接共享一个系统。
邮箱mailbox是本地硬盘的一部分——是一个特殊文件,只有邮箱的拥有者可以访问
- 客户1运行用户代理UA
- 在客户2的邮箱中插入报文
- 报文中有发送方与接收方的邮箱地址(文件名)
- 客户2可以运行UA,检查他的邮箱
![image-20211224205844058](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224205844058.png)
2.2.1.2 架构二:需要UA和报文传输代理MTA
发送方和接收方是不同系统上的用户。需用用户代理和报文传输代理。
- 客户1使用用户代理程序发送报文到他所在网站的系统——邮件服务器
- 邮件服务器使用队列存储报文,等待发送
- 客户2使用用户代理检索存储在他的网站系统中的报文
- 客户2使用两个报文传输代理——客户+服务器
- 服务器始终运行
![image-20211224211705400](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224211705400.png)
全过程需要两个UA和两个MTA(客户机和服务器)
2.2.1.3 架构三:两个UA和两对MTA
客户机1通过广域网连接到系统。
客户2直连到系统。
![image-20211224212259807](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224212259807.png)
2.2.1.4 架构四:两对MTA和一对MAA
客户1和客户2都通过广域网连接到系统。
涉及到邮件的两个操作:pull和push
-
push:从MTA客户机推入报文到MTA服务器
-
pull:从MAA服务器中拉出报文到MAA客户机
2.2.2 用户代理 User Agent
第一个组件conponent UA,是一个用户程序
2.2.2.1 Services Provided by UA
有五种报文:
- Composing messages
- Reading messages
- Replying to messages
- Forwarding messages 转发报文
- Handling mailboxes
2.2.2.2 用户代理类型
-
command-driven
- 从键盘接收打个字符的命令执行某项任务
- mail,pine,elm
-
GUI-based
图形化界面
2.2.2.3 地址
地址由两部分构成:本地部分local part和域名domain
- local part:特定文件的名字,称为用户邮箱,在用户邮箱中存储接收到的文件
- domain:邮件交换器的domain
2.2.2.4 MIME
电子邮件有一个简单的结构。他只能发送NVT 7 ASCII格式的报文。
多用途因特网扩充 Multipurpose Internet Mail Extension MIME:
- 辅助协议,允许非ASCII数据通过电子邮件传送
- MIME将非ASCII转换到NVT ASCII,并将其传送给MTA服务器通过因特网发出去
- 在接收方在转换到原来的数据
![image-20211224221144033](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224221144033.png)
2.2.3 简单邮件传输协议:STMP
实际邮件的传输由MTA完成。
定义MTA的协议称为SMTP 简单邮件传输协议 Simple Message Transfer Protocal,协议定义了如何来回发送命令和响应。
![image-20211224222113672](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224222113672.png)
2.2.3.1 Commands and Response
![image-20211224222135237](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224222135237.png)
-
commands
从客户发给服务器。命令的格式为
keywords:argument(s)
STMP定义了14个命令:
- 前5个是强制的,必须实现且支持
- 后三个是常用且推荐
- 最后6个很少使用
-
response
服务器发给客户端
三位数字码,附加文本信息
2.2.4 POP 和 IMAP
报文访问代理有两种协议:
- POP3 邮局协议版本3
- IMAP4 因特网邮件访问协议版本4
2.2.4.1 POP3
用户要从邮件服务器的邮箱中下载邮件时,客户端发起邮件访问的操作。
- 客户端开启与使用服务器110端口之间的TCP连接
- 发送用户名和密码来访问邮箱
- 之后逐条读取信息
![image-20211224223858073](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20211224223858073.png)
POP3有两种模式:
- 删除模式delete mode:从邮箱中读取后删除邮件
- 保存模式save mode:从邮箱中读取后仍保存该邮件
2.3 文件传输
传送文件最常见的协议:FTP
2.3.1 文件传输协议
FTP使用TCP服务。它需要两个TCP连接。
- 一个用于数据传输
- 一个用于控制信息传输
分开传输使得FTP效率更高。
熟知端口21用于控制连接,而熟知端口20用于数据连接。
FTP会话期间:
-
**控制连接(control connection)**始终处于连接状态。
通过命令command和响应response完成
每一条命令是一个短行,不存在文件格式或者文件结构的问题。
-
**数据链接(data connection)**在每次传输文件时打开然后关闭
客户必须定义要传送的文件的:
- 文件类型
- 传输方式
- 数据结构
3. WWW and HTTP
万维网(World wide web, WWW)是分布式在世界各地相互连接的信息仓库。
3.1 体系架构
WWW是分布式客户/服务器服务,客户机用浏览器能够使用服务器提供的服务。然后提供的服务分布在许多称为站点的位置上。
每个站点拥有一个或者多个文档,即web页面。
web页面可以包含一个本地站点或者是其他站点的链接。
![image-20220313112620416](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20220313112620416.png)
3.1.1 客户(浏览器)
浏览器使用相同的架构:
- 控制程序:从键盘或者鼠标接受输入,使得用户端程序访问文档
- 客户协议
- 解释程序:获取文档后解释程序显示
![image-20220313113028516](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20220313113028516.png)
3.1.2 服务器
Web页面存储在服务器中,客户机请求到达,相应文档发送给客户
可存储在高速缓存中,较快发送
3.1.3 统一资源定位符URL
URL说明了因特网信息的标准
包含:
- 协议:HTTP
- 主机:IP/域名
- 端口:可选
- 路径:路径
冒号隔开
3.1.4 Cookies
Cookies提供状态保存服务
web有额外的功能:
- 只允许注册客户访问
3.1.4.1 Cookies的创建和存储
![image-20220313114031579](https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20220313114031579.png)
3.2 Web文档
{ 静态文档 动态文档 活动文档 \begin{cases}静态文档\\动态文档\\活动文档\end{cases} ⎩ ⎨ ⎧静态文档动态文档活动文档
3.2.1 静态文档
静态文档是固定内容的文档,由服务器创建并存储。发送给客户机的是副本
3.2.1.1 超文本标记语言
超文本标记语言用于创建web页面的语言。
beginning and ending tags
起始标签格式:<标签名 属性=值 属性= 值 ...>
终止标签格式:<标签名>
- 文本标签
- 图像标签
- 超链接标签
3.2.2 动态文档
在有浏览器请求该文档时,才由web服务器创建。
请求到达时,运行应用程序或者脚本来创建动态文档。服务器返回程序或者脚本的输出作为浏览器文档请求的相应。
-
CGI技术:定义如何编写动态文档,如何将数据发送给应用程序,如何使用输出结果
-
输入:参数传递(URL)
浏览器到服务器的输入通过表单完成
-
输出:服务器站点执行CGI程序
-
- PHP,JSP
3.2.3 活动文档
需要程序或者脚本在客户端进行。服务器发送文档或者脚本的副本。
3.3 超文本传输协议
HTTP的功能类似FTP和SMTP的结合。
- FTP:但是只用一个TCP连接
- SMTP:传输的数据格式与SMTP类似
HTTP在熟知端口80上使用TCP服务
3.3.1 HTTP Transaction
TCP报文,发送请求和发送响应
3.3.1.1 报文
a. Request line and Status line
- 请求行格式:
请求类型 URL HTTP版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1x4EEwyI-1661699817342)(https://cdn.jsdelivr.net/gh/Holmes233666/gitee-image@main/pictureStore/image-20220313120539921.png)]
-
状态行格式:
HTTP版本 状态码 状态短语
b. Header
头部格式:head_name : value
分类:
- 通用头部
- 请求头部
- 响应头部
c.body
3.3.2 Persistant Versus Nonpersistent Connection
3.3.2.1 Nonpersistent Connection
每一次响应都要建立TCP连接,步骤:
- 客户端建立TCP连接,发送请求
- 服务器发送响应,并关闭连接
- 客户端读取
3.3.2.2 Persistant Connection
HTTP1.1默认持续连接。服务器响应后会保持连接处处于开启状态,等待更多的请求。如果客户请求关闭或者超时时,服务器关闭连接。