网络>>TCP协议(3)

前往上文 TCP协议(2)

TCP提高效率机制

  1. 滑动窗口
  2. 流量控制
  3. 拥塞控制
  4. 延时应答
  5. 捎带应答

滑动窗口

通过批量发送数据,缩短等待时间.一次发多条数据,一次等多条ACK.
情景带入: 主机A给主机B发送数据。有两种方式.

  1. 一条一条数据进行发送.一条数据等待一个ACK.
    在这里插入图片描述
    A给B发送第一条数据,等待ACK.ACK返回以后再发送第二条数据.以此类推.
    这样以来就会把时间浪费到等待ACK返回上.尤其是数据往返的时间较长的时候.性能较差.
  2. 批量发送数据.一次发多条数据,一次等多条ACK.
    在这里插入图片描述
    A一次给B发送多条数据(上图为4条),在数据发送过程中无需等待ACK.上述批量传输数据的过程,称为滑动窗口.

批量发送不是无限制发送,而是发送到一定程度就等待ack, 不等待直接发送的数据量是有限的
当回来一个 ack 就立即发送下一条数据, 相当于总的要批量等待的数据条数是一样的
这就好比一个固定大小的窗口. 如下图:

在这里插入图片描述

过程中丢包问题

两种情况:

  1. ACK 丢失
  2. 数据丢失
ACK丢失

在这里插入图片描述

上述圈中的三次传输在返回ACK时候,ACK丢失,但对于数据丢失来说没有任何影响.简言之,对于批量传输数据来说,ack 丢了没有什么事. 包丢的多也对于可靠性没啥影响.原因如下:

  • 在数据传输过程中, 即使 ack 丢了, 后面的确认序号会表示之前的数据都已经收到了.
  • 也就是说 后一个 ack 覆盖了前一个 ack 的内容.

对于确认序号前面文章已经提到了.网络>>TCP协议(1)

确认序号表示(补充):

  1. 前面的数据都已经收到了
  2. 可以发送从该位置开始的后面数据了
数据丢失

在这里插入图片描述
前面提到过对于数据接收,主机B会将数据放到接收缓冲区里面.如下:
在这里插入图片描述
对于丢失的数据,当数据重新接收到就会自动存放到接收缓冲区里面.而不会因为这段数据的丢失,对后面数据的传输产生影响.
小结:

  • 上述重传过程整体速度是比较快的,没有任何冗余操作.因此这个重传过程也称为快速重传.
  • 当数据丢失时, 接收方仍然会继续索要丢失的数据, 当索要次数达到三次后, 与此同时发送方就会收到这三次同样的确认应答,就会 将索要的数据进行重发.
  • 对于之前收到的数据,接收方是不会再次进行索要的,而是索要后面的数据. 因为前面的数据已经收到过了,并保存在接收缓冲区中.
  • 滑动窗口,快速重传,是在批量传输大量数据的时候会采取的措施.换言之,如果就只传输一条两条,少量的,低频的操作. 就不会按滑动窗口这么传输数据,而是采用确认应答和超时重传了.
  • 当上述过程重新发送数据仍然出现丢失,就会进行超时重传. 超时重传

流量控制

滑动窗口是批量发送的,那么当窗口越大,批量发送的就会更多,速度也就会更快.
但是保证可靠性是最重要的.不可靠速度再快也没用.
由此引入流量控制: 通过流量控制,本质上就是让接收方来限制发送方的速度

如何控制

流量控制
当ACK为1的时候,窗口大小字段就会生效,这里的值是建议发送方发送的窗口大小.
接收方如何计算窗口大小?

  • 直接拿缓冲区剩余空间作为窗口大小

具体过程:

  • 在数据传输的过程中,当发送方发现接收缓冲区满了的时候,就会发送一个窗口探测报文(用来判断接收缓冲区是否满).
  • 如果探测为不满了,就会继续发送数据
  • 当接收缓冲区不满的时候,也会给发送方发送窗口更新通知.
  • 为了防止窗口更新通知丢失,发送方会时不时发送窗口探测报文

拥塞控制

滑动窗口的大小取决于流量控制和拥塞控制.

  • 流量控制: 衡量了接收方的能力
  • 拥塞控制: 衡量了传输路径的处理能力

现实中,在主机A和主机B之间一般不是直接进行数据传输的,而是通过许多个路由器或者交换机来进行数据中转的. 流量控制只是对主机B的能力进行衡量,对于传输过程中的能力就需要用拥塞控制来进行衡量.
在发送方和接收方之间有多个交换机或者路由器(即中间节点),而拥塞控制就是针对这些来设置的策略

具体实现:

  • 通过实验的方式,找到一个合适的发送速率
  • 开始的时候,按照一个小的速率发送
  • 如果不丢包就提高一下速率(即扩大窗口大小)
  • 如果出现丢包就立即把速率调小
  • 重复上述过程.

如下图:
在这里插入图片描述
对上图描述:

拥塞控制刚开始是以一个很小的速率传输,
随着传输先以指数规律增长,
到了一个阈值后以加法规律增长.

后面如果出现丢包(即接近传输极限),就会将速率调小. 然后重复上述操作.

延时应答

在返回 ACK 的时候,等待一会再返回 ACK(此时这个ACK里面带有窗口大小) .
在这个等待的过程中,接收缓冲区里面的数据就会被消费一部分.
这样一来,此时 ACK 里面的窗口大小大概率是比立即应答大小大的.
在这里插入图片描述

延迟应答的效果:
就是通过这个延时,让接收方应用程序,趁机多消费点数据,此时反馈的窗口大小就会更大一点.此时发送方的发送速率也就能快一些 (同时也能满足让接收方能够处理过来).

那么什么时候触发延时应答呢?

  • 数量限制:每隔N个包就应答一次.
  • 时间限制:超过最大延迟时间就应答一次.

捎带应答

捎带应答是基于延迟应答的.
客户端和服务器的通信模式一般都是一问一答的模式.当 ACK 等一下再返回的时候,就很有可能与服务器的响应合并成一个数据包一起返回回去.

在这里插入图片描述
本应发送两次,上述通过一次发送,使得效率提高.

粘包问题

上述机制中,每当数据发送过来的时候,都会将数据放到接收缓冲区里面.而每一个数据都相当于一个应用层数据报,当 A 给 B 连续发了多个应用数据报之后,这些数据就都会积累到 B的接收缓存区中,紧紧挨在一起. 这时 B 的应用程序在读数据的时候就无法区分数据是从哪开始,从哪结束,很难区分一个完整的数据报. 这就是粘包问题. 如下:
在这里插入图片描述
这样的数据发过来,应用程序怎能知道哪句是哪局呢? 为了解决上述问题,有以下方法:

  • 自定义定义分隔符. 以分隔符来判断每一句话.
  • 约定长度. 例如约定数据的前四个字节表示数据的长度,后续应用程序就会根据这个长度来进行区分.

连接异常终止

在连接中难免会遇到一些问题,导致连接异常终止.如下:

  1. 进程关闭/进程崩溃
  2. 主机正常关机
  3. 主机异常关机(主机掉电,即突然电没了)/网线断开
  • 对于1,2异常: 进程都没了,但扔可以发送FIN请求.与正常关闭没什么区别.
  • 对于上述3异常:
    (1) 对端是发送方
    在这里插入图片描述
    这显然就是超时重传的一种机制. 此时会经过 超时重传, 重置连接,释放连接. 连接关闭.
    (2) 对端是接收方
    在这里插入图片描述
    对于这种情况,TCP内置了心跳包(保活机制)

接收方会定期向发送方发送一个心跳包.而发送方需要进行返回.
如果没有返回,则证明发送方连接异常终止了.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值