简书的markdown没有目录功能,觉得不方便的可以在我的博客阅读。
http://hans941.tk/2017/10/jisuanjiwangluo-yingyongceng/
1 概述
1.1 可供程序使用的应用层服务
研发应用程序的核心是写出能在不同端系统和通过网络彼此通信的程序。
由于计算机网络的分层结构,应用层协议只能运行在端系统,这种限制促进了应用程序的开发,即不用考虑底层网络核心的实现。开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权,除了:
1. 选择运输层协议(如果可供选择的话)
2. 也许能设定几个运输层参数,如最大缓存和最大报文段长度。
<center></center>
1.2 运输层协议 TCP 和 UDP
TCP服务
TCP服务模型包括面向连接服务和可靠数据传输服务。
- 面向连接的服务:在应用层数据报文开始流动之前,TCP 让客户和服务器互相交换运输层控制信息,即握手阶段。之后,一条 全双工 的 TCP 连接 就在两个进程的套接字之间建立了。应用程序结束发送报文时,则拆除该连接。
- 可靠的数据传送服务:通信进程能够依靠 TCP,无差错、按适当顺序交付所有发送的数据。
- 包括拥塞控制机制。
拥塞控制机制,这种服务不一定为通信进程带来直接好处,但是能为因特网带来整体好处: 当发送方和接收方之间的网络出现拥塞时,TCP 的拥塞控制机制会抑制发送进程。TCP 拥塞控制机制也试图限制每个 TCP 连接,使他们达到公平共享网络带宽的目的。
UDP服务
UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。它有如下特点:
- UDP是无连接的,因此无握手过程。
- 不可靠数据传输,即不保证发送报文能完整地、有次序地达到接收进程。
- 无拥塞控制机制。
</center>
1.3 互联网运输协议所不提供的服务
我们大致可以从四个方面对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性。
TCP 能提供可靠的数据传输服务,也能通过 SSL 来加强以提供安全服务。但是对吞吐量、定时这两点网络运输协议并没有提供。
这并不意味着如互联网语音通讯这类时间敏感型应用不能运行在今天的互联网上, 想反因特网通常能够为时间敏感应用提供满意的服务,但不能提供任何定时或带宽保证。
1.4 应用层协议
应用层协议定义了运行在不同端系统上的应用程式进程如何相互传递报文。
特别是定义了以下几个方面:
- 交换报文的类型,例如请求报文和响应报文。
- 各种报文类型的语法,如报文中各个字段及这些字段是如何描述的。
- 字段的语义,即这些字段中包含的信息的含义。
- 一个进程何时以及如何发送报文,对报文进行响应的规划。
应用层协议只是网络应用的一个部分,比如一个Web应用包括文档格式的标准(HTML)、浏览器(firefox、chrome等)、服务器以及一个应用层协议(HTTP)。又比如一个电子邮件应用包括邮件服务器、客户端程序、定义电子邮件报文结构的标准、定义报文传递的应用层协议和定义如何对报文首部进行解释的应用层协议。用于电子邮件的主要应用层协议是SMTP。
2 Web和http
2.1 HTTP概况
<center>web的应用层协议是超文本传输协议,它是web的核心。
http由两个程序实现:一个客户程序和一个服务器程序。他们运行在不同的端系统中,通过http报文进行会话。
HTTP使用TCP作为它的支撑运输协议。
</center>
HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。TCP为http提供可靠的数据传输服务,保证每个http请求报文完整地到达服务器,这里体现了分层体系结构的优点。即http不用担心数据丢失,也不关注tcp从网络的数据丢失和乱序故障中恢复的细节,那是TCP以及服务栈较底层的协议的工作。
2.2 非持续连接额持续连接
根据每个请求\响应是由一个个单独的 tcp 进行的,还是所有请求\响应由共同的一个 tcp 连接发送的可分为持续连接和非持连接(non-persistent connection)。
1.采用的非持续连接的http
比如说我们访问一个包含10个图片的网页,那么该页面包含一个基本的HTML文件和10个图片文件,一共11个对象。
我们看看发生了什么情况:
- http客户进程在默认端口号80发起一个到服务器的tcp连接,在该服务器和客户分别有一个套接字与该连接相关联。
- http客户经过它的套接字向该服务器发送包含网址的请求报文。
- http服务器经过它的套接字接收请求报文,从存储器中检索出index.html(举例的一个基本的html文件),之后在响应报文中封装该对象,并通过套接字返回响应报文。
- http服务器进程通知tcp断开该tcp连接。
- http客户接收响应报文,tcp连接关闭。检查报文封装HTML对象中包含10个图片引用。
- 对每个引用的图片对象重复前4个步骤。
上述例子说明了非持续连接的使用,每个TCP连接只传输一个请求报文和一个响应报文。本例中就产生了11个TCP连接。
2.采用持续连接的http
非持续连接有一些缺点,会导致每次请求\响应都要建立TCP连接,多花费了很多次“握手”时间,不仅带来了交付时延,还给web服务器到来了负担。HTTP1.1规定了默认保持持续性连接(Connection:keep-alive)。
2.3 http报文格式
- http请求报文
下面是一个典型的http请求报文
GET /somedir/page.html HTTP/1.1
Host: www.hans941.tk
Connection: close
User-agent: Chrome/57.0
Accept-language: ch
http报文用ASCII文本书写,每行由一个回车和换行符结束,最后一行再附加一个回车和换行符。
http请求报文的第一行叫请求行(request line),其后的行叫首部行(header line)。请求行有三个字段:方法字段、URL字段和HTTP版本字段。方法字段包括:GET、POST、HEAD、PUT和DELETE。HEAD方法用于调试跟踪,PUT方法用于向服务器上传文件,DELETE方法用于删除服务器文件。
- 下图是请求报文的通用格式
</center>
首部行后面的 实体体
(Entity body),在使用 POST
方法时存储用户提交的表单。
- http响应报文
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ......)
上面这个http响应报文由三部分组成:一个初始
状态行
(status line),之后有6个首部行
(header line),然后是实体体
(entity body)。
状态行有三个字段:
- 协议版本字段
- 状态码
- 相应状态信息
实体体是报文的主要组成部分,它包含了请求的对象本身(即data data…………)。
<center></center>
2.4 cookie
HTTP服务器是无状态化的,这简化了服务器的设计,这让工程师可以去开发能同时处理大量数据的高性能服务器。但是有时Web站点希望能去识别用户,为此HTTP使用了cookie来进行用户跟踪。
- cookie 有 4 个技术组件
- 在 HTTP 响应报文中的一个 cookie 首部行;
- 在 HTTP 请求报文中的一个 cookie 首部行;
- 在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理;
- 位于 Web 站点的一个后端数据库。
</center>
简单地说,就是用户在首次访问一个网站时,浏览器收到的响应报文里有set-cookie首部,浏览器就会在它管理的特定cookie文件里添加一行,该行包括服务器主机名和set-cookie中的识别码。识别码就标记了用户身份,所以当用户再次访问该网站时,就能继续沿用曾经访问时留下的信息。
2.5 web缓存/代理服务器
<center>如果让每个用户都访问服务器来获取信息,这不仅让服务器负载过大,而且面对距离服务器较远的用户会使用户访问速度变慢。为此,有了
web缓存
(web cache)的出现,web缓存也叫代理服务器
(proxy server)。
</center>
代理服务器
的大概原理可简述如下:
- 浏览器向代理服务器发送一个请求
- 代理服务器检查本地是否存储了该请求对象副本。
- 如果包含则返回该对象,如果没有则代理服务器再向原始服务器发送请求,在成功响应后在本地保存该副本并向客户的浏览器返回响应。
使用代理服务器时是如何保证存储的对象是最新的版本呢?这就2.6的内容。
2.6 条件GET方法
为了保证存放在缓存器中的对象副本是最新的,在GET方法中包含If-Modified-Since:
首部行用于存储该对象最后修改的日期。在一段时间后,缓存服务器再次受到用户浏览器的请求时,缓存服务器会向原始服务器发送一个GET请求检查在If-Modified-Since:
后该对象是否被修改过,如果被修改过则返回修改过的对象,如果没有则返回一个空的实体体响应报文。
3 文件传输协议:FTP
HTTP和FTP都是文本传输协议,他们有很多共同点,例如都运行在TCP上,但他们最显著的区别是FTP使用了两个并行的TCP连接,一个是控制连接,一个是数据连接。控制连接用于控制传输命令(put,get),数据连接用于传输文件数据。
4 电子邮件
<center></center>
电子邮件系统有 3 个主要组成部分: 用户代理
、邮件服务器
、简单邮件传输协议(SMTP)
。
4.1 SMTP
SMTP是网络电子邮件应用的核心,它使用TCP连接和ASCII编码(只能使用ASCII编码意味着传送二进制的多媒体文件会很麻烦)。
为了描述SMTP的基本操作,我们假设ALice要给Bob发送一封简单的ASCII报文:
- Alice调用他的用户代理程序并提供Bob的邮件地址,撰写报文,然后指示用户代理程序发送报文
- Alice的用户代理程序把报文发送给它的邮件服务器,在那里该报文被放在报文队列中
- 运行在Alice邮件服务器上SMTP客户端发现报文队列中的报文,它就创建一个连接到Bob邮件服务器上的SMTP客户端的TCP连接
- 在经过初始的SMTP握手后,发送报文
- Bob的邮件服务器接收报文后,将报文放在Bob的邮箱中
- 在Bob方便时,调用他的用户代理程序阅读报文
4.2 SMTP和HTTP的对比
相同点:
- 都由一台主机向另一台主机传送文件
- 当进行文件传送时,都使用持续连接
不同点:
- HTTP主要是个拉协议,SMTP是个推协议。
- SMTP要求每个报文使用7比特ASCII码格式,HTTP则没有这个限制。
- 对于既包含文本又包含多媒体文件的文档,HTTP把每个对象封装到他自己的HTTP响应报文中,而SMTP则把所有对象封装到一个报文中。
4.3 邮件访问协议
当我的邮件服务器有一封邮件,我如何把它取回到我的用户代理程序呢?
由于SMTP是一个推协议,我们只能用过引入其他的邮件访问协议来解决这个问题。
目前有一些流行的邮件访问协议第三版的邮局协议(POP3)
、因特网邮件访问协议(IMAP)
以及HTTP
。
5 DNS:因特网的目录服务
我们知道因特网的主机可以用主机名(www.baidu.com)或者IP地址(192.168.1.15)来标识。但相对于IP地址,人类认为主机名更加便于记忆,DNS就提供了从主机名到IP地址的转换。
DNS
(Domain Name System)是:一个由分层的DNS服务器
(DNS Server)实现的分布式数据库
;一个使主机能够查询分布式数据库
的应用层协议
。
DNS服务器通常是运行BIND软件的UNIX服务器;DNS协议运行在UDP之上,使用53号端口。
DNS提供的服务
- 和HTTP、SMTP、FTP协议一样,DNS是应用层协议,但是DNS通常是被其他应用层协议使用的,将用户的主机名解析为IP地址。
- 主机别名(host aliasing)。一个主机可以拥有多个别名,DNS存储所有的名字。
- 邮件服务器别名。同上。
- 负载分配(load distribution)。一个繁忙的站点会被冗余分布在多个服务器上,每台服务器都有不同的IP地址,而DNS会让你在多个服务器之间循环访问,防止所有的用户都访问同一台服务器。