8.4.2 网络服务和协议

所有的计算机网络都为其用户(主机和进程)提供一定的服务,这种服务通过某些关于合法消息交换的规则加以实现。下面将简要地叙述这些内容。

1.网络服务

计算机网络为使用网络的主机和进程提供服务。面向连接的服务是对电话系统的一种模仿。比如,若要同某人谈话,则要先拿起听筒,拨出号码,说话,然后挂掉。类似地,要使用面向连接的服务,服务用户要先建立一个连接,使用该连接,然后释放该连接。一个连接的基本作用则像一根管道:发送者在一端把物品(信息位)推入管道,而接收者则按照相同的顺序在管道的另一端取出它们。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

相反,无连接服务则是对邮政系统的一种模仿。每个消息(信件)携带了完整的目的地地址,与所有其他消息相独立,每个消息有自己的路径通过系统。通常,当两个消息被送往同一个目的地时,第一个发送的消息会首先到达。但是,有可能第一个发送的消息会被延误,这样第二个消息会首先到达。而对于面向连接的服务而言,这是不可能发生的。

每种服务可以用服务质量(quality of service)表征。有些服务就其从来不丢失数据而言是可靠的。一般来说,可靠的服务是用以下方式实现的:接收者发回一个特别的确认包(acknowledgement packet),确认每个收到的消息,这样发送者就确信消息到达了。不过确认的过程引入了过载和延迟的问题,检查包的丢失是必要的,但是这样确实减缓了传送的速度。

一种适合可靠的、面向连接服务的典型场景是文件传送。文件的所有者希望确保所有的信息位都是正确的,并且按照以其所发送的顺序到达。几乎没有哪个文件发送客户会愿意接受偶尔会弄乱或丢失一些位的文件传送服务,即使其发送速度更快。

可靠的、面向连接的服务有两种轻微变种(minor variant):消息序列和字节流。在前者的服务中,保留着消息的边界。当两个1KB的消息发送时,它们以两个有区别的1KB的消息形式到达,决不会成为一个2KB的消息。在后者的服务中,连接只是形成为一个字节流,不存在消息的边界。当2K字节到达接收者时,没有办法分辨出所发送的是一个2KB消息、两个1KB消息还是2048个单字节的消息。如果以分离的消息形式通过网络把一本书的页面发送到一台照排机上,在这种情形下也许保留消息的边界是重要的。而另一方面,在通过一个终端登录进入某个远程分时系统时,所需要的也只是从该终端到计算机的字节流。

对某些应用而言,由确认所引入的时延是不可接受的。一种这样的应用例子是数字化的语音通信。对电话用户而言,他们宁可时而听到一点噪音或一个被歪曲的词,也不会愿意为了确认而接受时延。

并不是所有的应用都需要连接。例如,在测试网络时,所需要的只是一种发送单个包的方法,其中的这个包具备有高可达到率但不保证一定可达。不可靠的(意味着没有确认)无连接服务,常常称作数据报服务(datagram service),它模拟了电报服务,这种服务也不为发送者提供回送确认的服务。

在其他的情形下,不用建立连接就可发送短消息的便利是受到欢迎的,但是可靠性仍然是重要的。可以把确认数据报服务(acknowledged datagram service)提供给这些应用使用。它类似于寄送一封挂号信并且要求得到一个返回收据。当收据回送到之后,发送者就可以绝对确信,该信已被送到所希望的地方且没有在路上丢失。

还有一种服务是请求-应答服务(request-reply service)。在这种服务中,发送者传送一份包含一个请求的数据报;应答中含有答复。例如,发给本地图书馆的一份询问维吾尔语在什么地方被使用的请求就属于这种类型。在客户机-服务器模式的通信实现中常常采用请求-应答:客户机发出一个请求,而服务器则响应该请求。图8-33总结了上面讨论过的各种服务类型。

阅读 ‧ 电子书库
图 8-33 六种不同类型的网络服务

2.网络协议

所有网络都有高度专门化的规则,用以说明什么消息可以发送以及如何响应这些消息。例如,在某些条件下(如文件传送),当一条消息从源送到目的地时,目的地被要求返回一个确认,以表示正确收到了该消息。在其他情形下(如数字电话),就不要求这样的确认。用于特定计算机通信的这些规则的集合,称为协议(protocol)。有许多种协议,包括路由器-路由器协议、主机-主机协议以及其他协议等。要了解计算机网络及其协议的完整论述,可参阅《计算机网络》(Computer Networks,Tanenbaum,2003)。

所有的现代网络都使用所谓的协议栈(protocol stack)把不同的协议一层一层叠加起来。每一层解决不同的问题。例如,处于最低层的协议会定义如何识别比特流中的数据包的起始和结束位置。在更高一层上,协议会确定如何通过复杂的网络来把数据包从来源节点发送到目标节点。再高一层上,协议会确保多包消息中的所有数据包都按照合适的顺序正确到达。

大多数分布式系统都使用Internet作为基础,因此这些系统使用的关键协议是两种主要的Internet协议:IP和TCP。IP(Internet Protocol)是一种数据报协议,发送者可以向网络上发出长达64KB的数据报,并期望它能够到达。它并不提供任何保证。当数据报在网络上传送时,它可能被切割成更小的包。这些包独立进行传输,并可能通过不同的路由。当所有的部分都到达目的地时,再把它们按照正确的顺序装配起来并提交出去。

当前有两个版本的IP在使用,即v4和v6。当前v4仍然占有支配地位,所以我们这里主要讨论它,但是,v6是未来的发展方向。每个v4包以一个40字节的包头开始,其中包含32位源地址和32位目标地址。这些地址就称为IP地址,它们构成了Internet中路由选择的基础。通常IP地址写作4个由点隔开的十进制数,每个数介于0~255之间,例如192.31.231.65。当一个包到达路由器时,路由器会解析出IP目标地址,并利用该地址选择路由。

既然IP数据报是非应答的,所以对于Internet的可靠通信仅仅使用IP是不够的。为了提供可靠的通信,通常在IP层之上使用另一种协议,TCP(Transmission Control Protocol,传输控制协议)。TCP使用IP来提供面向连接的数据流。为了使用TCP,进程需要首先与一个远程进程建立连接。被请求的进程需要通过机器的IP地址和机器的端口号来指定,而对进入的连接感兴趣的进程监听该端口。这些工作完成之后,只需把字节流放入连接,那么就能保证它们会从另一端按照正确的顺序完好无损地出来。TCP的实现是通过序列号、校检和、出错重传来提供这种保证的。所有这些对于发送者和接收者进程都是透明的。它们看到的只是可靠的进程间通信,就像UNIX管道一样。

为了了解这些协议的交互过程,我们来考虑一种最简单的情况:要发送的消息很小,在任何一层都不需要分割它。主机处于一个连接到Internet上的Ethernet中。那么究竟发生了什么呢?首先,用户进程产生消息,并在一个事先建立好的TCP连接上通过系统调用来发送消息。内核协议栈依次在消息前面添加TCP包头和IP包头。然后由Ethernet驱动再添加一个Ethernet包头,并把该数据包发送到Ethernet的路由器上。如图8-34路由器把数据包发送到Internet上。

阅读 ‧ 电子书库
图 8-34 数据包头的累加过程

为了与远程机器建立连接(或者仅仅是给它发送一个数据包),需要知道它的IP地址。因为对于人们来说管理32位的IP地址列表是很不方便的,所以就产生了一种称为DNS(Domain Name System,域名系统)的方案,它作为一个数据库把主机的ASCII名称映射为对应的IP地址。因此就可以用DNS名称(如star.cs.vu.nl)来代替对应的IP地址)(如130.37.24.6)。由于Internet电子邮件地址采用“用户名@DNS主机名”的形式命名,所以DNS名称广为人知。该命名系统允许发送方机器上的邮件程序在DNS数据库中查找目标机器的IP地址,并与目标机上的邮件守护进程建立TCP连接,然后把邮件作为文件发送出去。用户名一并发送,用于确定存放消息的邮箱。