一、互联网概述
TCP,即传输控制协议,是目前网络上使用的最多的传输协议,我们知道,整个互联网的体系结构是以IP协议提供的无连接的端到端的报文传输服务为基础,在这种体系结构下,那么端到端的数据传输需要自己来保证数据的可靠性,TCP所作的就是这样的工作,它提供了端到端的数据可靠性的传输,当然,在互联网上没有100%的可靠性保证。正是因为TCP的贡献,所以自从提出后就成为了网络的标准传输协议。
先来看下TCP的是如何保证数据可靠传输的,TCP对所传输的数据都做了序号标记,序号是按照字节数来增长的,TCP的接收方在接到数据后发出一个确认(ACK)给对端,ACK里面包含一个序列号,这个序列号n表示序号在n之前的数据已经全部收到了,现在期待序号为n的数据到来。我们必须要知道的一个事实就是,主机发去网络上的任何一个数据包都有可能在网络上被丢弃,由于网络中路由器处理能力限制、链路错误等原因都会导致数据包的丢弃。如果ACK被丢弃了的话,,那么就要靠重传机制了。TCP对发出去的数据包都保留有计时器,如果定时器到而确认还没有收到的情况下,TCP会对刚才发送的数据包进行重传。TCP使用确认和超时重传机制保障了数据的可靠性传输。
再看流量控制方面,由于数据的发送方和接收方并不一定有相同的数据处理能力,为了避免数据发送过快而超过对方的接收能力,TCP采用了流量控制机制,接收方在TCP的包头里面通告了发送方自己的接收窗口,也就是还能够接收的最多的数据包,这样TCP就不会过度发包而超过对方的接收能力。
似乎看上去TCP已经很完美了,它提供了端到端的数据可靠性保证,并且还考虑对端的接收能力,事实上TCP的最初设计也就是这么一些机制,具体可以看RFC793的文档。注意到这篇文档的日期为1981年,TCP从此开始出现在互联网上传输数据。1986年10月,一件事情的发生使得TCP开启了一个新领域,从美国LBL到UC Berkeley的数据吞吐量从32Kbps下降到40bps,具体可以参见V. Jacobson的论文“Congestion Avoidance and Control”,请记住这篇文章,我们后面还会多次提到它。是什么原因导致了数据吞吐量如此严重的下降呢?原来在TCP的控制机制里面只考虑到了接收端的接受能力,而忽略了一个很重要的方面,那就是没有考虑到网络自己的传输能力,从而造成了整个网络崩溃的发生。从这以后,TCP的研究课题就开始多了一个方向,那就是拥塞控制,因为拥塞控制算法对保证互联网的稳定性具有十分重要的作用,其中以V. Jacobson的那篇论文开创了互联网网拥塞控制领域的工作。