dustland

dustball in dustland

计算机网络-应用层

应用层

[TOC]

应用层概览:

image-20220115220640203

熟知端口号:应用层协议在服务端的==默认==端口号,客户端端口号随意

网络应用模型

客户/服务器模型

image-20220115215144534

工作流程:

1.服务器处于接收请求的状态

2.客户机发出服务请求,等待接收结果

3.服务器收到请求后分析请求,进行必要的处理,返回给客户端

客户端必须事先直到服务端的IP地址,这通过DNS解析完成

服务端处于被动状态,谁来了给谁服务,不来的不管

特点:

1.计算机第位不对等,服务器可以限制用户权限,比如ftp协议中ftp服务器可以设置管理员Administrator拥有读写的权力,但是匿名用户只有读的权力

2.客户机之间不直接通信

3.可拓展性差,服务器性能决定一切,服务器能力有限,想要服务更多的用户需要更强的服务器

P2P模型

peer to peer

这个2的英语是two与to同音

(曾经)比较流行的p2p应用有 电驴 等等

image-20220115215157997

特点

1.计算机第位对等,任意一对计算机可以直接通信,减轻了服务器的压力,提高了效率和资源利用率

P2P模型实质上依然是C/S方式,A与B通信时A发送消息,B接收消息,A就是客户端,B就是服务端.

只不过没有了专门的服务器一说

2.可拓展性好

3.网络健壮性强,单个节点失效一般不会影响其他部分

4.拥塞网络等缺点导致目前ISP(Internet Server Provider互联网服务供应商)对P2P模式持反对态度

域名系统(DNS)

domain name system

采用客户/服务器模型,协议运行在UDP之上,采用53号端口

层次域名空间

域名命名规则

域名服务器

域名系统实际上是一个联机分布的数据库系统,采用C/S模型

域名到IP地址的解析实在域名服务器完成的

一个域名服务器所管辖的域名范围称为区,同一个区中的各个节点一定联通

每个区设置相应的权限域名服务器,保存该区中所有计算机域名到IP地址的映射

每个域名服务器还应当有连向其他域名服务器的信息,当某个域名不在自己的管辖范围内时本域名服务器应当知道去哪里解析

域名服务器的组织方式

域名服务器以层次方式组织

根域名服务器

最高层次的域名服务器,根域名服务器知道所有顶级域名服务器的IP地址

当本地域名服务器无法解析时首先询问根域名服务器

根域名服务器告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询

顶级域名服务器

管辖在该顶级域名服务器下注册的所有二级域名

当收到其他服务器的DNS查询请求时返回当前域名或者下一级域名服务器的IP地址

授权域名服务器

==每台主机==都必须在授权域名服务器处登记

为了可靠性,一台主机最好有两个以上的授权域名服务器(类似于留多个联系方式,方便找你)

许多域名服务器同时充当本地域名服务器和授权域名服务器

这句话我的理解是==路由器==

即充当本地主机向外网发起DNS查询请求的本地域名服务器的功能,

又起到了外网查询本机IP的授权域名服务器的功能

本地域名服务器

个人感觉类似局域网的域名服务器

任何主机发出DNS查询请求时都需要首先送到本地域名服务器

本地链接填写的IP地址就是本地域名服务器地址

本地域名服务器记录根域名服务器的地址

解析器

域名解析是把域名映射为IP地址或者把IP地址映射为域名的过程.

当客户端需要域名解析时,本地DNS客户端构造一个DNS请求报文以UDP数据包方式发往本地域名服务器

正向解析:域名映射为IP地址

反向解析:IP地址映射为域名

解析方式有两种:递归查询和递归与迭代相结合的查询

递归解析过程解析y.abc.com的IP地址

1.主机首先查询本机的高速缓存,没有找到y.abc.com的查询记录,于是将DNS解析请求报文发送给本地域名服务器.

2.本地域名服务器首先检查高速缓存,没有找到y.abc.com的查询记录,于是将DNS解析请求报文发送给根域名服务器

3.根域名服务器首先检查高速缓存,没有找到y.abc.com的查询记录,于是将DNS解析请求报文发送给.com顶级域名服务器

4..com顶级域名服务器高速缓存也没有,于是将DNS解析请求报文发送给.abc.com权限域名服务器

5..abc.com权限域名服务器下恰好有一个注册域名为y.abc.com的主机,于是返回该主机的IP地址给上级.com顶级域名服务器

6..com顶级域名服务器收到.abc.com权限域名服务器的返回IP之后将该IP再返回给根域名服务器,同时在高速缓存中记录该查询记录,方便下次查询时避免递归

7.根域名服务器将.com返回的IP地址再返回给本地域名服务器,同时在高速缓存中记录该查询

8.本地域名服务器收到根域名服务器返回的IP地址,将该IP地址返回给发起请求的主机,并在高速缓存中记录该查询

9.发起请求的主机最终得到了y.abc.com的IP地址,并在本机的高速缓存中记录该查询

高速缓存的作用?

如果主机刚才已经查询过y.abc.com的IP地址并且存储于高速缓存中,那么==不久后==的再次查询就可以直接从高速缓存中取记录,而不用再递归一大圈去找这个IP地址

为什么每一级服务器都需要高速缓存?

类似于记忆化搜索,本地域名服务器不一定只服务于一台主机,如果主机A,B都由本地域名服务器S提供服务,假设A解析了主机C,S会将C的IP地址存在高速缓存中,那么当B也需要查询C时本地域名服务器只需要返回刚才的记录

缺点:

不考虑高速缓存的作用,每一次跨本地域名服务器的DNS查询都需要根域名服务器的介入,而世界上只有13台根服务器,但是却要面对上亿的主机和查询,根服务器将会不堪重负

改进方法:递归+迭代

递归与迭代相结合的解析过程解析y.abc.com的IP地址

本地主机还是以解析y.abc.com的IP地址为例子,假设路径上服务器的高速缓存都没有存储该查询记录

1.本机向本地域名服务器发起DNS查询报文

2.本地域名服务器发现该DNS不在局域网内,需要向外网寻找,于是直接向根域名服务器发出请求

3.根服务器返回.com顶级服务器的IP地址

4.本地域名服务器收到.com的IP地址后向该.com顶级域名服务器发送请求

5..com顶级域名服务器返回.abc.com授权域名服务器地址

6.本地域名服务器收到.abc.com的IP地址后向该授权域名服务器发送请求

7..abc.com授权域名服务器返回y.abc.com的IP地址

8.本地域名服务器已经获得了y.abc.com的IP地址"我滴任务完成辣!啊哈哈哈哈",然后将该IP地址返回给发起请求的本机

相对于递归方式,递归+迭代的方式中,根服务器,顶级域名服务器等被询问的服务器都没法在高速缓存上记录这次查询,因为他们都是的==指路人==而不是==带路人==的作用.

文本传输协议FTP

File Transfer Protocol,因特网上使用最广泛的文件传输协议

功能:

1.兼容:不同种类(包括硬件软件)主机系统之间传输文件

2.权限:以用户权限管理的方式提供用户对远程FTP服务器上的文件管理能力

3.匿名共享:匿名FTP方式提供公用文件共享的negligence

FTP工作原理

采用C/S工作方式,使用TCP可靠的传输服务.

一个FTP服务器进程可以同时为多个客户进程提供服务(分时系统?)

FTP服务器进程分两大部分:

主进程:接受新的请求,处于一直监听的状态,只要有新的进程就立刻开一个从属进程来啊处理该请求

从属进程:处理单个请求

以主机A下载ftp://ftp.abc.edu.cn/file为例子描述工作过程

1.服务端开放21号端口,并监听这个端口,等待客户连接.

2.客户端开放随意端口连接到服务端的21号端口,建立控制连接

3.客户端通过控制连接发送下载文件的请求

控制信息时7位ASCII码格式

控制连接只用来控制,不用来传输

数据连接和控制连接并行,即使是传输过程中也可以通过控制连接发送停止请求中止数据传输

4.服务端接收到文件传输请求后,创建"数据传输进程"和"数据连接",在20号端口与客户端的任意端口(区别于客户端刚才开放的控制连接端口)建立数据连接并且传输客户端请求的文件

5.当客户端的一次数据传输请求被满足时,服务端立刻关闭20端口,断开数据连接.控制连接继续接收用户的传输请求

FTP服务特点:

1.提供不同种类的主机系统之间的文件传输能力

2.以用户权限管理的方式提供用户对远程FTP服务器上的文件的管理能力

3.以匿名FTP方式提供公用文件共享的能力.匿名用户只能从FTP服务器拷贝文件,不能上传或者修改文件,即只读模式

4.使用TCP协议.

5.一个FTP服务器进程可以同时为多个客户进程提供服务

6.带外传送,使用两种连接,控制连接和数据连接.分别占用21和20端口,其中数据连接传送完毕之后立刻断开,控制连接一直持续

7.服务器必须追踪用户在远程目录树上的当前位置

电子邮件

组成结构

异步通信方式,通信时双方都不需要在场

发送和接收实际是由邮件服务器完成的

用户的工作是通过用户代理命令邮件服务器完成工作

用户代理:

User Agent

"用户与电子邮件系统的接口"

说人话就是电子邮箱,比如qq邮箱.

用户发送邮件时在网络上的形象

人类在工作时的形象是工人,人类在教书时的形象是老师,人类在发送邮件时的形象是邮箱

显然这个用户代理能够实现人类希望的,最起码的写信,显示,处理信的功能

邮件服务器

电子邮件系统中的工具人儿,是用户代理的奴仆

作用是:

1.收发邮件

2.向用户代理报告邮件传送情况

采用C/S方式工作

一个邮件服务器本身是双料高级特工,在它==发送邮件时他是客户端C,==在它==接收邮件的时候,它是服务端S==

用实际生活中收发邮件做一个类比

实际生活中接收邮件是比较类似于网上这一套的,每天早上我们起床之后出门检查一下私人邮箱里面是否有东西,从家里走出来到邮箱取邮件这一段是我们亲历亲为的,没法生动地解释用户代理这个概念

并且对于发送邮件,实际生活中我们需要跑好远到邮局或者偶遇邮递员送信,但是网络上我们却用的与收信相同的邮箱.这是天壤之别.

为了方便理解这件事,我们虚构一个"现实":

1.我家有矿,收发邮件这种琐事怎么可能由我自己跑腿?雇一个管家专门代替我从屋门到邮箱这两三步的距离.

并且我不识字儿,写信也是我口述,管家代笔,我说错了要改,管家也不会烦,无条件服从我的命令.

收信我也不自己看,管家念给我听.

附近邻居家的情况与我相同

这个管家就比较类似与用户代理了

2.邮箱是==公共的==,并且这个邮箱好大,为每个用户都留了存放信件的地方,周围的邻居收发信件都通过这个邮箱,

每个邮箱都是邮局的功能,我发邮件不需要到邮局发,我只需要让管家写好信放在邮箱里.

每隔一段时间邮箱就会自己检查有没有待发送的邮件,

如果有,则召唤邮递员,让邮递员先不送信,屁颠屁颠地跑到目的地看看沿路能不能通,对方的邮箱能不能接收邮件

邮递员逛一圈回来报告都没有问题,邮箱就让邮递员正式送信

邮递员不管送信成功失败都会回来报告给邮箱,并且说明原因

3.邮箱有关于我的消息,比如新的邮件到达或者我发送的邮件成功或者失败等,==不会提醒我==.

只有当我想要了解邮箱有关我的状态时才会吩咐==管家==去邮箱看看==我的那一部分==,回来把消息说给我

这个邮箱就比较类似于邮件服务器了

记发送端邮件服务器为"客户端"

记接收端邮件服务器为"服务端"

==这两句很重要==

邮件发送协议SMTP

Simple Mail Transfer Protocol简单邮件传输协议

使用C/S方式,发送方为客户端,接收方为服务端.

使用TCP连接,接收方服务器开放端口号25

浏览器与基于万维网的邮件服务器(Gmail等)之间的邮件发送使用的是HTTP,相同的邮件服务器之间也是HTTP

只有不同邮件服务器之间传送邮件的时候才使用SMTP协议

多用途国际邮件扩充(MIME)

SMTP只能传送ASCII码,无法实现"添加附件"的功能,于是就有了MIME(Multipurpose Internet Mail Extensions)

MIME是基于SMTP的,本质上是将用户要发送的"附件"转化为7位ASCII码然后套用SMTP协议,接收方再将ASCII码翻译过来

MIME主要包括:

"推"

推的意思是发送方主动,接收方被动

用户代理向==客户端==发送邮件采用的是SMTP协议

客户端向服务端发送邮件采用的也是SMTP协议

邮件读取协议POP3

post office protocol邮局协议,邮件读取协议

3是指第三个版本

使用C/S方式,使用TCP连接,端口号110

拉的意思是发送方被动,接收方主动

"拉"

邮件发送过程:

1.用户通过用户代理写好信之后使用SMTP协议将邮件发送给==发送端邮件服务器==(后面称为==客户端==),客户端将该邮件放入自己的邮件缓存队列中等待发送

2.客户端定时检查邮件缓存队列,如果有邮件待发送,则向==接收端邮件服务器==(后面称==服务端==)发送TCP连接请求

3.TCP连接建立后SMTP客户端向SMTP服务端发送邮件,当SMTP客户端邮件缓存队列清空时,SMTP关闭TCP连接

4.服务端接收到邮件之后将邮件放入用户信箱

5.收信用户打算收信时,让用户代理去邮件服务器的用户信箱拉取邮件

电子邮件格式

\[ 电子邮件 \begin{cases} 信封\\ 内容 \begin{cases} 首部\\ 主体 \end{cases} \end{cases} \]

信封完全不用用户操心,信封是从信的内容首部提取信息填写的

内容首部

首部由首部行组成

首部行的格式是:键:值

发件人地址From,收件人地址To等是必须内容

主题Subject等是非必须内容

其中收件人地址,主题这种信息由用户手动填写,发件人地址和发件时间自动填写

From和To都是用户地址

hoopdog@hust.edu.cn

即 hoopdog at hust.edu.cn

即 位于hust.edu.cn的hoopdog

其中@后面的是邮件服务器地址,@前面的是用户名

需要确保的是,同一个邮件服务器管理的用户名不能有重名(这容易理解,班上有俩个张三的时候课代表也不知道把张三的作业本给哪个张三)

由此可见balabala@qq.com这个地址就是qq.com邮件服务器管理的balabala用户

==qq.com是邮件服务器==

万维网

万维网是无数网络站点和页面的集合,是因特网最主要的部分

因特网还包括电子邮件等

万维网的组成

world wide web:资料空间

万维网中有用的事物称为"资源" \[ 万维网内核 \begin{cases} 同一资源定位符(URL)\\ 超文本传输协议(HTTP)\\ 超文本标记语言(HTML) \end{cases} \] 万维网以C/S的方式工作,浏览器是万维网的客户端.万维网上资源文档所在的计算机时服务端

两者通信的流程:

1.万维网用户希望使用浏览器访问某个URL,与该URL所在的服务器建立连接,发送浏览请求

2.服务器把URL转换为文件路径,返回信息给客户端

3.通信完毕,关闭连接

统一资源定位符(URL)

负责标识万维网上的各种文档,使每个文档有唯一的标识符(链接地址)

一般形式:

1
<协议>://<主机>:<端口>/<路径>

其中端口和路径可以略去不写,整个URL不区分大小写

比如:

1
https://www.baidu.com/

https是协议

www.baidu.com是主机的DNS地址,实际上映射到220.181.38.251

常见的协议有http,ftp,https等

超文本传输协议HTTP

协议规定了

1.浏览器怎样想万维网服务器请求资源

2.服务器怎样把文档传给浏览器

即规定了怎么去和怎么回来

HTTP操作过程

1.客户端(浏览器)对要访问的www服务器请求DNS域名解析,获得该服务器IP地址

2.客户端通过TCP向服务器发起建立连接的请求,这是第一次握手

3.服务器在TCP的80端口监听到客户端发出的请求,与客户端建立连接,这是第二次握手

4.在客户端与服务器的第三次握手时客户端发送获取==服务器拥有的某个文件==的请求报文

5.服务器返回==该文件web页面的必须信息==(注意此时还没有完全返回该页面,只是返回了基本的框架,很多元素比如jpeg图片等需要后续继续请求才能发送)

6.客户端浏览器收到资源并解释,及时显示给用户

7.客户端一直发送请求直到页面加载完成,此时TCP连接断开

客户端向服务端发出的是请求,服务端向客户端发出的是响应

没有请求就没有响应,请求时客户端主动发出的,服务端不会多管闲事

请求和响应必须遵循规定的规则和格式,即HTTP

HTTP特点

1.本身无状态

服务器不会记录客户信息,任何客户不管第几次访问同一个页面时显示的内容都是相同的.这样设计的目的是减轻服务器的压力,使其支持大量并发的HTTP请求

Cookie+数据库获取用户历史浏览信息

后来引入Cookie技术之后,服务器只需要记录客户端的身份信息,客户自己的喜好,密码等等信息都存储在客户机器上,当客户端第一次访问某个服务器时,服务器在数据库中记录该客户端的身份信息.客户端自己记录自己的个人喜好和隐私信息.

当客户端下一次访问这个服务器时,服务器就能从数据库记录中知道这个客户曾经来过,然后可以根据客户cookie获得客户喜好了

这时状态是来自cookie的辅助,与http本身无状态不矛盾

2.传输层协议使用TCP

3.既可以使用非持久连接,也可以使用持久连接

非持久连接:对于客户端的每一个请求,服务器返回响应后立刻断开TCP连接

持久连接:服务器对于客户端的请求返回响应之后并不立刻断开TCP连接,而是等待下一次请求,直到客户端发出停止连接的要求或者连接失败

持久连接的两种方式:

流水线方式:请求是串行的,客户端发出A请求,必须收到服务端的响应之后才可以发出下一个B请求

非流水线方式:请求是并行的,客户端一股脑发出多个请求,剩下的任务就是接收服务端的多个响应

HTTP报文结构

HTTP面向文本,报文由ASCII码字符串组成

报文由两类:请求报文和响应报文

两种报文都是由三部分组成:

开始行,首部行,实体主题

区别在于开始行不同

请求报文的开始行是请求行

响应报文的开始行是状态行

请求报文

请求行=请求用到的方法+space+请求资源的URL+space+HTTP版本号+回车换行

请求方法作用于请求对象

请求常用方法:

响应报文