下 网络协议与标准( 八 )


6.4.2 传输控制协议TCP
TCP(Transmission Control Protocol),传输控制协议,是整个TCP/IP协议族中最重要的一个协议 。它实现了一个看起来不太可能的事情:它在IP协议提供的不可靠数据服务的基础上,为应用程序提供了一个可靠的数据传输服务 。
程序员在编写应用程序的时候,总是有这样的一个假设,那就是认为计算机系统是可靠的 。例如,在应用程序中要编写一个向某个输入输出设备(如打印机)发送数据时,应用会直接将数据写到设备上,而不去验证数据是否正确地到达设备 。事实上,计算机系统的可靠性完全达到了这样的要求 。
而假如网络是基于IP协议这样一个不可靠的传输服务的基础上,那么程序员就必须在代码中自己去验证数据是否正确到达了,这将造成一个不可想象的工作量增大 。而TCP协议却有效地完成了这个工作,这样使用程序员在使用互联网资源时仍可以采用常规的技术,完全不必却担心可靠性问题 。
TCP协议是怎样实现可靠性的呢?这可是一个十分复杂的问题 。但说到底,最重要的是TCP采用了一个叫重发(retransmission)的技术 。具体来说,就是TCP发送数据时,发送方通过一种重发方案来被偿包的丢失,而且通信双方都要参与 。在TCP传输过程中,发送方启动一个定时器,然后将数据包发出,当接收方收到了这个信息就给发送方一个确认(acknowledgement) 。而假如发送方在定时器到点之前没收到这个确认,就重新发送这个数据包 。下面是一个TCP重发的示意图:
图6-16 TCP重发示意图
TCP的重发方案是它获得成功的要害,因为它处理了在一个任意互联网上的及答应多个应用程序并发地进行通信 。例如,一个应用能够通过卫星频道向另一个国家的某台计算机发送数据 。与此同时,另一个应用正通过局域网向隔壁房间的某台计算机发送数据 。TCP必须预备为任何一个连接中出现的丢失消息进行重发 。并且由于一个局域网中TCP不应该在重发之前等待过久 。然而,对一个长距离的卫星连接来说,就应该有更长的重发等待时间 。相对应的,TCP分门别类地对不同链路进行了不同的处理,以适应它们的特点 。
总的来说,传输控制协议(TCP)作为TCP/IP协议族中最主要的协议之一,它为应用程序直接提供了一个可靠的、可流控的、全双工的流传输服务 。在请求TCP建立一个连接之后,一个应用程序能使用这一连接发送和接收数据 。TCP确保它们按序无错传递 。最终,当两个应用结束使用一个连接时,它们请求终止连接 。
除此之外,由于一个互联网迅速随着时间推移而不断变化,因此TCP的重发超时必须具有适应性 。在具体实现中,TCP协议是使用了缓冲、流控、窗口和拥塞控制等一系列机制来实现 。有趣的读者可以专门阅读关于这方面的文献 。
6.4.3 用户数据报协议UDP
与TCP协议相对应的是UDP(User Datagram Protocol),用户数据报协议 。UDP是一个简单的协议,它并没有显著地增加IP层的功能和语义 。这为应用程序提供了一个不可靠、无连接的分组传输服务服务 。因此,UDP传输协议的报文可能会出现丢失、重复、延迟以及乱序的错误,使用UDP进行通信的程序就必须负责处理这些问题 。换句话说,就是采用UDP传输协议其实就无法避免前一上节提到的无可思议的工作量增加 。
既然UDP有这样的缺点,那么它为什么还有存在的必要呢?其实,世界上有许多问题都是十分矛盾的,TCP协议虽然提供了一个可靠的数据传输服务,但是它是以牺牲通信量来实现的 。也就是说,为以完成一个同样的任务,TCP会需要更多的时间和通信量 。这在网络不可靠的时候,牺牲一些时间换来可靠是值得的,但当网络十分可靠的情况下,TCP又成为了浪费带宽的“罪魁祸首”,这时UDP则以十分小的通信量浪费占据优势 。

推荐阅读