TCP如何保证可靠传输

TCP保证传输可靠性

  1. 基于数据块传输:应用数据被分割成TCP认为适合发送的数据块,在传输给网络层

  2. 对失序数据包重新排序及去重:TCP为保证不丢包,就给每个包一个序列号,有了序列号就能将接收到的数据根据序列号排序,并去掉重复序列号的数据,实现数据包去重

  3. 校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

  4. 重传机制:在数据包丢失或延迟情况下,重新发送数据包,直到收到对方的确认应答(ACK)。TCP重传机制有:

    • 超时重传:每个数据报配备一个超时重传计时器,当超过一段时间没有接收到接收方的确认报文,则重传

    • 快速重传

    • SACK(在快速重传的基础上,返回最近收到的报文段的序列号范围,这样客户端就知道,哪些数据包已经到服务器了)

    • D-SACK(重复SACK,在SACK的基础上,额外携带信息,告知的发送方有那些数据包自己重复接收了)

  5. 流量控制:TCP连接的每一方都有固定大小的缓冲空间,能提示发送方降低发送速率,防止包丢失。TCP使用的流量控制协议是滑动窗口协议

  6. 拥塞控制:当网络拥塞时,减少数据发送。

TCP流量控制

为什么需要流量控制?

因为双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来。接收方会把处理不过来的数据存在接收缓冲区,如果缓冲区满了发送方还在发送,接收方就会把溢出的数据丢失掉,出现丢包问题,同时又浪费网络资源,因此需要控制发送方的发送速率,让接收方和发送方处于一种动态平衡最好。

TCP利用滑动窗口实现流量控制,流量控制是为了控制发送方的发送速率,保证接收方来得及接收。接收方通过确认报文中的窗口字段用来控制发送方窗口大小,从而影响发送方的发送效率,当窗口字段设置为0,则发送方不能发送数据。

接收窗口的大小是根据接收端处理数据的速度动态调整的。 如果接收端读取数据快,接收窗口可能会扩大。 否则,它可能会缩小。

TCP 发送窗口可以划分成四个部分

  1. 已经发送并且确认的 TCP 段(已经发送并确认);

  2. 已经发送但是没有确认的 TCP 段(已经发送未确认);

  3. 未发送但是接收方准备接收的 TCP 段(可以发送);

  4. 未发送并且接收方也并未准备接受的 TCP 段(不可发送)。

发送窗口结构图

接收窗口结构图:

  1. 已经接收并且已经确认的 TCP 段(已经接收并确认);

  2. 等待接收且允许发送方发送 TCP 段(可以接收未确认);

  3. 不可接收且不允许发送方发送 TCP 段(不可接收)。

TCP拥塞控制

  • 为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。

    • 拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。只要网络没有出现拥塞,拥塞窗口就增大一些,但只要网络出现拥塞,拥塞窗口就减少一些。

    • 发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

  • 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文,即发生超时重传

  • 发送方将拥塞窗口作为发送窗口(swnd),即swnd = cwnd

  • 发送方还需要维护一个慢开始门限ssthresh状态变量

    • cwnd < ssthresh,使用慢开始算法

    • cwnd > sshresh,使用拥塞避免算法

    • cwnd = sshresh,两种算法都可使用

TCP 的拥塞控制采用了四种算法,即 慢开始拥塞避免快重传快恢复

慢开始

在TCP双方建立逻辑连接关系时,拥塞窗口的值被设置为1,同时还需设置慢开始门限的初始值,执行慢开始算法时,发送方每收到一个对新报文段的确认时,就倍数增大拥塞窗口数值,直到拥塞窗口值增长到慢开始门限值时,就改成执行拥塞避免算法

拥塞避免
  1. 每次接收到确认报文后,拥塞窗口线性+1

  2. 当判断网络出现拥塞,即出现超时重传时

    • 慢开始门限值更新为发生拥塞时,拥塞窗口的一半

    • 将拥塞窗口的值设置为1,并重新开始执行慢开始算法

快重传

有时,个别报文段在网络中丢失,但实际网络并未发生拥塞,这将导致发送方超时重传,并误认为网络发生拥塞,因为发生拥塞避免,并错误地使用了慢开始算法,降低传输效率。

快重传可以让发送方尽早知道发生了报文段丢失,使发送方尽快进行重传,而不是等待重传计时器超时

  1. 要求接收方不要等待自己发送数据时,才进行捎带确认,而是要立即发送确认

  2. 即使收到失序的报文段也要立即发出对已收到报文段的重复确认

  3. 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等待报文段的超时重传计时器超时再重传

如图,假设发送方发送的前两个报文段都被接收方按时接收到,但第三个报文段丢失,那么发送方继续发送的接下来的三个报文段被接收方接收到之后,会接收到接受方返回的三个第二个报文段的重复确认,发送方接收到这三个重复确认后,就会立即重传第三个报文段,接收方接收到重传的报文段之后,会发送第六个报文段的确认报文,表示这六个报文段都接收到了,进而实现快速重传,避免因为误认为出现拥塞而错误降低拥塞窗口值

快恢复

发送方一旦收到3个重复确认,就知道只是丢失了个别报文段,于是不启动慢开始算法,而是执行快恢复算法,发送方将慢开始门限ssthresh值和拥塞窗口值调整为当前窗口值一半,开始执行拥塞避免算法

ARQ协议

自动重传请求(ARQ)是OSI模型中数据链路层传输层的错误纠正协议之一,它通过确认超时两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间内没有收到确认信息(ACK),通常会重新发送,直到收到确认或重试超过一定次数。

ARQ包括停止等待ARQ协议和连续ARQ协议

停止等待ARQ协议

停止等待协议是为了实现可靠传输的,其基本原理是每发完一个分组就停止发送,等待对方确认(回复ACK),如果过了一段时间后(超时时间),还没有收到ACK确认,就说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

  1. 无差错情况:

    • 发送方发送分组,接收方在规定时间内接收到,并回复确认,发送方再次发送

  2. 出现差错的情况(超时重传):

    • 数据发送超过一段时间仍然没有收到确认,就认为刚刚发送的数据丢失了,重传前面发送过的分组。因此,每发送完 一个分组,都需要设置一个超时计时器,其重传时间比数据传输的平均时间更长一些。这种自动重传方式常称为自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。

  3. 确认丢失和确认迟到:

    • 确认丢失:确认消息在传输过程中丢失。当A发送消息M1给B,B收到后,发送确认消息给A,但确认消息在传输过程中丢失,A并不知道,等待超时后,A重传M1消息给B,B再次收到该消息后:

      1. 丢弃这个重复消息M1

      2. 向A发送确认消息

    • 确认迟到:确认消息在传输过程中延迟了。A发送消息M1给B,B收到并发送确认。在超时时间内没有收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息。此时A收到B第二次发送的确认消息。接着发送其他消息,过了一会,A收到了B第一次发送的对M1的确认消息,此时处理如下:

      1. A收到重复确认消息后,直接丢弃

      2. B收到重复M1后,也直接丢弃M1

连续ARQ消息

送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

超时重传

发送方发送数据后,会启动一个定时器,等待接收方接收并返回确认消息,如果超过一定时间还没接收到接受方的ACK,则认为数据丢失并进行重传

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值