计算机网络-应用层协议原理
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
在开发应用层程序时,不需要也不能够写在网络核心设备如路由器或链路层交换机上运行的软件。网络核心设备并不在应用层上起作用,而仅在较低层起作用,特别是位于网络层及下面层次。
两种主流的体系结构:
- C/S体系结构:有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机请求。服务器具有固定的、周知的地址,该地址称为IP地址。
- P2P体系结构:对于数据中心的专用服务器有很小的依赖。应用程序在间接连接的主机对之间使用直接通信,这些主机对被称为对等方。其最引人入胜的特性是自扩展性。
客户和服务器进程(C/S)
网络应用程序由成对的进程组成,这些进程通过网络互相发送报文。每对通信进程,我们通常将这两个进程之一标识为客户端(client),另一个标为服务端(server)。
在给定的一对进程之间的通信会话场景中,发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器。
套接字(Socket)
每队中的两个进程互相发送报文,发送的报文必须通过下层的网络。进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。
套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。
应用程序开发者对于运输层的控制仅限于:①选择运输层协议;②也许能设定几个运输层参数,如最大缓存和最大报文段长度。一旦应用程序开发者选择了一个运输层协议,则应用程序就建立在由该协议提供的运输层服务之上。
进程寻址
为了标识接收进程,需要定义两种信息:①主机的地址(寻找主机);②定义在目的主机中的接收进程的标识符。(寻找进程)。
主机由IP地址标识,IP地址是一个32 bit的量且能够唯一标识该主机。
目的地端口号(port number)用于寻找目标进程。已经给流行的应用分配了特定的端口号,如Web应用的端口号为80。
可供程序使用的运输服务
套接字是应用程序进程和运输层协议之间的接口。在发送端的应用程序将报文推进该套接字。在该套接字的另一侧,运输层协议负责使该报文进入接收进程的套接字。
我们可以从四个方面对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性。
TCP服务
当TCP作为运输协议时,应用程序就能获得来自TCP的两种服务:
- 面向连接的服务:TCP让客户和服务器互相交换运输层控制信息。所谓握手过程提示客户和服务器,使它们为大量分组的到来做好准备。在握手之后,一个TCP连接就在两个进程套接字之间建立了,这条连接是全双工的。当应用程序结束报文发送时,必须拆除该连接
- 可靠的数据发送服务:通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。它能够依靠TCP将相同的字节流交付给接收方的套接字,没有字节的丢失和冗余。
TCP协议具有拥塞控制机制,其会抑制发送进程(客户或服务器),试图限制每个TCP连接,使它们达到公平共享网络宽带的目的。
UDP服务
UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。
UDP是无连接的,在两个进程通信前没有握手过程,UDP协议提供一种不可靠数据传送。UDP不保证发送的报文将到达接收进程,且不能保证数据的到达顺序是有序的。
UDP没有拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。
应用层协议
应用层协议定义了:
- 交换的报文类型:请求报文or响应报文
- 各种报文类型的语法:报文中的各个字段及这些字段是如何描述的
- 字段的语义:这些字段中包含的信息的意义
- 一个进程如何以及何时发送报文:对报文的响应规则
Web和HTTP
HTTP概况
Web的应用层协议是超文本传输协议(HyperTextTransferProtocol,HTTP),它是Web的核心。
HTTP由两个程序实现:客户程序和服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。
HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式
HTTP使用TCP作为它的支撑运输协议。
服务器向客户发送被请求的文件,而不存储任何关于客户状态的信息(并不会因为刚刚为某用户发送过请求而存储该用户的请求内容)。所以我们说HTTP是一个无状态协议(stateless protocol)。
非持续连接和持续连接
HTTP既能够非持续连接,也能够使用持续连接。HTTP在其默认方式下使用持续连接,HTTP客户和服务器也能配置使用非持续连接。
采用非持续连接的HTTP
从客户请求HTML基本文件起到该客户受到整个文件止所花费的时间称为往返时间(Round-Trip Time,RTT)。RTT包括分组的传播时延、分组在中间路由器和交换机上的排队时延以及分组的处理时延。
经过TCP的三次握手(1、客户端发起TCP连接;2、服务器收到请求返回确认ACK;3、客户端收到确认ACK发起文件请求)以及服务器响应请求发送文件供两个来回。总时间就为2个RTT+传输文件的时间。
缺点:
- 为每个请求对象建立和维护一个全新的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来严重的负担。
- 每个对象经受两个RTT的交付时延(一个用于创建TCP,另一个用于请求和接收一个对象)
采用持续连接的HTTP
一个完整的Web页面可以用单个持续TCP连接进行传送,可以一个接一个地发出对象的这些请求,而不必等待对未决请求(流水线)的回答。
一般来说,如果一条连接经过一定的时间间隔仍未被使用,HTTP服务器就关闭该连接。HTTP的默认模式是使用带流水线(可以在未收到请求响应时直接发送下一个请求)的持续连接。
HTTP报文格式
eg:
GET /somedir/page.html HTTP/1 1
Host: www.some school.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
- 报文是用普通的ASCII文本书写的。
- 报文有5行组成,每行由一个回车换行符结束,最后一行后再附加一个回车换行符。
- 一个请求报文能够具有更多行或者至少一行。
请求行
报文的第一行叫做请求行(request line)
请求行有3个字段:方法字段(Get/Post)、URL字段和HTTP版本字段
HTTP响应报文
eg:
HTTP/1.1 200 OK
Connect in: close
Date: Tue, 09Aug 2011 15: 44: 04GMT
Server: Apache/2.2.3(CentOS)
Last-Modified: Tue, 09Aug 2011 15: 11: 03GMT
Content-Length: 6821
Content-Type: text/html
(data……)
- 响应报文分为三个部分:一个初始状态行,6个首部行,然后是实体。
- 状态行有3个字段:协议版本字段、状态码和相应的状态信息。
状态码
- 200 OK:请求成功
- 301 Moved Permanently:请求的对象已经被永久转移了
- 400 Bad Request:请求差错,该请求不能被服务器理解
- 404 NotFound:被请求的文档不在服务器上
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
FTP(文件传输协议)
在一个典型的FTP会话中,用户坐在一台主机前面,向一台远程主机传输文件。为使用户能访问它的远程账户,用户必须提供一个用户标识和口令。
用户首先提供远程主机的主机名,使本地主机的FTP客户进程建立一个到远程主机FTP服务器进程的TCP连接。用户接着提供用户标识和口令,作为FTP命令的一部分在该TCP连接上传送。一旦该服务器向该用户授权,用户可以将存放在本地文件系统中的一个或者多个文件复制到远程文件系统。
HTTP和FTP都是文件传输协议,然而,这两个应用层协议有一些重要的区别:
- FTP使用了两个并行的TCP连接来传输文件,一个是控制连接(发送命令),一个是数据连接。因为FTP协议使用一个独立的控制连接,所以我们也称FTP的控制信息是带外(out-of-band)传送的。HTTP的命令和数据封装在一起,我们就称它是带内(in-band)连接。数据连接每传递完一次文件就会断开,而控制连接贯穿了整个用户会话期间。(控制连接是持续的,数据连接是非持续的)
- FTP服务器必须在整个会话期间保留用户的状态,服务器必须把特定的用户账户与控制联系起来。对每个进行中的用户会话的状态信息进行追踪大大限制了FTP的会话总数。
FTP命令和回答
从客户到服务器的命令和从服务器到客户的回答,都是以7比特ASCII格式在控制连接上传送的。
每个命令由4个大写字母ASCII字符组成,常见的命令有:
- USER username:用于向服务器传送用户标识。
- PASS password:用于向服务器发送用户命令
- LIST:用于请求服务器回送当前远程目录中的所有文件列表(由数据连接传递)。
- RETR filename:用于从远程主机当前目录检索。该命令引起远程主机发起一个数据连接,并经该数据连接发送所请求的文件
- STOR filename:用于在远程主机的当前目录上存放文件。
每个命令都对应着一个从服务器发向客户的回答。回答是一个3位的数字,后跟一个可选信息。一些典型的回答:
- 331 Username OK, Password required(用户名OK,需要密码)
- 125 Data connection already open;transfer starting(数据连接已打开,开始传送)
- 425 Can't open data connection(无法打开数据连接)
- 452 Error writing file(写文件差错)
邮件系统
因特网邮件系统的总体情况,主要由3个主要组成部分:
user agent 用户代理:一个客户端程序
mail server 邮件服务器
Simple Mail Transfer Protocol,SMTP简单邮件传输协议
用户完成邮件撰写时,他的邮件代理向其邮件服务器发送邮件,此时邮件放在邮件服务器的外出报文队列中。
邮件服务器形成了电子 邮件体系结构的核心。每个接收方在其某个邮件服务器上有一个邮箱。
一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。
SMTP协议
SMTP是因特网电子邮件中主要的应用层协议,它使用TCP可靠并持续的数据传输服务。SMTP也有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。每台邮件服务器上既运行SMTP的客户端也运行SMTP的服务器端。
SMTP限制所有邮件报文的实体部分只能采用简单的7bit ASCII表示。
SMTP一般不适用邮件服务器发送邮件,即使这两个邮件服务器相距甚远。如果接收端的邮件服务器无法接收邮件,那么邮件报文会一直存储在发送端的邮件服务器的报文队列中,并每隔一段时间尝试发送。
发送过程:客户SMTP(发送端邮件服务器)在25号端口建立一个到服务器SMTP(接收端邮件服务器)的TCP连接,如果服务器没有开机,客户会在稍后继续尝试连接。在SMTP握手阶段,SMTP客户指示发送方的邮件地址和接收方的邮件地址
与HTTP协议对比
HTTP从Web服务器向Web客户传送文件;SMTP从一个邮件服务器向另一个邮件服务器传送文件。在传输文件时,通常都采用TCP的持续连接
HTTP主要是一个拉协议(pull protocol),用户使用HTTP从服务器拉取信息,TCP连接是由想接收文件的机器发起的。而SMTP基本上是一个推协议(push protocol),发送邮件服务器把文件推向接收邮件服务器,这个TCP连接主要由发送文件的机器发起的
SMTP要求每隔报文使用7bitASCII码格式,HTTP数据则不受这种限制。
对于既包含文本又包含图形的文档,HTTP会把每个对象封装到它自己的HTTP响应报文中(每个对象相对独立),而SMTP会把所有报文对象放在一个报文之中。
邮件报文格式
eg:
From:alice e crepes.fr
To: bob e hamburger.edu
Subject: Searching for the meaning of life
首部行必须包含From和To字段,在首部行之后紧接着一个空白行,然后是以ASCII格式表示的报文。
邮件访问协议
用户代理不能使用SMTP从邮件服务器获取邮件,因为取报文是一个拉操作,而SMTP协议是一个推协议。邮件访问协议负责将邮件服务器上的报文发送给本地PC的用户代理。
目前流行的邮件访问协议有第三版的邮局协议(Post Office Protocol—Version 3,POP3)、因特网邮件访问协议(Internet Mail Access Protocol,IMAP)以及HTTP。
POP3
POP3是一个极为简单的邮件访问协议,功能非常有限。当用户代理打开了一个邮件服务器(服务器)端口110上的TCP连接后,POP3就开始工作了。随着建立TCP连接,POP3按照三个阶段进行工作:特许(authorization)(验证权限)、事务处理以及更新。
- 特许:用户代理发送(以明文形式)用户名和口令以鉴别用户
- 事务处理:用户代理取回报文,同时可以做删除标记、取消报文删除标记、获取邮件的统计信息
- 更新:结束POP3会话,该邮件服务器删除那些被标记删除的邮件。
POP3服务器对每个命令的回答可能有两种:+OK(可能跟着客户需要的数据),-ERR(报错)
IMAP
IMAP比POP3更复杂,有更多的功能。IMAP把每个报文与一个文件夹联系起来,当报文第一次到达服务器时,它与收件人的INBOX文件夹关联。IMAP协议未用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令。
与POP3不同,IMAP服务器维护了IMAP会话的用户状态信息。
IMAP允许用户代理获取报文组件的命令,如一个用户代理可以只读一个报文的首部。在低宽带连接时,可以避免读取大音频,视频。
DNS
识别主机有两种方式:通过主机名或IP地址,人们喜欢便于记忆的主机名标识,而路由器喜欢定长的、有层次的IP地址。为了折衷这些不同偏好,域名系统(Domain Name System,DNS)能提供主机名到IP地址转换的目录服务
DNS是一个由分层的DNS服务器实现的分布式数据库;是一个使得主机能够查询分布式数据库的应用层协议
DNS协议运行在UDP之上,运行在53号端口
分布式、层次数据库
为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,大致有三种类型的DNS服务器:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器和权威DNS服务器。
客户端需要请求一个网址的服务器IP地址时,用户会先访问根服务器,根服务器会返回对应顶级域(TLD)服务器的IP地址,访问对应的顶级域服务器,会得到对应权威域服务器的IP地址,在权威域服务器中就能得到对应网址的服务器IP地址。
- 根DNS服务器:在因特网上有13个根DNS服务器(标号A到M),它们中的大部分位于北美洲。所有根服务器都可以单独使用,它们互为备份和冗余。
- 顶级域DNS服务器:这些服务器负责顶级域名如com、org、net、edu和gov,以及所有国家的顶级域名如uk、fr、ca和ip。
- 权威DNS服务器:在因特网上具有公共可访问主机的每个组织机构必须向权威DNS服务器提供可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。
每个ISP都会有一台本地DNS服务器,在客户端需要查询某个网址的主机IP地址时,客户端会向这些本地DNS服务器发出递归查询请求,本地DNS服务器通过根服务器、TLD顶级域服务器、权威服务器后返回对应的IP地址。
DNS缓存
在一个请求链中,当某DNS服务器接收一个DNS回答,它能将该回答中的信息缓存到本地。
如用户A通过本地DNS服务器,服务器通过查询链查询了www.baidu.com的主机IP地址,此时本地DNS服务器会将这一对主机名/IP地址缓存在本地。当用户B也要查询百度的IP地址时,这个服务器可以直接从缓存中取出IP地址,而不需要通过查询链查询。
DNS在一段时间后(通常为2天)会更新丢弃本地缓存的Ip地址。
DNS记录
所有DNS服务器存储了资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射。资源记录是一个4元组(Name,Value,Type,TTL),TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
Name和Value的值是取决于Type:
- Type=A,则Name就是主机名,Value就是该主机名对应的IP地址。
- Type=NS,则Name是个域,而Value是对应的权威DNS服务器的主机名。
- Type=CNAME,Value是别名为Name的主机对应的规范主机名。
- Type=MX,则Value是别名为Name的邮件服务器的规范主机名。
一台权威服务器一般会包含A类型的RR,,如果不是权威服务器,那很可能同时包含一个NS类型的RR,和一个A类型的RR。A类型中存储了NSValue字段中的DNS服务器的IP地址。
DNS报文
DNS只有两种报文,查询和回答报文,且它们有着相同的格式。
前12个字节是首部区域,标识符是一个16bit的数,用于标识该查询,这个标识会复制到回答报文中,后面还有4个有关数量的字段,记录了后面有关问题的数量。
问题区域包含正在进行查询的信息。
回答区域包含了对最初请求的名字的资源记录,在回答报文的回答区域可以包含多条RR,因此一个主机名能够有多个IP地址。
权威区域包含了其他权威服务器的记录。
在DNS数据库中插入记录
在DNS注册登记机构注册域名,注册登记机构是一个商业实体,它会验证该域名的唯一性,并将域名输入DNS数据库中。每个DNS服务器中的内容都是人工静态配置的
图片来源于网络