应用层
原理
结构和模型
客户-服务器体系结构(client-server architecture )
通信不是直接的,需要通过服务器转发
经常会在服务器积压大量的负载
服务器(server)
服务器是提供服务的机器
服务器是一台常连接(always-on)的主机,具有固定的 IP 地址
因此,客户总是可以通过向服务器的 IP 地址发送分组(packet)来与服务器通信
客户(client)
客户是需要获取服务的机器
客户直接与服务器通信,相互之间不是直接通信的
此外,客户不是常连接的,且大多数具有动态的 IP 地址
可扩展性(scalability)
这种体系结构的可扩展性不强,如果客户过多,服务器会因为超出负载而崩溃
对等体系结构(P2P architecture)
纯的 P2P 结构没有常连接的服务器,终端系统直接通信,相互之间称对等体(peer)
对等体之间间断地连接,对等体自身间断地切换 IP 地址
优点:这种体系结构有较强的可扩展性,加入一个新的对等体并不影响原先的对等体
缺点:难以管理,并且可靠性也不强,例如 P2P 下载时,由于 1st seed peer 下线了,下载进度卡在 99%
两种体系结构的混合(Hybrid)
例如 Skype 和 QQ
Skype
服务器负责处理远程地址查询,客户和客户之间是直接通信的
两个客户之间的通信是直接的,服务器负责查询客户当前的位置
两台机器上的应用程序进程可以相互通信
进程通信(process communicating)
进程是主机上运行着的程序,在同一台主机上进程通过进程间通信(IPC)来通信,IPC 是由操作系统定义的
不同主机上的进程通过交换报文(message)来进行通信
客户进程发起通信,服务进程等待通信,在这种定义下 P2P 体系结构也有这两类进程的区分
套接字(socket)
进程通过套接字收发报文,套接字接口包括选择传输协议和设置一系列的参数等等
进程寻址(process addressing)
接收报文的进程需要一个地址,为了标识特定的进程,需要定义①主机的地址和②主机中该进程的标识符
Internet 的主机由 IP 地址来标识,同一台主机上可运行多个进程,使用端口号(port number)来区分进程
流行的应用分配了特定的端口号,例如 HTTP server 对应端口号 80,Mail server 对应端口号 25
应用层协议概要
应用层协议需要定义运行在不同端系统上的应用程序进程如何相互传递报文,包括下面的内容
-
交换报文的类型,例如请求(request)报文和响应(response)报文
-
各种报文的语法,例如报文中包含什么字段,这些字段又是如何描述的
-
各种报文的语义,就是报文字段包含信息的含义
-
进程发送和响应报文的时间和方法的规则
定义在 RFC 文档的应用层协议位于公共域(public-domain)中,例如 HTTP 协议和 SMTP 协议
还有很多别的协议是专用的,有意不为公共域所使用,例如 Skype 就使用了专有的应用层协议
应用层协议依赖于传输层协议,它决定了使用哪一种传输层协议,这就涉及了应用程序的多个指标
-
数据丢失(data-loss):有些应用,例如交互式的音频,可以容忍一定的数据丢失,而其他大多数应用,例如文档传输,要求百分之百可靠的数据传输
-
定时(timing):即时在线游戏等应用要求数据传输低延时(low delay)
-
吞吐量(throughput):多媒体应用等应用要求吞吐量足够大
-
安全性(security):加密和数据完整性等等
Internet 提供的传输层协议
主要包括 TCP 和 UDP
TCP 服务
-
面向连接的服务(connection-oriented):在应用层数据报文开始流动之前,TCP 让客户和服务器相互交换传输层控制信息,这个握手过程提示客户和服务器为大量 packet 的到来做好准备。握手结束后客户进程和服务进程的套接字之间就建立起了一个 TCP 连接,这个连接是全双工(full duplex)的。应用程序结束报文发送时,必须关闭该连接
-
可靠的数据传输服务(reliable transport)
-
拥塞控制机制,在网络拥塞时抑制发送进程
-
流控制机制,发送进程不会吞没(overwhelm)接收进程
TCP 服务不提供定时机制,不保证最小吞吐量,也没有安全性方面的考量
UDP 服务
不可靠的数据传输服务,不建立连接,没有流控制机制,没有拥塞控制机制,不保证吞吐量,不考虑安全性
但是,非常轻量级,不提供不必要的服务,对于可以容忍数据丢失的应用有意义
实例:Web 和 HTTP
HTTP 概要
HTTP 即超文本传输协议(hypertext transfer protocol)是 Web 的应用层协议,使用 client/server 模型
client 对应浏览器,浏览器请求、接受并显示 Web 对象
server 对应 Web server,对于浏览器的请求,响应并发送相应的 Web 对象
HTTP 使用 TCP 协议作为支撑它的传输层协议,整个过程大致如下
-
HTTP 客户通过创建 socket 发起一个与服务器的 TCP 连接,端口号 80
-
服务器接受客户发起的 TCP 连接,连接建立
-
HTTP 报文在浏览器(HTTP client)和 Web server(HTTP server)之间交换
-
关闭 TCP 连接
服务器向客户发送被请求的文件,但不存储任何关于该客户的状态信息,即浏览器不知道用户的状态
因此 HTTP 协议是一个无状态协议(stateless protocol)
建立一个维护状态的协议是非常复杂的,因为所有的状态历史都需要维护,而且一旦客户或服务器宕机,那么维护的状态历史就可能不一致,从而还需要考虑状态的同步问题
HTTP 连接
HTTP 连接分为持久连接和非持久连接,非持久连接指的是每个请求/响应对使用一个单独的 TCP 连接发送,持久连接指的是多个或所有的请求/响应对使用同一个 TCP 连接发送
建立单独的 TCP 来传输一个文件所需的时间为 2RTT + transmit time,其中 RTT 为往返时间(Round-Trip Time),即一个短分组,在这里即一个小的 TCP 报文,从客户到服务器再返回客户所需要的时间,transmit time 为传输文件本身的时间
首先由客户向服务器发送一个小 TCP 报文段,服务器用一个小 TCP 报文段做出确认和相应,客户再向服务器返回确认,这样的过程称为 TCP 的三次握手
HTTP 报文
请求报文
一个请求报文的例子
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
User-agent: Mozilla/5.0
Connection: close
Accept-language: fr
?
请求报文的一般形式
<method><SPC><URL><SPC><version><CR><LF>
<header field name>:<value><CR><LF>
<header filed name>:<value><CR><LF>
...
<header filed name>:<value><CR><LF>
<CR><LF>
用户提交输入可以通过 Web 页面的提交框,或 URL 后附带提交数据,格式为?<key>=<val>&<key>=<val>
方法类型在 HTTP/1.0 中包括 GET、POST 和 HEAD,在 HTTP/1.1 中增加了 PUT 方法和 DELETE 方法
通过在 GET 中添加 If-Modified-Since 首部行,可以实现条件 GET 方法
响应报文
一个响应报文的例子
HTTP/1.1 200 OK
Connection: close
Date: Thu, 06 Aug 1998 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Mon, 22 Jun 1998 …...
Content-Length: 6821
Content-Type: text/html
data data data data data ...
?
响应报文包括状态行(status line),首部行(header line)和实体部分(entity body)
Cookie
HTTP 服务器是无状态的,但是 Web 站点经常希望能识别用户,这可以使用 cookie 技术来实现,它允许站点对用户进行跟踪
Cookie 技术包括四个组件
-
-
HTTP 请求报文中的一个 cookie 首部行
-
用户主机上的 cookie 文件,由用户浏览器管理
-
Web 站点的后端数据库
Cookie 的好处
-
授权认证(authorization)
-
支持购物车(shopping carts)
-
针对性推荐(recommendations)
-
用户会话状态(user session state)
Web 缓存器 / 代理服务器
典型的代理过程
-
浏览器建立一个到 Web 缓存器的 TCP 连接,并向 Web 缓存器中的对象发送一个 HTTP 请求
-
Web 缓存器进行检查,看看本地是否存储了该对象的副本,如果有就直接客户浏览器用 HTTP 响应报文返回该对象,否则转下一步
-
Web 缓存器打开一个与该对象的初始服务器的 TCP 连接,发送一个对该对象的 HTTP 请求。初始服务器在收到该请求后向 Web 缓存器发送具有该对象的 HTTP 响应
-
Web 缓存器收到该对象,在本地存储空间存储一份副本,并向客户浏览器用 HTTP 响应报文发送该副本
Web 缓存器在其中即扮演了客户的角色,又扮演了服务器的角色
Web 缓存器的好处
-
减少响应时间
-
减轻初始服务器的压力
-
支持访问外网
-
支持匿名化
实例:FTP
FTP 即文件传输协议(file transport protocol),用于传送文件到远程主机或从远程主机接受文件
FTP 使用客户服务器模型,建立连接的一端为客户端,另一端为服务端
FTP 的端口号为 21,对应的 RFC 文档为 RFC 959
FTP 运行在 TCP 上,它使用两个并行的 TCP 连接来传输文件,一个控制连接(control connection)和一个数据连接(data connection)
控制链接用于在两个主机之间传输控制信息,例如用户标识,口令,改变远程目录以及 PUT 和 GET 文件的命令
数据连接用于实际发送一个文件,每传输一个文件使用一个单独的数据连接
由于 FTP 的控制信息使用单独的控制链接传输,因此说 FTP 是带外(out-of-band)传输控制信息的;HTTP 的控制信息包含在首部行中,因此说 HTTP 是带内(in-band)传输控制信息的
FTP 服务器必须在整个会话期间保留用户的状态,特别是把特定的用户账户和控制链接对应起来,此外还有用户在远程目录树上的当前位置等等,这限制了 FTP 能够同时维持的会话总数
FTP 的命令和回答使用 ASCII 文本在控制连接上传输
常见的命令如下
USER <username>
用于向服务器传输用户标识
PASS <password>
用于向服务器传输用户口令
LIST
用于请求服务器响应当前远程目录中的所有文件列表
RETR <filename>
用于请求在远程当前目录上 GET 文件
STOR <filename>
用于请求在远程当前目录上 PUT 文件
常见的回答如下
331 Username OK, Password required
125 Data connection already open; transfer starting
425 Can‘t open data connection
452 Error writing file