TCP协议传输机制
作者姓名
作者单位正式对外名称,省份城市邮编;
摘要:本文简要介绍了TCP协议的特点、可靠传输的实现、流量控制、拥塞控制等
关键词:TCP 传输流量控制拥塞控制
引言TCP:Transmission Control Protocol 传输控制协议。TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。
1 TCP协议的主要特点
TCP协议是TCP/IP体系中非常复杂的一个协议,下面先介绍其主要特点。
(1)TCP是面向连接的传输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
(3)TCP提供可靠交付的服务。也就是说,通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
(4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。虽然在应用程序和TCP的交互式一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
2 TCP可靠传输的实现
2.1 以字节为单位的滑动窗口
TCP的滑动窗口是以字节为单位的。假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31。根据这两个数据,A就构造出自己的发送窗口。
先讨论发送方A的发送窗口。发送窗口表示:在没有收到B确认的情况下,A可以把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时传送中使用。
发送窗口里面的序号表示允许发送的序号。窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,但接收方必须来得及处理这些收到的数据。
发送窗口后沿的部分表示已发送且已收到了确认。这些数据显然不需要再保留。而发送窗口前沿的部分表示不允许发送的,因为接收方都没有为这部分数据保留是存放的缓存可空间。
发送窗口的位置由窗口前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。发送窗口前沿通常是不断向前移动,但也有可能不动。这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不便;二是收到了新的确认但对方通知的窗口缩小了,使得发送窗口前沿正好不动。
要描述一个发送窗口的状态需要三个指针P1,P2和P3,,指针都指向字节的序列号。这三个指针指向的几个部分的意义如下:
小于P1的是已发送并已收到确认的部分,大于P3的是不允许发送的部分。
P3-P1=A的发送窗口
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但尚未发送的字节数
再看一下B的接收窗口。B的接收窗口大小是20。在接收窗口外面,到30号为止的数据是已经发送过确认,并且已经交付给主机了。因此B可以不再保留这些数据。接收窗口内的序号是允许接收的。
现在假定B收到了序号为31的数据,并把31到33的数据交付给主机,然后B删除这些数据。接着把接收窗口向前移动3个序号,同时给A发送确认。A收到B的确认后,就可以把发送窗口向前滑动3个序号,但指针P2不动。
A在继续发送完后面的数据后,指针P2向前移动和P3重合,发送窗口内的序号都已用完,但还没有再收到确认。由于A的发送窗口已满,可用窗口减小到零,因此必须停止发送。若发送窗口内所有数据都已正确到达B,B也早已发出了确认,但这些确认滞留在网络中。为了保证可靠传输,A只能认为B还没收到这些数据。于是,A在经过一段时间后就重传这部分数据,,,直到收到B的确认位置。如果A收到的确认号落在发送窗口内,A就可以是发送窗口继续向前滑动,并发送新的数据。
2.2 超时传送时间的选择
上面讲到,TCP的发送方在规定时间内没有收到确认解就要重传已发送的报文段。为了使超时重传时间不至于过长或过短,TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及接收到相应的时间,这两个时间差就是报文段的往返时间RTT。TCP保留了RTT
的一个加权平均往返时间RTTS。每当第一次测量到RTT样本时,RTTS值就为所测量到的RTT 样本值。但以后没测量到一个新的RTT样本,就按下式重新计算一次RTTS:新的RTTS=(1-α)×(旧的RTTS)+α×(新的RTT样本)
上式中0≤α<1。显然,超时计时器设置的超时传送时间RTO应略大于上面所得出的加权平均往返时间RTTS。RFC2988建议使用下式计算TRO:
RTO=RTTS+4×RTTD
RTTD是RTT的偏差的加权平均,它与RTTS和新的RTT样本之差有关。RFC2988建议当第一次测量时RTTD值取为测量到的RTT样本值的一半。在以后的测量中,则使用下式计算加权平均的RTTD:
新的RTTD=(1-β)×(旧的RTTD)+β×∣RTTS—新的RTT样本∣
这里β是一个小于1的系数,他的推荐值是1.25。
2.3 选择确认SACK
若收到的报文无差错,只是未按照序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经确认到达接收方的数据呢?答案是可以的。选择确认就是一种可行的处理方法。
现举例说明选择确认的工作原理。TCP的接收方在接受对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块。比如,接收方收到了前面的的字节流不连续的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确告诉发送方,使发送方不要再重复发送这些已收到的数据。我们知道,TCP的首部没有那个字段能够提供字块的信息边界信息。RFC2018规定,如果要选择确认,那么在建立TCP连接时,就要在TCP首部的现象中加上“允许SACK”的选项,而双方必须都事先商定好。如果使用选择确认,那么原来首部中的“确认号字段”的用法不便。只是以后再TCP报文段的首部中都增加了SACK选项,以便报告收到的不连续的字节块的边界。
然而,SACK文档并没有指明发送方应当怎样相应SACK。因此大多数的实现还是重传所有未被确认的数据块。
3 TCP的流量控制
一般来说,我们只是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就有可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方速率不要太快,要让接收方来得及接收。
3.1 利用滑动窗口实现流量控制