zoukankan      html  css  js  c++  java
  • TCP协议-如何保证传输可靠性

    转自 https://blog.csdn.net/xuzhangze/article/details/80490362

    TCP协议保证数据传输可靠性的方式主要有:

    (1)检验和

    在发送数据时,为了计算数据包的校验和。应该按如下步骤:
    (1)把校验和字段置为0;
    (2)把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
    (3)把得到的结果存入校验和字段中。
    在接收数据时,计算数据报的校验和相对简单,按如下步骤:
    (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
    (2)检查计算出的校验和的结果是否等于零(反码应为16个1);
    (3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
    所谓的二进制反码求和,即为先进行二进制求和,然后对和取反。

    (2)序列号

    TCP将每个字节的数据都进行了编号,这就是序列号。
    序列号的作用:
    a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
    b、保证数据的按序到达
    c、提高效率,可实现多次发送,一次确认
    d、去除重复数据   
    数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现
    (3)确认应答机制(ACK)

      TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
    (4)超时重传机制 

      第一种情况:数据包丢失。当数据发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个特定的时间间隔,到点了还没有收到应答则进行重传)。

      第二种情况:确认包丢失。当接收方收到重复数据(通过序列号进行识别)的时就将其丢弃,重新发送ACK。

      重传时间的确定:报文段发出到确认中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2*500ms后再进行重传,如果仍然得不到应答就等待4*500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
    (5)连接管理机制

      三次握手和四次挥手

    (6)流量控制

      接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。 因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16窗口大小中。这个大小随数据传输情况而变,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。 

    其过程如下:

    注意:窗口大小不受16位窗口大小限制,在TCP首部40字节选项中还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。

    (7)拥塞控制 

      流量控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。 

      拥塞控制方法分为:慢开始、拥塞避免、快重传和快恢复。

  • 相关阅读:
    整合第二次(SSM第一次)------------>spring+struts2+mybatis
    整合初步--------->SSH(注解版)
    整合初步______SH
    Spring 配置数据源之一三兄弟
    Spring 中面向AOP之一系列做法
    Spring Bean的生命周期详解
    Linux常用指令大全
    CentOS7 下 RabbitMQ 3.7.8 安装 步骤
    Unhandled exception handling in iOS and Android with Xamarin.
    改进Xamarin应用程序中的HTTP性能
  • 原文地址:https://www.cnblogs.com/GuixinChan/p/10590550.html
Copyright © 2011-2022 走看看