
2.2 应用层协议
计算机通信实质上是计算机上的应用程序通信,通常由客户端程序向服务端程序发起通信请求,服务端程序向客户端程序返回响应,实现应用程序的功能。
互联网中有很多应用,如访问网站、域名解析、发送电子邮件、接收电子邮件、文件传输等。每一种应用都需要规定好客户端程序能够向服务端发送哪些请求、服务端程序能够向客户端返回哪些响应、客户端向服务端发送请求(命令)的顺序、出现意外后如何处理、发送请求和响应的报文有哪些字段、每个字段的长度、每个字段的值代表什么意思。这些规定就是应用程序通信使用的协议,这些应用程序通信使用的协议被称为应用层协议。
既然是协议,就有甲方和乙方,通信的客户端程序和服务端程序就是协议的甲方和乙方,在很多计算机网络的书中称其为对等实体,如图2-11所示。

图2-11 应用层协议
下面列出了TCP/IPv4协议栈中常见的应用层协议及其用途。
■超文本传输协议(HyperText Transfer Protocol,HTTP)用于访问Web服务。
■安全的超文本传输协议(HyperText Transfer Protocol over Secure Socket Layer,HTTPS)能够将HTTP通信进行加密传输。
■简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)用于发送电子邮件。
■邮局协议版本3 (Post Office Protocol 3,POP3)用于接收电子邮件。
■域名解析协议(Domain Name System,DNS)用于域名解析。
■文件传输协议(File Transfer Protocol,FTP)用于在Internet上传和下载文件。
■远程登录协议(Telnet)用于远程配置网络设备、Linux系统和Windows系统。
■动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)用于计算机或其他网络设备自动配置IP地址、子网掩码、网关和DNS等。
下面通过抓包分析访问网站的流量与文件传输的流量来观察应用层协议(以HTTP与FTP为例)的工作过程,即客户端和服务端的交互过程、客户端向服务端发送的请求、服务端向客户端发送的响应、请求报文格式、响应报文格式,进而帮助读者理解应用层协议。
2.2.1 HTTP
HTTP是互联网中应用最为广泛的应用层协议。本小节通过抓包分析HTTP,查看客户端(浏览器)向Web服务器发送的请求(命令)、Web服务器向客户端返回的响应(状态代码),以及请求报文和响应报文的格式。HTTP实现Web浏览器访问Web服务器的示意图如图2-12所示。

图2-12 HTTP实现Web浏览器访问Web服务器示意
1.HTTP的主要内容
为了便于读者理解,下面以租房协议的格式展示HTTP(仅展示其主要内容)。
HTTP
甲方: Web服务器
乙方: Web浏览器
HTTP是用于从万维网(World Wide Web,WWW)服务器传输超文本到本地浏览器的传送协议。HTTP是TCP/IPv4协议栈的一个应用层协议,用来传送HTML文件、图片文件、查询结果等。
HTTP工作于客户端-服务端架构之上。浏览器作为HTTP客户端,通过统一资源定位器(Uniform Resource Locator,URL)(这里指在浏览器输入的网址)向HTTP服务端(即Web服务器)发送所有请求。Web服务器收到请求后,向客户端发送响应信息。
协议条款如下。
一、HTTP请求、响应的步骤
1.客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认使用TCP的80端口)建立一个TCP套接字连接。
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3.Web服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源副本写到TCP套接字,由客户端读取。一个响应报文由状态行、响应头部、空行和响应数据4部分组成。
4.释放TCP连接
若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头部,响应头部告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
二、请求报文格式
由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码,因而各个字段的长度都是不确定的。如图2-13所示,HTTP请求报文由3部分组成,即请求行、首部行和实体主体。图中的“CR”和“LF”分别代表“回车”和“换行”。
1.请求行
请求行用于表明是请求报文。行的3个字段之间都以空格分隔开。
2.首部行
用来说明浏览器、服务器或报文主体的一些信息。首部可以有多行,也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。

图2-13 HTTP报文格式
3.实体主体
在请求报文中一般不用这个字段。
三、HTTP请求报文中的方法
浏览器能够向Web服务器发送以下8种请求方法(有时也叫“动作”或“命令”)来表明Request-URL指定的资源的不同操作方式。
■GET:请求获取Request-URL所标识的资源。在浏览器的地址栏中输入网址访问网页时,浏览器采用GET方法向服务器请求网页。
■POST:在Request-URL所标识的资源后附加新的数据,要求被请求服务器接受附在请求后面的数据,常用于提交表单。比如向服务器提交信息、发帖、登录。
■HEAD:请求获取由Request-URL所标识的资源的响应消息报头。
■PUT:请求服务器存储一个资源,并用Request-URL作为其标识。
■DELETE:请求服务器删除Request-URL所标识的资源。
■TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
■CONNECT:用于代理服务器。
■OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法时,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法时,应当返回状态码501(Not Implemented)。
四、响应报文格式
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。如图2-14所示,状态行包括3项内容,即HTTP的版本、状态码以及解释状态码的简单短语。

图2-14 响应报文格式
五、HTTP响应报文状态码
状态码(Status-Code)都是3位数字的,共33种,分为5大类,介绍如下。
■lxx表示通知信息,如请求收到了或正在进行处理。
■2xx表示成功,如接受或知道了。
■3xx表示重定向,如要完成请求还必须采取进一步的行动。
■4xx表示客户端错误,如请求中有错误的语法或不能完成。
■5xx表示服务器的差错,如服务器失效无法完成请求。
下面3种状态行在响应报文中是经常见到的。
■HTTP/1.1 202 Accepted(接受)。
■HTTP/1.1 400 Bad Request(错误的请求)。
■HTTP/1.1 404 Not Found(找不到)。
综上可知,HTTP定义了浏览器访问Web服务器的步骤、能够向Web服务器发送哪些请求(方法)、HTTP请求报文格式(有哪些字段,分别代表什么意思),还定义了Web服务器能够向浏览器发送哪些响应(状态码)、HTTP响应报文格式(有哪些字段,分别代表什么意思)。
举一反三,其他的应用层协议也需要定义以下内容。
■客户端能够向服务器发送哪些请求(方法或命令)。
■客户端和服务器命令交互顺序,比如POP3协议,需要先验证用户身份才能收邮件。
■服务器有哪些响应(状态代码),每种状态代码代表什么意思。
■定义协议中每种报文的格式。报文包含哪些字段,字段是定长还是变长,如果是变长,字段分割符是什么,都要在协议中定义。
2.抓包分析HTTP
在计算机中安装抓包工具可以捕获网卡发出和接收的数据包,当然也能捕获应用程序通信的数据包。这样就可以直观地看到客户端和服务器的交互过程,即客户端发送了哪些请求、服务器返回了哪些响应。这就是应用层协议的工作过程。
如图2-15所示,在显示筛选器处输入“http and ip.addr == 202.206.100.34”,单击,应用显示筛选器,此时只显示http请求和响应的数据包。选中第1396个数据包,可以看到该数据包中的HTTP请求报文,可以与前面介绍的HTTP请求报文格式进行对比,请求方法是GET。

图2-15 HTTP请求报文GET方法
第1440个数据包是Web服务器响应数据包,状态代码为404。状态代码404代表“找不到”(Not Found)。
如图2-16所示,第11626个数据包是HTTP响应报文,状态代码为200,表示成功处理了请求,一般情况下都是返回此状态代码。可以将该响应报文与前面介绍的HTTP响应报文格式进行对比。

图2-16 HTTP响应报文
HTTP不仅定义了客户端使用GET方法请求网页,还定义了其他很多方法,比如在浏览器向服务器提交内容、登录网站、搜索网站等过程中就需要使用POST方法。针对刚才搜索网站输入的内容,在显示筛选器处输入“http.request.method == POST”,单击,应用显示筛选器,如图2-17所示,可以看到第19390个数据包,客户端使用POST方法将搜索的内容提交给了Web服务器。

图2-17 HTTP中的POST方法
2.2.2 FTP
FTP是因特网中使用广泛的文件传输协议,用于在Internet上控制文件的双向传输。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议传输文件。FTP屏蔽了各计算机系统的细节,可以减小或消除在不同系统下处理文件的不兼容性,因而适合在不同操作系统之间传送文件。FTP只提供文件传送的一些基本服务,它使用TCP实现可靠传输。
在使用FTP的过程中,用户会遇到两个概念:“下载”(Download)和“上传”(Upload)。“下载”文件就是从远程主机复制文件至自己的计算机上,“上传”文件就是将文件从自己的计算机中复制至远程主机上。下面通过抓包来分析FTP工作的过程。
在虚拟机中安装Windows Server 2012 R2服务器,安装FTP服务,在客户端(Windows 10)利用抓包工具分析FTP客户端访问FTP服务器的数据包,观察FTP客户端访问FTP服务器的交互过程,可以看到客户端向服务器发送的请求,以及服务器向客户端返回的响应。在FTP服务器上设置禁止FTP的某些方法,以实现FTP服务器的安全访问,比如禁止删除FTP服务器上的文件。
在FTP客户端运行抓包工具开始抓包后,上传一个test.txt文件,将其重命名为abc.txt,最后删除FTP上的abc.txt文件。抓包工具会捕获FTP客户端发送的全部命令以及FTP服务器返回的全部响应。如图2-18所示,右击其中的一个FTP数据包,单击“跟踪流”→“TCP流”,会出现图2-19所示的窗口,将FTP客户端访问FTP服务器所有的交互过程产生的数据整理到一起,可以看到FTP中的方法,其中,STOR方法可上传test.txt文件,CWD方法可改变工作目录,RNFR方法可重命名test.txt文件,DELE方法可删除abc.txt文件。使用抓包工具还可看到FTP的其他方法,如使用FTP客户端在FTP服务器上创建文件夹、删除文件夹、下载文件等操作对应的方法。

图2-18 跟踪流
为了防止客户端进行某些特定操作,可以设置FTP服务器禁止FTP中的一些命令。比如禁止FTP客户端删除FTP服务器上的文件,可以设置FTP服务请求筛选,禁止DELE方法。如图2-20所示,单击“FTP请求筛选”。
如图2-21所示,在出现的“FTP请求筛选”界面中单击“命令”标签,单击“拒绝命令”,在弹出的“拒绝命令”对话框中输入“DELE”,单击“确定”按钮。

图2-19 FTP客户端访问FTP服务器的交互过程
在Windows 10上再次删除FTP服务器上的文件,就会出现提示“500 Command not allowed”(命令不被允许执行),如图2-22所示。

图2-20 管理FTP请求筛选

图2-21 禁用DELE方法

图2-22 命令不被允许执行