Web、YouTube、QQ,网络应用无处不在,应用层协议也就无处不在
应用程序的体系结构
网络核心设备(路由器、分组交换器)在较底层协议上运作,特别是网络层协议一下,而应用层协议则最接近于我们编写的软件,对于软件开发者来说,网络体系都是固定五层模型,而应用程序体系结构则由应用程序开发者来设计实现,主要有以下两种:
- 客户-服务器体系结构:最常见的应用有web、Telnet和电子邮件,在该结构中,有一个总是开机、处于核心地位的服务器,来接受其他客户主机的请求,该服务器具有一个IP地址,并且该IP地址是公共的、众所周知的
- P2P体系结构:常见应用有迅雷、BitTorrent,减少了对于中心服务器的依赖,主机和主机上的应用直接通信,P2P最显著的特点就是自扩展性,每个对等方的加入即能获取其他对等方的资源,也能为其提供服务能力

进程通信
计网中的进程通信不同于操作系统中的进程通信,计网中的进程通信是在不同的主机进程上的通信,两个进程通过计网交换报文(message)来相互通信。在单一主机上,应用进程和下面的网络层通过Socket(套接字)的软件接口来和其他主机进程通信,Socket是应用层和运输层之间的接口
开发者对于控制应用层的一切,但对于控制层的仅限于:选择运输层协议和设定少数几个参数(最大缓存等)。为了指定和特定主机的特定进程通信,就需要两个标志信息:主机地址(IP)和主机接受进程标识符(端口)
应用层协议定义了应用程序进程如何通过Socket相互传递message:
- 交换的报文类型(请求/相应)
- message字段定义和含义
- 进程相应规则
位于公共域的应用层协议(如HTTP),只要相应的应用遵从协议规则,就能和同样遵从该协议的其他主机的应用‘
Web和HTTP
Web的应用层协议为HyperText Transfer Protocol(HTTP,超文本传输协议),Web浏览器(Chrome、IE、Firefox)就对应了体系结构中的客户,Web服务器就对应了体系中的服务器(Apache Tomcat)。HTTP是一个无状态协议,即服务器并不会记住用户行为(连鱼七秒钟的记忆都没有)
通过一个单独的TCP连接发送(用完就毁)的HTTP称为非持续连接的HTTP,而使用同一条TCP的则称为持续连接的HTTP
HTTP请求报文

有以下字段
- 方法:GET、POST、HEAD、PUT、DELETE
- URL:请求对象的标识
- HTTP VERSION:浏览器实现的HTTP版本
- Host:请求对象所在的主机
- Connection:使用的是持续还是非持续HTTP连接
- User-agent:指明浏览器类型
- Accept-language:对象的语法版本
- Entity Body:使用GET方法时,实体为空,只在使用POST方法时才使用实体(如用户在表单字段中的输入值),当然在GET方法也可以加入表单字段,如“129.204.105.84:8080/user/?json”,即作为URL的参数
HEAD方法和GET类似,但服务器不返回请求对象;PUT则把对象上传到服务器指定目录;DELETE允许用户删除Web服务器的对象
HTTP响应报文

- 200 OK:请求成功,信息在返回的响应报文中
- 301 Moved Permanently:请求对象永久转移,新的URL在响应报文的Location
- 400 Bad Request:请求不能被服务器理解
- 404 Not Found:请求的文档不在服务器上
- 505 HTTP Version Not Supported:不支持HTTP协议版本
Cookie
Cookie的运行流程
Cookie通过在请求报文的首部行加入Cookie,即在无状态的HTTP之上建立起了一个用户会话层,服务器就能根据Cookie来返回特定的内容
Web缓存
当浏览器被配置,使得对于某个对象的请求定向到Web Cache(Proxy Server),当缓存器没有该对象时,才会和初始服务器建立TCP,并发送HTTP请求
Web Cache好处
- 可以大大的减少对客户请求的响应时间
- 减少一个机构的接入链路到因特网的通信量
引入Web Cache的同时也会引入一个问题:怎么保证Proxy Sever存储的对象都是最新的?
答案就是HTTP中的条件GET方法,条件GET首要意味着HTTP请求使用的是GET方法,其次要在报文中的首部行中包含一个“If-Modified-Since”字段
当用户第一次请求某一个对象时,初始服务器的响应报文中会包含“Last-Modified”字段,代理服务器会将对象和该字段的值保存在本地,当用再一次请求该对象时,代理服务器就会发送一个条件请求报文,并把“Last-Modified”的值作为“If-Modified-Since”的值,初始服务器只在对象在该值之后被修改才会发送对象作为相应,否则只会有一个状态码304 Not Modified,即申明该对象为最新的,可以直接转发给用户
电子邮件
email主要分成三部分:
- user agent(用户代理):如outlook、QQ mail,允许用户阅读、转发、回复、保存、撰写报文
- Simple Mail Transfer Protocol(SMTP):简单邮件传输协议,使用TCP作为可靠数据传输服务
- mail server(邮件服务器):运行SMTP协议

一封邮件的旅程:从用户代理Alice’s agent出发,通过SMTP协议,邮件可以从代理到达用户服务器,也可以从用户服务器到达接收方服务器,这里就遇到了一个问题:接收方代理不一定一直都开机,也就是说邮件不能一步就到接收方代理,这就需要一种邮件访问协议,使得代理可以去访问服务器上的邮件,并做出修改操作。也就是说在第六步需要不同的协议,而不是SMTP。常见的邮件访问协议有POP3(Post Office Protocol-Version3)、IMAP(Internet Mail Access Protocol)和HTTP
SMTP
SMTP和HTTP的区别
- HTTP是Pull protocol,用户使用HTTP从装载信息的server拉取信息,TCP是由想接受文件的端发起的
- SMTP是Push protocol,TCP是由发送该文件的端发起的
- SMTP要求报文使用7比特ASCII码格式??
- HTTP把每个对象分散封装到HTTP响应报文中,SMTP则把所有对象放在一个报文中
POP3
是一个极为简单的邮件访问协议,当用户代理打开和邮件服务器端口110的一个TCP连接时,POP3就开始工作,并有三个阶段:Authorization(特许)、事务处理和更新。
- 特许:用户代理明文发送用户名和口令到服务器鉴别用户
- 事务处理:用户代理取回报文,并对报文做标记(如删除标记、取消删除标记等等),用户代理可是使用list、retr、dele和quit四条命令。有“下载并删除”和“下载并保留”两种方式,第一种方式类似于永久删除,即一个PC客户端选择下载并删除,则将在邮件服务器删除该邮件,其他手机端等将无法下载该邮件
- 更新:当用户结束POP3对话(quit),服务器就删除那些标记为删除的报文
IMAP
为用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令,还提供了在远程文件夹查询邮件的命令,按指定条件去查询匹配的邮件
IMAP还具有允许用户代理获取报文组件的命令,例如只读取报文首部等
HTTP
越来越多的用户使用浏览器收发电子邮件,这时候用户代理就是浏览器,于是用户代理和服务器之间的通信就通过HTTP进行
DNS
一种能将主机名转换到IP地址的目录服务,即DNS(Domain Name System,域名系统)
DNS是一个分层的DNS服务器实现的分布式数据库,也是一个主机能够查询分布式数据库的应用层协议,DNS协议运行在UDP之上,使用53端口
DNS协议不同于其他应用层协议,它不和用户直接打交道,而是向其他应用层协议提供核心功能,可以说它是HTTP、SMTP等协议的基石,当HTTP要发送一个到“baidu.com”的报文,他首先要通过DNS去查询“baidu.com”对应的IP地址,当接收到DNS返回的报文,才想改IP地址主机发送连接请求,因此DNS为网络应用带来了时延
DNS还提供负载分配的功能。同一个应用可能需要多台服务器去提供相应的服务,这意味着同一个主机别名对应着多个IP地址,当用户发出一个DNS请求时,DNS服务器就返回IP地址集合,并在每次回答时循环这个地址集合,用户通常用排在前面的IP地址,也就达到了负载分配的效果
DNS服务器以层次方式组织,有三种类型服务器:根、顶级域和权威DNS服务器。DNS对服务器的查询有递归查询和迭代查询两种。DNS采取缓存的机制改善时延性能并减少在因特网上到处传输的DNS报文数量