一、应用层模式
1.传统模式:客户-服务器模式
传统模式称为客户-服务器模式。在几年前它还是最流行的。在这种模式中,服务提供者是一个称为服务进程的应用程序,它不断地运行着,等待另一个称为客户进程的应用程序通过因特网建立连接并请求服务。通常有一些服务进程可以提供特定类型的服务,但是有很多客户向这些服务进程请求服务。服务进程必须一直运行,当需要接受服务时客户进程就被打开。这个模式的问题是通信负荷集中在服务器上,这意味着服务器应该是一台强大的计算机。
很多传统该服务仍然在使用这种模式,包括万维网( World Wide Web, WWW)以及它的传播媒介:超文本传输协议( HyperText Transfer Protocol, HTTP)、文件传输协议( File Transfer Protocol,FTP)、安全人机界面( Secure Shell, SSH)、电子邮件等等
2.新模式:对等模式(p2p)
在这种模式下,不需要一个不断运行且等待客户进程连接的服务器进程。责任在对等结点( peer)之间分担。连接到因特网的计算机可以在这一次提供服务却在下一次接受服务。由于对等模型无需一直运行和维护昂贵的服务器,它是容易扩展且经济划算的
二、客户-服务器模式
在客户-服务器模式中,应用层的通信是在两个运行着的应用程序之间进行的,这两个应用程序称为进程( process): 客户和服务器。客户是一个运行着的程序,它通过发送请求初始化通信;另一个应用程序是服务器,它等待来自客户的请求。服务器处理来自客户的请求,准备结果并将其发送给客户。服务器的定义意味着当一个来自客户的请求到达时,服务器必须是正在运行的,但是客户不必这样,它只在必要的时候运行。这意味着如果我们有两台相互连接的电脑,我们可以在一台电脑上运行客户进程,在另一台上运行服务器进程。然而,我们需要小心的是服务器进程要在客户端程序运行前开启。换言之,服务器的生存期是无限的:它应该开启后一直运行,等待客户。客户的生存期是有限的:它通常发送有限的请求给对应的服务器,接收响应然后停止。1.客户与服务器通信
客户进程是如何与服务器进程进行通信的?一个计算机程序通常是由预定义了指令集的计算机语言编写的,这个指令集告诉计算机要做什么 这样的指令集通常称为应用程序接口( Application Programming Interface, API)。程序中的接口是两个实体之间的指令集。在这种情况下,一个实体是应用层中的进程,另一个是操作系统,操作系统封装了 TCP/IP 协议簇的前四层、其中最常见的就是套接字接口。
2.套接字
尽管套接字在行为上应该和一个终端或文件类似,但是它不是物理实体,而是一种抽象。套接字是供应用程序创建和使用的数据结构。就应用层而言,客户进程和服务器进程间的通信是两个套接字间的通信。 客户认为套接字是接收请求和发出响应的实体;服务器认为套接字是发出请求并且需要获得响应的实体。如果我们创建两个套接字,一端创建一个,并且正确定义源端和目的端地址,那么我们就可以使用指令去发送和接收数据了。其余就是操作系统以及嵌入的 TCP/IP 协议的工作了。
1)套接字地址
在双向通信中,我们需要一对地址:本地地址(发送端)和远程地址(接收端)。在一个方向上的本地地址对另一个方向来说就是远程地址,反之亦然。由于客户-服务器模式的通信是在套接字之间的,我们需要一对套接字地址( socket address):一个本地套接字地址和一个远程套接字地址。因特网上的一台计算机由 IP 地址唯一确定, IP 地址在现在的因特网版本中是一个 32 位的整数。然而,可能在同一时间同一台计算机上有很多客户或服务器进程运行,这意味着我们需要另一个标识符端口来定义特定的通信中所涉及的客户或服务器 。
2)服务器端
本地套接字地址(服务器)
本地(服务器)套接字地址由操作系统提供。操作系统知道运行着服务器进程的计算机的 IP 地址。然而服务器进程的端口号需要被分配。 比如,超文本传输协议( HTTP)被分配的端口号是 80,其他进程就不能再使用了。 当服务器开始运行时,它就得知了本地套接字地址。远程套接字地址(客户)
由于服务器可以给多个用户提供服务,它事先并不知道远程套接字地址。当客户试图连接服务器时,服务器可以知道这个套接字地址。客户套接字地址包含在发送给服务器的请求报文中,它成为远程套接字地址来给客户提供响应。也就是客户端的套接字随客户的不同而不同。3)客户站点
本地套接字地址(客户)
本地(客户)套接字地址也由操作系统提供。操作系统知道运行着客户进程的计算机的 IP 地址。然而端口号是每次客户进程需要开始通信时分配给客户进程的一个临时 16 位整数。 操作系统需要确保新的端口号没有被其他正在运行的客户进程所占用。
远程套接字地址(服务器)
服务器有一个名称,一个唯一标识服务器进程的标识符。例如 URL 就是这种标识符,像是 www.xxx.yy 或者电子邮件地址 [email protected]。客户进程现在需要将这个标识符(名称)改成对应的服务器套接字地址(通过域名系统DNS来获取)。由于端口号应该是一个熟知端口号,因此客户进程通常知道端口号。三、使用传输层的服务
1.UDP
UDP 提供了无连接的、不可靠的数据包服务。
1)无连接服务
无连接服务意味着两个交换报文的终端之间没有逻辑连接。每个报文都是独立的实体,它被封装在一个称为有逻辑连接。每个报文都是独立的实体,它被封装在一个称为数据报( datagram)的分组中。 UDP看不到来自同一个源端并去往同一个目的端的数据报之间的关系(连接)。
2)不可靠
UDP 是不可靠的协议。尽管它可能在传输中检查数据是否被破坏,但是它并不要求发送端重传被破坏的或丢失的数据。
TCP 提供面向连接的可靠的字节流传输。
TCP 要求两个终端首先通过交换一些连接建立分组( connection-establishment packet)来建立一个逻辑连接。这个阶段有时称为握手,它设定了两个终端间的某些参数。这些参数包括要交换的数据分组大小、用于保存数据直到整个报文全部到达的缓冲区的大小等等。在握手过程后,两个终端可以向着彼此的方向以报文段形式发送数据块。通过计算交换的字节数,可以检测字节的连续性。比如,如果某些字节丢失或损坏了,接收端可以请求重发这些字节,这使得端间的某些参数。这些参数包括要交换的数据分组大小、用于保存数据直到整个报文全部到达的缓冲区的大小等等。在握手过程后,两个终端可以向着彼此的方向以报文段形式发送数据块。通过计算交换的字节数,可以检测字节的连续性。比如,如果某些字节丢失或损坏了,接收端可以请求重发这些字节,这使得 TCP 成为一个可靠协议。
3.SCTP是前面两个协议的组合。