TCP传输的可靠性保证

        报文段:

         应用数据被分割成TCP认为最适合发送的数据块,称为报文段或段。(希望大佬告诉我这个和可靠性有什么关系)

        序列号和确认应答(ACK)

        发送方对要发送的包进行编号,这就是序列号。接收方接收到包后,发送包含接收到的包的序列号的确认应答给发送方确认。

延时确认:接收端在收到数据包后不立马进行ACK数据包的发送,而是等待一定的时间,并统一对收到的多个数据包进行确认应答。

        当发送方一次发送多个包时,发送端会从发送缓冲区取一部分数据组成发送报文,在tcp协议头中会附带序列号和长度,接收方经过延时确认仅会发送连续的最后一个序列号作为确认应答给接收方,而不连续的会被临时存储,重复的会被丢弃。如果发送方发送数据后一直没接收到确认应答就会启动超时重传。
        例如:发送放发送的序列号为:101、102、103、104、105,而接收方接收到的为101、103、102、105,此时105会被临时存储,而返回的确认应答为103,即要求发送方从104开始重新发送;等接收到104后会直接返回105,因为之前就存储了105;如果发送方还发送了105的话这个105会被丢弃,因为接收方已经接收到这部分数据了。

        超时重传:

        当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。

        定时器的时间设置:初始化是6s,之后根据确认应答的时间(RTT)来动态计算定时器的时间,
        重传时间的确定:报文段发出到收到应答中间有一个报文段的往返时间(RTT),显然超时重传时间(RTO)会略大于这个RTT,在RFC 2988中建议RTO的计算方式为:RTO=RTTs + 4×RTTd,其中RTTs为加权平均往返时间,RTTd是偏差的加权平均值。

        检验和:

        如果接收方检测到检验和有差错,TCP将丢弃这个报文段且不确认收到此报文段,发送方等待一段时间还未接收到确认的话会进行超时重传。

        TCP的伪首部共12字节,包含如下信息:32位(4个字节)的源IP地址、32位的目的IP地址、4位保留字节(置0)、6位传输层协议号(TCP是6,UDP是17)、16位TCP报文长度(TCP首部+数据)。

        TCP在计算检验和时,要加上一个12字节的伪首部,增加其检错能力:如检查TCP报文是否正确(源、目的IP地址)、传输层协议是否正确(传输层协议号)等。

                详细计算过程:

发送端:

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

接收端:
        将所有反码相加,高位叠加到低位, 若计算结果的16位中每一位都为1,则正确,否则说明发生错误。  

                例子:

以4bit 为例,先计算出发送端的校检和

发送端计算:
        数据:   1000  0100     0000(发送端校检和置位0)
        则反码: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,则数据正确。

流量控制

        TCP 连接的双方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据(防止接收端缓冲区溢出)。当接收方来不及处理发送方的数据,能提示发送方,发送方根据流量控制协议降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议,即TCP 利用滑动窗口实现流量控制。

        发送端的滑动窗口在缓冲区中,大小不超过接收端的缓冲区大小,发送端缓冲区如下:注:滑动窗口中的单位是字节而不是数据报。

①已发送且已确认②已发送但未确认③未发送但允许发送④未发送数据

        其中②和③的大小就是滑动窗口此时的大小。①其实不在缓冲区里,因为被确认后①会被删除。②是未确认的数据,防止丢包或者其他错误所以要保留,直到确认完成才删除。

        当发送端发送数据时,会顺便将滑动窗口的大小也发送过去,接收端等到接收到连续的、滑动窗口大小的数据后进行确认应答(还会根据自身情况返回滑动窗口大小),或者中间有不连续的就发送连续的最后一个序列号让发送端做重传。


拥塞控制

        当网络拥塞时,减少数据的发送

        在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。

拥塞控制包括四个部分:慢开始、拥塞避免、快重传和快恢复。

拥塞窗口(cwnd):每个连接都有一个拥塞窗口,该窗口大小以字节为单位,但是增加和减少以MSS为单位;初始大小为1个MSS。

拥塞窗口阈值(ssthresh): 初始为64KB。

指数递增:每次成功发送一个MSS长度的报文段(成功发送是收到对应的确认),则发送方拥塞窗口加倍;

线性递增:增长到临界值后,每次增加一个MSS;

指数级递减:出现超时重传时,将临界值设为当前拥塞窗口的1/2,拥塞窗口恢复为1个MSS大小;

指数退避:对保留在发送窗口中的报文段,将重传时限加倍;

乘法减小:无论是慢开始阶段还是拥塞避免,只要出现了网络拥塞(超时),就把拥塞窗口阈值(ssthresh)减半

发送窗口 = min(接受方窗口大小,cwnd),发送数据时使用发送窗口而不是cwnd。

发送方让自己的发送窗口等于拥塞。只要网络没有出现拥塞,拥塞窗口就在增大一些,一边把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数。

慢开始:

        刚开始cwnd设为1,先发送少量数据试探一下网络的拥塞情况。每收到一个确认应答就指数递增逐步增大cwnd直到cwnd大于等于拥塞窗口阈值时就进入拥塞避免。

拥塞避免:

        拥塞避免并非完全能够避免拥塞,而是说在拥塞避免阶段将拥塞窗口从指数递增转为线性递增,使网络比较不容易出现拥塞。

快重传:

        当接收方在收到一个失序的报文段后就立即发出重复确认(确认是否为网络阻塞造成)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

快恢复: 

        当快重传接收到连续三个重复确认后,执行乘法减小算法,之后将拥塞窗口大小设置为拥塞窗口阈值,执行拥塞避免。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值