TCP协议之TCP的可靠性传输

版权声明:转载请注明 https://blog.csdn.net/twt936457991/article/details/89433917

TCP保证可靠性主要有以下几个方面:

 1. 超时重传机制
 2. 流量控制
 3. 拥塞控制
 4. 数据校验

① 超时重传机制

超时重传是TCP协议保证数据可靠性的另一个重要机制。其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

简单来说,就是TCP的发送方在发送数据时,会开启一个计时器等待确认消息,接收方在接收到数据时会返回确认,若超过计时器时间没有收到确认,TCP认为报文段丢失或损坏,需要对报文段中的数据进行重新组织和重传。

造成发送方没有收到ACK原因可能有:
1.接收方已经接收到数据,但是确认ACK在传输过程中由于网络原因丢失了。
2.数据在传送过程中丢失,接收方根本没有收到发送方发来的数据。

② 流量控制

如果发送方发送数据过快,接收者来不及接收,那么就会造成数据分组丢失,为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是TCP的流量控制。

TCP通过滑动窗口协议(连续ARQ协议)来实现流量控制。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。

补充:滑动窗口协议(连续ARQ协议)
在ARQ协议发送者每次只能发送一个分组,在应答到来前必须等待。而连续ARQ协议的发送者拥有一个发送窗口,发送者可以在没有得到应答的情况下连续发送窗口中的分组。这样降低了等待时间,提高了传输效率。

发送窗口的大小由接收窗口的剩余大小决定。接收者会把当前接收窗口的剩余大小写入应答TCP报文段的头部,发送者收到应答后根据该值和当前网络拥塞情况设置发送窗口的大小。发送窗口的大小是不断变化的。从而达到控制发送速率。

流量控制会引发的死锁

当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。

持续计时器

为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。

③ 拥塞控制

计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,这种情况叫拥塞。
拥塞控制是为了防止过多数据注入网络中,避免出现网络中负载过大。

拥塞控制的目的:
1.缓解网络压力
2.保证分组按时到达

常见拥塞控制算法

1.慢开始算法与拥塞避免算法
慢开始

发送方维护着一个窗口,发送方窗口的大小取决于接收方的窗口大小和网络中的拥塞程度,窗口的大小是随着发送过程动态变化的。
发送方还维持着一个慢开始门限:
   1.发送窗口 < 慢开始门限:使用慢开始算法
   2.发送窗口 > 慢开始门限:使用拥塞避免算法
   3.发送窗口 = 慢开始门限:使用慢开始算法或拥塞避免算法
具体过程:
    1.发送方的发送窗口设置为1,并发送数据分组M。
    2.当接收方接收到M1时,返回确认应答,此时发送方的发送窗口设置为原来的2倍,并发送M2,M3。以后每次收到确认应答都会扩大为原来的2倍。
    3.若发送窗口>慢开始门限,则使用拥塞避免算法,每次收到确认应答后都将发送窗口+1。
    4.若发送方出现了超时重传,则表明网络出现拥塞,此时: a)慢开始门限设为当前发送窗口的一半 b)发送窗口设为1 c)启用拥塞避免算法。

慢开始算法的作用:慢开始算法将发送窗口从小扩大,而且按指数级扩大,从而避免一开始就往网络中注入过多的分组从而导致拥塞;它将窗口慢慢扩大的过程其实也在探测网络拥塞情况的过程,当发现出现拥塞时,及时降低发送速度,从而减缓网络拥塞。

拥塞避免

拥塞避免算法作用:使窗口呈线性增长,而非呈指数级增长,从而使网络更不容易发生网络负载。

2.快重传算法和快恢复算法
快重传原理

因为TCP具有累计确认的能力,因此接收者在接收到一个分组时不会立即发出确认应答,可能需要等待多个分组之后再发出累计确认。而快重传算法要求接收方在收到一个失序的报文段后就立即发出前一个正确分组的确认应答,这样让发送方尽早知道有一个分组有可能丢失了。

快恢复原理

发送方在一连收到三个重复确认后就应当立即重传对方尚未收到的报文段,而不必等待设置的重传计时器超时。

④ 数据校验

接收方发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到检验和有差错,则TCP段会被直接丢弃。
检验和计算过程

    TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部。
发送端:

    首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
    把TCP报头中的校验和字段置为0。
    其次,用反码相加法(对每16bit进行二进制反码求和)累加所有的16位字(进位也要累加,进位则将高位叠加到低位)。
    最后,将上述结果作为TCP的校验和,存在检验和字段中。

接收端:

    将所有原码相加,高位叠加到低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。
验证示例:
  校验和 反码求和过程
    以4bit 为例
  发送端计算:
    数据: 1000 0100 校验和 0000
    则反码:0111 1011 1111
    叠加: 0111+1011+1111 = 0010 0001 高于4bit的, 叠加到低4位 0001 + 0010 = 0011 即为校验和
  接收端计算:
    数据: 1000 0100 检验和 0011
    反码: 0111 1011 1100
    叠加: 0111 + 1011 +1100 = 0001 1110 叠加为4bit为1111. 全为1,则正确。

猜你喜欢

转载自blog.csdn.net/twt936457991/article/details/89433917
今日推荐