前言
本文基于王道考研课程、湖科大计算机网络课程教学内容以及 计算机网络(第八版),系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。
往期内容
核心知识记忆点+理解性说明
第六章 应用层
1.网络应用模型
A.客户/服务器模型
B.P2P模型
两种模型熟悉了解即可。
2.域名系统(DNS)
A.层次域名空间
用户与互联网上某台主机通信时,必须要知道对方的IP地址。然而用户很难记住长达32位的二进制主机地址。即使是点分十进制IP地址也并不太容易记忆。但在应用层为了便于用户记忆各种网络应用,连接在互联网上的主机不仅有IP地址,而且还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机名字转换为IP地址。
为什么机器在处理IP数据报时要使用IP地址而不使用域名呢?这是因为IP地址的长度是固定的32位(如果是IPv6地址,那就是128位,也是定长的),而域名的长度并不是固定的,机器处理起来比较困难。
从理论上讲,整个互联网可以只使用一个域名服务器,使它装入互联网上所有的主机名,并回答所有对 IP地址的查询。然而这种做法并不可取。因为互联网规模很大,这样的域名服务器肯定会因过负荷而无法正常工作,而且一旦域名服务器出现故障,整个互联网就会瘫痪。
互联网的域名系统 DNS 被设计成为一个联机分布式数据库系统,并采用客户服务器方式。DNS 使大多数名字都在本地进行解析(resolve)1,仅少量解析需要在互联网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机出了故障,也不会妨碍整个DNS系统的正常运行。
域名到IP地址的解析是由分布在互联网上的许多域名服务器程序(可简称为域名服务器)共同完成的。域名服务器程序在专设的节点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。
域名到IP地址的解析过程的要点如下:当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析程序(resolver),并成为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器(使用UDP是为了减少开销)。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程获得目的主机的IP地址后即可进行通信。
若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS中的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。
DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符(但为了记忆方便,最好不要超过12个字符),也不区分大小写字母(例如,CCTV或cctv在域名中是等效的)。标号中除连字符(-)外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的顶级域名则写在最右边。由多个标号组成的完整域名总共不超过255个字符。DNS 既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查找域名的机制。
需要注意的是,域名只是个逻辑概念,并不代表计算机所在的物理地点。
原先的顶级域名共分为三大类:
(1)国家顶级域名nTLD:采用ISO 3166的规定。如:cn表示中国,us表示美国,uk表示英国,等等。国家顶级域名又常记为 ccTLD(cc 表示国家代码 country-code)。
(2)通用顶级域名gTLD。最先确定的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利性组织),int(国际组织),edu(美国专用的教育机构),gov(美国的政府部门),mil表示(美国的军事部门)。以后又陆续增加了13个通用顶级域名:aero(航空运输企业),asia(亚太地区),biz(公司和企业),cat(使用加泰隆人的语言和文化团体),coop(合作团体),info(各种情况),jobs(人力资源管理者),mobi(移动产品与服务的用户和提供者),museum(博物馆),name(个人),pro(有证书的专业人员),tel(Telnic股份有限公司),travel(旅游业)。
(3)基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此又称为反向域名。
我国把二级域名划分为"类别域名"和"行政区域名"两大类。
"类别域名"共7个,分别为:ac(科研机构),com(工、商、金融等企业),edu(中国的教育机构),gov(中国的政府机构),mil(中国的国防机构),net(提供互联网络服务的机构),org(非营利性的组织)。
"行政区域名"共34个,适用于我国的各省、自治区、直辖市。例如:bj(北京市),js(江苏省),等等。
这里还要强调指出,互联网的名字空间是按照机构的组织来划分的,与物理的网络无关,与IP地址中的"子网"也没有关系。
B.域名服务器
一个服务器所负责管辖的(或有权限的)范围叫作区(zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器(authoritative name server),用来保存该区中的所有主机的域名到IP地址的映射。总之,DNS服务器的管辖范围不是以"域"为单位,而是以"区"为单位的。区是DNS服务器实际管辖的范围。区可能等于或小于域,但一定不能大于域。
根据域名服务器所起的作用,可以把域名服务器划分为以下四种不同的类型:
(1)根域名服务器(root name server):根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。根域名服务器是最重要的域名服务器,因为不管是哪一个本地域名服务器,若要对互联网上任何一个域名进行解析(即转换为IP地址),只要自己无法解析,就首先要求助于根域名服务器。
由于根域名服务器采用了任播(anycast)技术(任播的IP数据报的终点是一组在不同地点的主机,但具有相同的IP地址。IP数据报交付离源点最近的一台主机),因此当DNS客户向某个根域名服务器的IP地址发出查询报文时,互联网上的路由器就能找到离这个DNS客户最近的一个根域名服务器。这样做不仅加快了DNS的查询过程,也更加合理地利用了互联网的资源。
需要注意的是,在许多情况下,根域名服务器并不直接把待查询的域名直接转换成 IP地址(根域名服务器也没有存放这种信息),而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
(2)顶级域名服务器(即TLD服务器):这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的IP地址)。
(3)权限域名服务器:这就是前面已经讲过的负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS 客户,下一步应当找哪一个权限域名服务器。例如区 abc.com和区 y.abc.com 各设有一个权限域名服务器。
(4)本地域名服务器(local name server):本地域名服务器并不属于域名服务器层次结构,但它对域名系统非常重要。当一台主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器。由此可看出本地域名服务器的重要性。每一个互联网服务提供者 ISP,或一个大学,甚至一个大学里的系,都拥有一个本地域名服务器,本地域名服务器离用户较近,一般不超过几个路由器的距离。当所要查询的主机也属于同一个本地 ISP时,该本地域名服务器立即就能将所查询的主机名转换为它的IP地址,而不需要再去询问其他的域名服务器。
为了提高域名服务器的可靠性,DNS域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器(master name server),其他的是辅助域名服务器(secondary name server)。当主域名服务器出故障时,辅助域名服务器可以保证DNS的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性。
C.域名解析过程
第一,主机向本地域名服务器的查询一般都采用递归查询(recursive query)。
第二,本地域名服务器向根域名服务器的查询通常采用迭代查询(iterative query)。
假定域名为m.xyz.com的主机想知道另一台主机(域名为y.abc.com)的IP地址。例如,主机m.xyz.com打算发送邮件给主机 y.abc.com。这时就必须知道主机y.abc.com的IP地址。
下面是几个查询步骤:
1 主机m.xyz.com先向其本地域名服务器dns.xyz.com进行递归查询。
2 本地域名服务器采用迭代查询。它先向一个根域名服务器查询。
3 根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器 dns.com的 IP地址。
4 本地域名服务器向顶级域名服务器dns.com进行查询。
5 顶级域名服务器 dns.com 告诉本地域名服务器,下一次应查询的权限域名服务器dns.abc.com的IP地址。
6 本地域名服务器向权限域名服务器dns.abc.com进行查询。
7 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
8 本地域名服务器最后把查询结果告诉主机m.xyz.com。
这8个步骤总共要使用8个UDP用户数据报的报文。本地域名服务器经过三次迭代查询后,从权限域名服务器dns.abc.com得到了主机y.abc.com的IP地址,最后把结果返回给发起查询的主机m.xyz.com。
本地域名服务器采用递归查询的情况。在这种情况下,本地域名服务器只需向根域名服务器查询一次,后面的几次查询都是在其他几个域名服务器之间进行的(步骤3至6)。只是在步骤7,本地域名服务器从根域名服务器得到了所需的IP地址。最后在步骤8,本地域名服务器把查询结果告诉主机m.xyz.com。整个的查询也是使用8个UDP报文。
由于名字到地址的绑定 并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项目(例如,每个项目只存放两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器中获取绑定信息。当权限域名服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名转换的准确性。不但在本地域名服务器中需要高速缓存,在主机中也很需要。许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机自然应该定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删掉无效的项。由于域名改动并不频繁,大多数网点不需花太多精力就能维护数据库的一致性。
3.文件传输协议(FTP)
A.FTP的工作原理
基于TCP的FTP和基于UDP的简单文件传送协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必
须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。
文件传送协议FTP只提供文件传送的一些基本的服务,它使用TCP可靠的运输服务。
FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
FTP使用客户服务器方式。一个FTP服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。
主进程的工作步骤如下:
(1)打开熟知端口(端口号为21),使客户进程能够连接上。
(2)等待客户进程发出连接请求。
(3)启动从属进程处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。
(4)回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发进行的。
文件传送协议FTP只提供文件传送的一些基本的服务,它使用TCP可靠的运输服务。
FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
FTP使用客户服务器方式。一个FTP服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。
主进程的工作步骤如下:
(1)打开熟知端口(端口号为21),使客户进程能够连接上。
(2)等待客户进程发出连接请求。
(3)启动从属进程处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。
(4)回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发进行的。
B.控制连接与数据连接
图中的服务器端有两个从属进程:控制进程和数据传送进程。为简单起见,服务器端的主进程没有画上。客户端除了控制进程和数据传送进程外,还有一个用户界面进程用来和用户接口。
在进行文件传输时,FTP的客户和服务器之间要建立两个并行的TCP连接:"控制连接"和"数据连接"。控制连接在整个会话期间一直保持打开,FTP客户所发出的传送请求,通过控制连接发送给服务器端的控制进程,但控制连接并不用来传送文件。实际用于传输文件的是"数据连接"。服务器端的控制进程在接收到FTP客户发送来的文件传输请求后就创建"数据传送进程"和"数据连接",用来连接客户端和服务器端的数据传送进程。数据传送进程实际完成文件的传送,在传送完毕后关闭"数据传送连接"并结束运行。由于FTP使用了一个分离的控制连接,因此FTP的控制信息是带外(out of band)传送的。

当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口 20 与客户进程所提供的端口号建立数据传送连接。由于FTP使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。
4.电子邮件(E-mail)
A.电子邮件系统的组成结构
按照客户服务器方式工作。邮件服务器需要使用两种不同的协议。一种协议用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,如SMTP协议,而另一种协议用于用户代理从邮件服务器读取邮件,如邮局协议POP3。
这里应当注意,邮件服务器必须能够同时充当客户和服务器。例如,当邮件服务器A向另一个邮件服务器B发送邮件时,A就作为SMTP客户,而B是SMTP服务器。反之,当B向A发送邮件时,B就是SMTP客户,而A就是SMTP服务器。
请注意,SMTP和POP3(或IMAP)都是使用TCP连接来传送邮件的,使用TCP的目的是为了可靠地传送邮件。
这里有两种不同的通信方式。一种是"推"(push):SMTP 客户把邮件"推"给SMTP服务器。另一种是"拉"(pull):POP3 客户把邮件从POP3服务器"拉"过来。
电子邮件由信封(envelope)和内容(content)两部分组成。电子邮件的传输程序根据邮件信封上的信息来传送邮件。这与邮局按照信封上的信息投递信件是相似的。
在邮件的信封上,最重要的就是收件人的地址。TCP/IP 体系的电子邮件系统规定电子邮件地址(E-mail address)的格式如下:
用户名@邮件服务器的域名
在式中,符号"@"应读作"at",表示"在"的意思。例如,在电子邮件地址"xyz@abc.com"中,"abc.com"就是邮件服务器的域名,而"xyz"就是在这个邮件服务器中收件人的用户名,也就是收件人邮箱名,是收件人为自己定义的字符串标识符。
我们知道,用户在浏览器中浏览各种信息时需要使用HTTP协议。因此,在浏览器和互联网上的邮件服务器之间传送邮件时,仍然使用HTTP协议。但是在各邮件服务器之间传送邮件时,则仍然使用SMTP协议。
B.电子邮件格式与MIME
C.SMTP与POP3
发件人的邮件送到发送方邮件服务器的邮件缓存后,SMTP客户就每隔一定时间(例如30分钟)对邮件缓存扫描一次。如发现有邮件,就使用SMTP的熟知端口号码25与接收方邮件服务器的 SMTP 服务器建立 TCP 连接。在连接建立后,接收方 SMTP服务器要发出"220 Service ready"(服务就绪)。然后SMTP客户向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP 服务器若有能力接收邮件,则回答:"250 OK",表示已准备好接收。若SMTP服务器不可用,则回答"421 Service not available"(服务不可用)。如在一定时间内(例如三天)发送不了邮件,邮件服务器会把这个情况通知发件人。
SMTP 不使用中间的邮件服务器。
已经广泛使用多年的SMTP存在着一些缺点。例如,发送电子邮件不需要经过鉴别。这就是说,在FROM 命令后面的地址可以任意填写。这就大大方便了垃圾邮件的作者,给收信人添加了麻烦(有人估计,在全世界所有的电子邮件中,垃圾邮件至少占到50%以上,甚至高达90%)。又如,SMTP本来就是为传送ASCI码而不是传送二进制数据设计的。虽然后来有了MIME可以传送二进制数据(见后面6.5.6节的介绍),但在传送非ASCII码的长报文时,在网络上的传输效率是不高的。此外,SMTP传送的邮件是明文,不利于保密。
5.万维网(WWW)
A.WWW的概念与组成结构
URL 实际上就是在互联网上的资源的地址。URL 的一般形式由以下四个部分组成:
协议://主机名:端口/路径
使用协议HTTP的URL最常用的形式是把":端口"省略:
http:// 主机名/路径
B.HTTP
从层次的角度看,HTTP是面向事务(所谓事务(transaction)就是指一系列的信息交换,而这一系列的信息交换是一个不可分割的整体,也就是说,要么所有的信息交换都完成,要么一次交换都不进行)的(transaction-oriented)应用层协议。
HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,协议HTTP本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。
协议HTTP 是无状态的(stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
下面我们粗略估算一下,从浏览器请求一个万维网文档到收到整个文档所需的时间。用户在点击鼠标链接某个万维网文档时,协议HTTP首先要和服务器建立TCP连接。这需要使用三报文握手。当建立TCP连接的三报文握手的前两个报文完成后(即经过了一个RTT时间后),万维网客户就把HTTP请求报文,作为建立TCP连接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求报文后,就把所请求的文档作为响应报文返回给客户。
请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成
正比)加上两倍往返时间RTT(一个RTT用于连接TCP连接,另一个RTT用于请求和接收万维网文档。TCP建立连接的三报文握手的第三个报文段中的数据,就是客户对万维网文档的请求报文)。

另一种开销就是万维网客户和服务器每一次建立新的TCP 连接都要分配缓存和变量。特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。好在浏览器都能够打开5~10个并行的TCP连接,而每一个TCP连接处理客户的一个请求。因此,使用并行TCP连接可以缩短响应时间。
协议HTTP/1.1 的持续连接有两种工作方式,即非流水线方式(without pipelining)和流水线方式(with pipelining).
代理服务器(proxy server)是一种网络实体,它又称为万维网高速缓存(Web cache)。代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去互联网访问该资源。代理服务器可在客户端或服务器端工作,也可在中间系统上工作。
校园网使用代理服务器的情况。这时,访问互联网的过程是这样的:
(1)校园网的计算机中的浏览器向互联网的服务器请求服务时,就先和校园网的代理服务器建立TCP连接,并向代理服务器发出HTTP请求报文。
(2)若代理服务器已经存放了所请求的对象,代理服务器就把这个对象放入HTTP响应报文中返回给计算机的浏览器。
(3)否则,代理服务器就代表发出请求的用户浏览器,与互联网上的源点服务器(origin server)建立TCP连接,并发送HTTP请求报文。
(4)源点服务器把所请求的对象放在HTTP响应报文中返回给校园网的代理服务器。
(5)代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后用),然后再把这个对象放在HTTP响应报文中,通过已建立的TCP连接,返回给请求该对象的浏览器。
我们注意到,代理服务器有时是作为服务器(当接受浏览器的HTTP请求时),但有时却作为客户(当向互联网上的源点服务器发送HTTP请求时)。
HTTP 有两类报文:
(1)请求报文 -- 从客户向服务器发送请求报文。
(2)响应报文 -- 从服务器到客户的回答。
1xx 表示通知信息,如请求收到了或正在进行处理。
2xx表示成功,如接受或知道了。
3xx 表示重定向,如要完成请求还必须采取进一步的行动。
4xx 表示客户的差错,如请求中有错误的语法或不能完成。
5xx 表示服务器的差错,如服务器失效无法完成请求。

结语
应用层作为网络服务的终极呈现,以协议为基石、服务为核心,架起了人机交互与资源流通的立体桥梁。从DNS的层次解析到HTTP的请求响应,从电子邮件的推拉传输到FTP的双连接协作,每一项设计都在为网络应用的顺畅运行铺平道路。客户/服务器与P2P的模型对比、域名空间的树状划分、协议端口的服务绑定,共同诠释了应用层"集传输之能,赋网络以用"的核心价值。
在DNS的分布式查询中,我们看到了层次管理与迭代递归的协作之美;在HTTP的无状态连接里,我们领悟了持久化与缓存加速的效率之智。SMTP的邮件推送、POP3的邮件拉取、FTP的数据与控制分离,无不体现着应用协议对场景需求的精准适配与结构化设计。无论是URL的统一定位,还是MIME的格式扩展,细节之处皆是实用主义与工程智慧的结晶。
写在最后
当你合上以上厚重的笔记,画下最后一个知识点的句号时,你已经走完了这段漫长而孤独的旅程中最扎实的一步。
计算机网络的世界,从物理层的比特流淌到应用层的智慧绽放,你已一步步丈量。这不仅是知识的积累,更是一场逻辑与耐心的修炼。你已为自己架设好了通往更高殿堂的桥梁,端口已经打开,协议已然就绪,只待你发送那封名为"未来"的请求,并终将收到成功的确认。
考研,是结束,更是开始。你为之奋斗的,从来不止是一张试卷,而是一个更广阔的可能性入口。请相信,这一路积累的韧性、学到的思维方法,远比分数本身更加持久。
此去关山万里,前程必定似锦。我们暂时在此告别,但知识的世界后会有期。
祝各位读者笔下生花,得偿所愿,一战成硕!
我们,更高处见。
参考资料
1.王道考研课程
3.计算机网络(第八版)