您的位置:首页 > 理论基础 > 计算机网络

TCP详解

2019-07-23 19:53 102 查看

1.滑动窗口

对于一些数据吞吐量要求较高的应用,总是希望没次发送尽可能多的数据到主机,对于这类应用,TCP使用滑动窗口协议,该协议允许发送方在停止发送前和等待确认前可以连续发送多个分组,因此可以加速数据的传输。

滑动窗口的滑动是以字节为单位的,发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗口和接收窗口的大小,发送方A根据接收方B发送来的确认连接报文中表明的窗口的大小,来确定收到确认前的最大发送数据量,如果A接收到了B发来的确认报文中表明的窗口大小为0,则停止发送数,知道收到不为0的确认报文,再继续发送。发送窗口表示在没有收到B的确认的情况下,A可以联系把窗口内的数据都发送出去,凡是已发送过的数据,在没有收到确认前都要暂时保留,以便超时重传时使用。

需要注意的一点:使用TCP滑动窗口协议时,接收方不必确认每一个收到的分组,在TCP中,ACK确认是累积的,可以在接收到几个序号连续的报文段后只发送一个ACK确认报文,但累积等待的时间最长不能超过0.5秒,以防止发送端超时重传。

2.TCP的流量控制机制

一般来说,我们总是希望数据传输的更快一些,但如果发送方把数据发送的很快,而接收方来不及接收,这就可能造成数据的丢失。流量控制就是让发送方的发送速率不要太快,让接收方来得及接收。
对于成块数据流,TCP利用滑动窗口机制来实现流量的控制,对于交互数据流,TCP利用捎带ACK和Nagle算法来实现流量的控制。

详细说下利用滑动窗口机制来实现流量控制的机制:

我们假设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是rwnd = 400”(这里的rwnd表示 receiver window)。因此,发送发的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。TCP连接建立时的窗口协商过程途中没有显示出来。再设每个报文段为100字节,而数据报文段序号的初始值设为1.大写的ACK表示首部中的确认位ACK,小写的ack表示确认字段的值。
从图中可以看出,B进行了三次流量控制。第一次把窗口减少到rwnd=300,第二次又减到了rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了。何种发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

我们考虑一种特殊的情况,如果B在向A发送了零窗口报文段后布局,B的接收缓存又有了一些存储空间,于是B向A发送了一个rwnd=400的报文段,然而这个报文段在传送过程中丢失了,A就一直等待B发送非零窗口的报文通知,而B一直等待A发送数据,如果没有任何措施的话,这种思索的局面会一直延续下去。

为了解决这个问题,TCP为每一个链接设有一个持续计时器(也叫坚持定时器)。只要TCP链接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(携1字节的数据),对方在收到探测报文段后,在对该报文断的额确认后给出现在的窗口值,如果窗口值仍是零,则收到这个报文段的一方就重新设置持续计时器,如果窗口不为零,那么思索的僵局就被打破了。

糊涂窗口综合症。设想一种情况,TCP加收放的缓存已满,而应用进程一次只能从接收缓存中读取1字节(这样就使接收缓存空间仅腾出1字节),然后向发送方发送确认,并把西黄口设置为1个字节(但发送的数据报文为40字节长)。接收,发送方由发来1个字节的数据(发送方的IP数据报是41字节)。接收方发回确认,仍然将窗口设置为1字节。这样,网络的效率很低。要解决这个问题,可让接收方等待一段时间,或者等到接收方缓存已经有一半空闲的空间。只要出现这两种情况之一,接收方就发回确认报文,并向发送方通知当前的窗口大小。此外,发送方也不要发送太小的报文段,而是把数据报积累成足够大的报文段,或达到接收方缓存的空间的一般大小时再发送给接收端。

3.TCP拥塞控制机制
计算机网络中的太宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。

所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所以的主机、路由器以及因特网。
拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种

慢开始和拥塞避免
发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度,动态的变化,而发送窗口一般取拥塞窗口和对方给出的接收窗口的最小值(为了便于描述,后面的分析中假定对方给出的接收窗口足够大,这样将发送窗口等于拥塞窗口就可以了)。
慢开始算法的核心是**从小到大逐渐增大发送窗口,也就是说,从小到大逐渐增大拥塞窗口的数值。**通常在刚开始发送报文段时,先把拥塞窗口设置为一个最大报文段(MSS)的数值,而在每收到上一轮报文段(每次加倍后的报文段的个数,可能不止一个报文段)的确认后,就把拥塞窗口的数值加倍。

为了防止拥塞窗口增长过大引起网络拥塞,还需要维护一个慢开始门限的状态变量,当拥塞窗口的值小于慢开始门限时,使用慢开始算法,一旦拥塞窗口的值大于慢开始的门限的值,就改用拥塞避免算法。

拥塞避免算法的思路是让拥塞窗口缓慢的增大,收到每一轮的确认后,将拥塞窗口的值加1,而不是加倍,这样拥塞窗口的值按照现行规律缓慢增长。

注意:无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(没有按时收到确认),就把慢开始门限设置为出现拥塞时放窗口值的一半,但最小不能小于2个MSS值,而后把拥塞窗口的值重新设置为一个MSS,执行慢开始算法。

快重传和快恢复

开重传算法首先要求接受方每收到一个失序的报文段后就立即发出重传确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才才进行捎带确认,也不是累积收到的报文发送累积确认,如果发送方连续收到的三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达)。

快恢复算法与快重传算法配合使用,其过程有如下两个要点:
1)当发送方连续收到三个重复确认时,就把慢开始门限减半,这是为了预防网路发生拥塞。注意,接下来不执行慢开始算法。
2)由于发送方现在认为网络很可能没有发生特别严重的拥塞(如果发生率严重拥塞的话,就不会一连有好几个报文段到达接收方,就不会导致接收方连续发送重复确认),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口的值不设为1个MSS),而是把拥塞窗口的值设为慢开始门限减半后的值,而后开始执行拥塞避免算法,线性的增大拥塞窗口。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: