常见的服务模式

对于两台通过网络进行通信的主机,他们需要相互发送消息。有两种交换消息的模型,每种模型都有特定的用例,它们最有效。在本节中,我们将探讨这些。请注意,服务模型是协议的属性,它们根据消费者对它们的期望来设定期望值。

面向连接的服务(TCP)

协议向其消费者提供的服务是面向连接的,当每一方在发送实际数据之前协商一个虚拟连接时。在设置过程中,必须商定一些有关连接的参数。这类似于旧的有线电话系统,在两台主机之间建立专用连接。在现代网络中,TCP 就是一个例子。TCP 的 PDU 是一个段,它由一个头和一个数据段组成。头部有几个字段用于在协议状态机的状态之间转换。下一个图显示了 TCP 头在实践中的样子。图中的每一行都是 32 位的(因此,每一行是两个八位字节),其中一些被分成多个段:

我们将看到一些用于操纵主机之前连接的方法:

  • 控制位(标志)是一组用于各种目的的 9 位。这里感兴趣的标志是 SYN、ACK、FIN 和 RST。SYN 触发序列号同步。ACK 标志表示接收器应该关心相应的确认号。FIN 标志启动断开连接的过程。RST 标志在出现错误时重置连接。
  • 序列号是一个 32 位字段,用于对接收端的消息重新排序。当设置 SYN 标志时(这种情况只适用于连接中的第一个数据包),序列号是初始序列号;否则,它是迄今为止累积的序列号。
  • 确认号是一个32位字段,用于实现可靠的消息传递。如果设置了 ACK 标志,则该值是发送方期望的下一个序列号。

在两个主机运行 TCP 交换数据之前,它们必须通过三次握手灭建立连接。这样的工作方式如下:第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,等待服务器确认。第二次握手:服务器收到 syn 包,必须确认客户的SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即SYN+ACK包。第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。成功完成后,客户端和服务器都已同意序列号和确认号。该模型的优点是具有 可靠 的连接,其中发送方和接收方都知道期望什么。发送方可以调整发送数据的速率,具体取决于接收方的速度或速度,以及网络的拥塞程度。这里的缺点是更高的连接设置成本。假设将数据包发送到另一个大陆的主机需要 100 毫秒,我们将需要在开始发送数据之前交换至少 3 个数据包。这相当于 300 毫秒的延迟。虽然这可能看起来不是很多,但请记住,在任何给定的点上,用于访问 Facebook 的笔记本电脑可能会有数千个连接向全世界的服务器开放。面向连接的服务模型适用于大量用例,但在某些情况下,开销很大或不必要。一个例子是视频流。在这种情况下,一些丢失的数据包不会引起很大的问题,因为没有人注意到视频中的少量未对齐像素。这些应用程序更喜欢无连接模型,如下所述。

无连接服务(UDP)

这里的第二种情况是无连接服务。当多个消息彼此之间没有关系时使用此方法,因此这些协议在发送任何数据之前不需要任何连接协商步骤。这方面的一个例子是UDP,它不保证传输消息的顺序或可靠性(但是,它有一个校验和字段来保证数据报的正确性)。应该注意的是,如果需要的话,在UDP之上运行的协议总是可以自由实现可靠性的。有趣的是,IP路由也是一种无连接的服务。UDP头显示如下:

很容易看到这里的头远远小于 TCP 头。它还缺少一些字段,TCP 使用这些字段来管理连接,并根据网络拥塞等进行调整。由于 UDP 没有这些字段,因此它无法提供这些保证。