应用层协议
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文,包括:
- 交换的报文类型;
- 各种报文类型的语法;
- 字段的语义;
- 确定一个进程何时以及如何发送报文、对报文进行相应的规则。
HTTP
Web的应用层协议是超文本传输协议(HTTP),它定义了Web客户向Web服务器请求Web页面、服务器向客户传输Web页面的方式。HTTP使用TCP作为支撑运输协议,由于HTTP服务器向客户发送被请求的文件而不会保存任何关于客户的信息,所以HTTP是一个无状态协议。
Web页面
Web页面(文档)是由对象组成的,一个对象是一个文件,如一个HTML文件、JPEG图形、视频等,多数Web页面含有一个HTML基本文件和几个引用对象,HTML基本文件通过对象的URL地址引用页面中的其他对象,每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名。
Web浏览器实现了HTTP的客户端;而Web服务器实现了HTTP的服务端,用于存储Web对象,每个对象由URL寻址。
非持续连接和持续连接
非持续连接是每个请求/相应对经一个单独的TCP连接发送,每次请求/响应都要重新建立连接;持续连接是所有的请求及其响应经相同的TCP连接发送,在客户与服务器建立连接后保持TCP连接打开,后续的请求和响应报文能经过相同连接传送。HTTP 1.0不支持持续连接;HTTP 1.1以上在默认方式下使用持续连接。
HTTP报文格式
HTTP请求报文主要包含以下部分:
- 请求行:包括3个字段:方法字段(GET、POST、HEAD、PUT、DELETE)、URL字段和HTTP版本字段。方法字段中的HEAD方法被服务器收到后会用一个HTTP报文进行响应,但是不返回请求对象,主要用于调试跟踪;PUT方法用于上传对象到指定的Web服务器上的路径;DELETE方法用于删除Web服务器上的对象。
- 首部行:主要包括:Host指明对象所在的主机;Connection表示连接方式(如持续连接或关闭连接);User-agent表示用户代理(浏览器类型);Accept-language表示对象的语言版本。
- 实体:用于提供输入数据,使用GET方法没有实体,使用POST方法有实体。GET方法一般在URL中包含输入的数据。
HTTP响应报文主要包含以下部分:
- 状态行:包括协议版本、状态码、响应状态信息。
- 首部行:主要包括:Connection表示连接方式(如持续连接或关闭连接);Date表示首部行指示服务器产生并发送该响应报文的日期和时间;Server表示服务器类型,类似于请求报文中的User-Agent;Last-Modified表示对象创建或最后修改的日期和时间;Content-Length表示被发送对象的字节数;Content-Type表示实体中的对象类型。
常见状态码有:
- 200(OK):请求成功;
- 301(Move Permanently):请求对象永久转移,新的URL在响应报文的Location首部行中,客户将自动获取;
- 400(Bad Request):请求不能被服务器理解,如报文格式错误;
- 404(Not Found):被请求的文档不在服务器上;
- 505(HTTP Version Not Supported):服务器不支持请求报文使用的HTTP协议版本。
Cookie
Cookie用于站点对用户进行跟踪,包含4个组件:
- HTTP响应报文中的cookie首部行;
- HTTP请求报文中的cookie首部行;
- 用户主机中保留的cookie文件,由用户浏览器进行管理;
- Web站点的后端数据库。
当请求报文到达Web服务器时,该Web站点产生一个唯一识别码,并以此作为索引在它的后端数据库产生一个表项,接下来服务器用一个包含Set-cookie首部(含有识别码)的HTTP响应报文对浏览器进行响应,浏览器接收到该HTTP响应报文时,在它管理的cookie文件中添加一行,包含Set-cookie首部中的识别码;
用户下一次浏览相同网站时,每请求一个Web页面,浏览器就会查询cookie文件并抽取对应这个网站的识别码放到HTTP请求报文的cookie首部行中,服务器就可以根据识别码跟踪用户在该站点的活动及状态信息(如登录状态、购物车等)。
因此cookie可以在无状态的HTTP之上建立一个用户会话层。
Web缓存
Web缓存器也叫代理服务器,是能够代表初始Web服务器来满足HTTP请求的网络实体。它具有自己的磁盘存储空间,用于保存最近请求过的对象副本。配置了Web缓存器的浏览器在请求对象时会首先被定向到Web缓存器,如下:
- 浏览器与Web缓存器建立TCP连接,并发送HTTP请求报文请求某一对象;
- Web缓存检查本地是否存储了对象副本,有则向浏览器用HTTP响应报文返回对象;
- 无则与该对象的初始服务器建立TCP连接,并发送HTTP请求;
- 初始服务器收到请求后向Web缓存器发送具有该对象的HTTP响应;
- Web缓存器接收到该对象后在本地存储空间存储一份副本,并向浏览器用HTTP响应报文发送该副本。
在以上过程中,Web缓存器既是服务器又是客户。使用Web缓存器可以减少对客户请求的响应时间、减低因特网上的Web流量。
条件GET方法
条件GET方法是HTTP协议中允许缓存器证实它的对象是最新的机制,条件GET请求报文是包含If-Modified-Since首部行并使用GET方法的请求报文,它告诉服务器:仅当自指定日期之后该对象被修改过才发送该对象。
HTTP 1.0 & 1.1 & 2.0
- HTTP 1.0 不支持持久连接;HTTP 1.1默认使用持久连接(keep-alive);
- HTTP 1.1 支持分块传输编码,允许在不确定内容长度的情况下传输数据。
- HTTP 1.1 支持带宽优化,例如断点续传,允许客户端请求部分资源。
- HTTP 1.1 引入了Host头部字段,允许多个域名共享同一个IP地址
- HTTP 1.0 中引入了基本的缓存头部字段,如If-Modified-Since和Expires;HTTP 1.1 引入了更多的缓存控制头部字段,如Cache-Control;
————————————————
- HTTP 2.0 采用二进制分帧,将数据帧分成二进制格式传输,取代了HTTP/1.x的文本格式,提高了解析效率和传输性能。
- HTTP 2.0 支持多路复用,允许在一个TCP连接上并发多个请求和响应,消除了HTTP/1.x中队头阻塞的问题。
- HTTP 2.0 支持头部压缩,使用HPACK算法对头部字段进行压缩,减少了头部数据的传输量。
- HTTP 2.0 支持服务器推送, 服务器可以主动向客户端推送资源,而不需要客户端明确请求,从而减少延迟。
- HTTP 2.0 支持优先级和流量控制, 客户端可以指定请求的优先级,服务器可以根据优先级来调度资源传输,同时支持更细粒度的流量控制。
——————————————————————————————————
DNS
域名系统(DNS) 用于进行主机名到IP地址的转换,通常由其他应用层协议所使用,它包含一个由分层的DNS服务器实现的分布式数据库,是一个使主机能够查询分布式数据库的应用层协议。DNS协议运行在UDP之上,使用53号端口。
DNS服务器结构
DNS服务器采用分布式设计方案,从上到下依次为:
- 根DNS服务器:遍及全世界,负责提供顶级DNS服务器的IP地址;
- 顶级DNS服务器:对于每个顶级域(TLD)(如com、org、net、edu、gov)和所有国家的顶级域(如uk、fr、ca、jp),都有TLD服务器或服务器集群;
- 权威DNS服务器:在因特网上具有公共可访问主机的每个组织机构提供公共可访问的DNS记录,将这些主机的名字映射为IP地址,一个组织机构的DNS记录由权威DNS服务器收藏。
- 本地DNS服务器:每个ISP都有一台本地DNS服务器,本地DNS服务器不属于DNS服务器层次结构,它拥有或多台其他DNS服务器的IP地址,当主机与某个ISP连接时,该主机发出的请求被发往本地DNS服务器,它作为代理将该请求转发到DNS服务器层次结构中。
工作流程
- 用户发起请求:用户在浏览器输入域名(如www .example.com ),浏览器检查本地缓存中是否有该域名的IP地址,若有则之间用该地址进行连接;若无则将请求发送给操作系统的DNS解析器;
- 本地DNS解析器查询:操作系统的DNS解析器首先检查本地缓存(如Host文件)中是否有请求的域名的记录,有则返回;若无,DNS解析器会向配置的本地DNS服务器发送查询请求;
- 本地DNS服务器查询:本地DNS服务器检查其缓存中是否有请求的域名记录,有则返回;若无,本地DNS服务器向根DNS服务器发起查询请求;
- 根DNS服务器查询:根DNS服务器并不提供最终IP地址,而是指向负责顶级域(如.com)的顶级DNS服务器的地址;
- 顶级DNS服务器查询:本地DNS服务器收到根DNS服务器的响应后,向顶级DNS服务器发起请求,顶级域名服务器返回负责具体域名(example.com)的权威DNS服务器的地址;
- 权威DNS服务器查询:本地DNS服务器收到顶级DNS服务器的响应后,向权威DNS服务器发起请求,权威DNS服务器返回请求的域名(www .example.com )最终的IP地址,本地DNS接收到后将该IP地址缓存一段时间;
- 返回结果到客户端:本地DNS服务器将解析得到的IP地址返回给DNS解析器,DNS解析器再返回给浏览器,浏览器使用得到的IP地址与对应的服务器建立连接。
以上过程中,从主机到本地DNS服务器的过程会由本地DNS解析器请求DNS服务器完成整个查询过程并返回结果给用户,被称为递归查询;从本地DNS服务器到根DNS服务器、顶级DNS服务器、权威DNS服务器的过程不会由DNS服务器代表客户完成整个查询过程,而是逐步提供信息,告诉客户下一步查询哪个服务器,由客户自己完成查询,被称为迭代查询。
DNS记录
共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(RR),提供了主机名到IP地址的映射,每个DNS回答报文包含一条或多条资源记录。
资源记录是一个4元组:(Name, Value, Type, TTL); TTL是该记录的生存时间,决定了记录从缓存删除的时间;Name和Value的值取决于Type:
- Type = A,则Name是主机名,Value是主机名对应的IP地址
- Type = NS,则Name是域(如example.com),Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名;
- Type = CNAME,则Name是主机的别名,Value是主机的规范主机名;
- Type = MX,则Name是邮件服务器的别名,Value是邮件服务器的规范主机名。
DNS报文
DNS报文只有查询报文和回答报文,两者有着相同的格式,各字段如下:
- 首部区域:DNS报文的前12个字节,包含标识符(标识该查询)、标志位(查询还是回答)、问题数、回答资源记录数、权威资源记录数、附加资源记录数;
- 问题区域:包含正在进行的查询信息,包括:名字字段(正在被查询的主机名);类型字段(有关该名字的正在被询问的问题类型);
- 回答区域:包含对最初请求的名字的资源记录(Name, Value, Type, TTL);
- 权威区域:包含其他权威服务器的记录;
- 附加区域:其他有帮助的记录。
邮件协议
因特网电子邮件主要分为3个组成部分:用户代理、邮件服务器、简单邮件传输协议(SMTP)。邮件服务器是电子邮件体系的核心,每个接收方在其中的某个邮件服务器上有一个邮箱用于管理和维护发送给它的报文。如果发送方的服务器不能将邮件交付给接收方的服务器,那么报文会在发送方服务器的一个报文队列中保持,并在以后尝试再次发送,如果几天之后仍不成功,服务器就会删除报文并以电子邮件的形式通知发送方。
SMTP
SMTP是电子邮件中主要的应用层协议,用于中发送方的邮件服务器发送报文到接收方的邮件服务器,它使用TCP可靠数据传输服务,主要分为运行在发送方邮件服务器的客户端、运行在接收方邮件服务器的服务器端,每台邮件服务器既运行SMTP客户端也允许SMTP服务器端。
与HTTP相比,SMTP主要是一个推协议,而HTTP主要是一个拉协议;SMTP要求每个报文采用7比特ASCII码格式,而HTTP不受这种限制;SMTP把所有报文对象放在一个报文中,而HTTP把每个对象封装到自己的HTTP响应报文中。
邮件报文格式
邮件报文的首部中包含From首部行和To首部行,分别用于表示发送方和接收方的域名,可能包含Subject首部行,用于表示邮件主题,以及其他可选首部行。然后是以ASCII格式表示的报文体。
邮件访问协议
发送方使用SMTP协议将邮件推入接收方的邮件服务器,接收方就需要一个拉取操作从邮件服务器接收邮件,也就是使用邮件访问协议,主要有:
- 第三版邮局协议(POP3):一个极为简单的邮件访问协议,使用TCP传输服务,按照三个阶段工作:特许阶段,用户代理发送用户名和口令以鉴别用户;事务处理阶段,用户代理取回报文,同时也能对报文做删除标记、取消删除标记、获取邮件统计信息;更新阶段,结束POP3会话,邮件服务器删除被标记为删除的报文。POP3服务器不在会话过程中携带状态信息。
- 因特网邮件访问协议(IMAP):服务器把每一个报文与一个文件夹联系起来,当报文第一次到达服务器时,它与收件人的INBOX文件夹相关联;收件人把邮件转移到一个用户创建的新文件夹中,用于阅读、删除邮件,从而解决了POP3存在的邮件只能被一台设备接收后就被删除的问题。同时IMAP服务器维护了IMAP会话的用户状态信息。并且它也具有允许用户代理获取报文某些部分的命令。
- HTTP:基于Web的电子邮件,用户代理是浏览器,用户和它的远程邮箱之间的通信通过HTTP进行,邮件服务器之间发送和接受邮件仍然使用SMTP。