TCP可靠传输及流量控制实现原理

一、为什么TCP是可靠传输?

  1. 停止等待协议

  • 通过确认与超时重传机制实现可靠传输
  • 在发送完一个分组后,必须暂时保留已发送的分组的副本。
  • 分组和确认分组都必须进行编号。
  • 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。

出现差错或丢失的时候,发送方会将自己备份的副本再重传一次,直到收到接收的确认信息。当接收方收到重复的数据时,会直接丢弃,但是会给发送方请确认自己已经收到了。

  

2. 改进的停止等待协议——连续ARQ协议和滑动窗口协议

上面的停止等待协议每发送一组数据就必须等到接收方回复确认后,再发起第二组数据,如果出现超时重传的话,效率更低。因此为了提高传输的效率,改进了等待传输协议。

连续ARQ协议和滑动窗口协议的机制是以接收方回复确认为单位,每次连续发送一个滑动窗口指定的数据组。示例图如下:

2.1 什么是滑动窗口协议?(发送方怎么发送数据)

滑动窗口是由发送方维护的类似指针的变量,在每收到一个接收方的确认消息后,该指针向前移动并发送数据,到窗口指定大小的数据组时停下,等待接收方的确认。示意看图:

  

  2.2 接收方怎么回复确认?
   累积确认机制

发送方不对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。

优点:容易实现,即使确认丢失也不必重传。

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

Go-back-N(回退 N)

为了解决上述同一窗口中数据组不能完整确认的问题,连续ARQ协议采用了回退机制。比如说:发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。

结论:当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。可能还不如传统的停止等待协议。

3. TCP可靠传输的实现

  • TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
  • TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
  • TCP 两端的四个窗口经常处于动态变化之中。
  • TCP连接的往返时间 RTT 也不是固定不变的。需要使用特定的算法估算较为合理的重传时间。
3.1 以字节为单位的滑动窗口技术

滑动窗口是面向字节流的,为了方便记住每个分组的序号,下面的图解以一个分组假设100个字节,为了方便画图表示,将分组进行编号简化表示,如图所示,但是要记住,每一个分组的序号是多少。

3.2 改进的确认——选择确认(SACK)

  TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的分组后续的分组,这样原先已经正确传输的分组也可能重复发送,降低了TCP性能。SACK(Selective Acknowledgment,选择确认)技术,使TCP只重新发送丢失的包,不用发送后续所有的分组,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据已经提前收到等。在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好。原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界

  选择性确认最多表示4个边界:由于首部选项的长度最多只有 40 字节。需要一个字节指明是SACK选项,另一个字节指明占多少字节。而指明一个边界就要用掉 4 字节。在选项中最多只能指明 4 个字节块的边界信息。因4个字节块共8个边界信息。

  

抓包分析:

3.3 超时重传时间的选择

  重传机制是 TCP 中最重要和最复杂的问题之一。TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。那么这个重传时间到底应该设置多少呢?这里面有学问。以下是我截取的“手抄报”,暂时看不懂。建议跳过。

加权平均往返时间

TCP 保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间)。第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS:

超时计时器设置的超时重传时间RTO

往返时间的测量

Karn算法

二、TCP的流量控制

流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

流量控制举例说明:

零窗口处理——持续计数器

考虑上面的例子中,当A发送的数据已经到达B的接收窗口上限,此时A就必须等待B处理了部分数据后,待接收窗口有空闲的时候,再次发送数据,那么A是怎么知道B的接收窗口何时有空闲呢?这时就用到了持续计时器。

  TCP 为每一个连接设有一个持续计时器。只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。若窗口不是零,则死锁的僵局就可以打破了。

三、TCP的传输效率

关于TCP的传输效率问题,需要从三方面来考虑,1.何时发送;2.少字节发送数据问题;3.糊涂窗口综合症问题

TCP报文的发送时机:

第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push)操作。
第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

少量字节发送数据问题:

问题描述:如果应用程序一次产生一字节数据,这样会导致网络由于太多的包而过载。如:从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的标题数据。

解决方案(NAGLE算法):发送端的应用进程将欲发送的数据逐个字节地送到TCP缓存,则发送端就将第一个字符先发送出去。将后面到达的字符都缓存起来。当接收端收到对第一个字符确认后,再将缓存中的所有字符装成一个报文段发送出去,同时继续对随后到在的字符进行缓存。只有在收到对前一个报文段确认后才继续发送下一个报文段。

糊涂窗口综合症问题:

问题描述:设想一种情况:接收端缓存已满,而交互式的应用进程一次只从缓存中读取一个字符,然后向发送端发送确认,并将窗口设置1个字节。接着发送端又发来1个字符。接收端发回确认,仍然将窗口设置为1个字节。这样下去,网络效率非常低。

解决方案:设想一种情况:接收端缓存已满,而交互式的应用进程一次只从缓存中读取一个字符,然后向发送端发送确认,并将窗口设置1个字节。接着发送端又发来1个字符。接收端发回确认,仍然将窗口设置为1个字节。这样下去,网络效率非常低。

原文地址:https://www.cnblogs.com/ytuan996/p/10598532.html

时间: 2024-11-06 10:23:21

TCP可靠传输及流量控制实现原理的相关文章

数据流和数据报、TCP可靠传输

数据报表明是一个整体,write几次,就读取几次 数据流是基于字节的,1次write100个字节,肯能分10次读取 TCP基于数据流面向连接的,UDP基于数据报面向非连接的 TCP提供可靠服务的理解: 1.基于连接的,3次握手协议 2.差错检验.超时重发.滑动窗口协议保证了可靠性. 1.想象数据包只会出错,一次只能发一个包,确认后才能发下一个包:差错检验.发送端发包,接受段接包,发现错误,发送NCAK,发送端收到后重发包. 当NCAK也出错时,怎么办?当发送端在等待ACK的过程中,收到ACK或N

TCP可靠传输机制

TCP提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接.这一过程与打电话很相似,先拨号振铃,等待对方摘机说"喂",然后才说明是谁.在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP. TCP通过下列方式来提供可靠性: 1.面向字节流和缓存机制:应用数据被分割成TCP认为最适合发送的数据块.这和UDP完全不同,应用程序产生的数据长度将保持不变.由TCP传递给IP的信息单位称为

计算机网络(9)-----TCP可靠传输的实现

TCP可靠传输的实现 以字节为单位的滑动窗口 滑动窗口的滑动是以字节为单位的,发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗口和接受窗口的大小,发送方A根据B发送来的确认连接报文中标明的窗口的大小,来确定收到确认前的最大发送数据量,如果A接收到的B发来的确认报文中标明的窗口大小为0,则停止发送数据,直到收到不为0的确认报文,再继续发送.发送窗口表示在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去,凡是已发送过的数据,在没有收到确认前都要暂时保留,以便超时重传时使用.

TCP可靠传输详解

TCP提供了可靠的传输服务,这是通过下列方式提供的: 分块发送:应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给IP的信息单位称为报文段或段(segment) 定时确认重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段.如果不能及时收到一个确认,将重发这个报文段. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认.这个确认不是立即发送,通常将推迟几分之一秒 数据校验:TCP将保持它首部和数据的检验和.这是一个端到端的检验和,目的是检测数据在传输过程中的

TCP可靠传输:校验和,重传控制,序号标识,滑动窗口、确认应答

Tcp通过校验和,重传控制,序号标识,滑动窗口.确认应答实现可靠传输 应答码:ACK TCP的滑动窗口机制       TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的传输协议就需要对数据进行确认.TCP协议里窗口机制有2种:一种是固定的窗口大小:一种是滑动的窗口.这个窗口大小就是我们一次传输几个数据.对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送:同时接收方也维持着一个接收窗口,只有落在接收窗口内

tcp可靠传输的机制有哪些(面试必看

一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报. tcp会按MTU合理分片,接收方会缓存未按序

TCP可靠传输的保证

我们知道传输层提供最主要的两种协议,TCP和UDP,其中TCP是保证可靠传输,为什么他要保证可靠传输呢,IP说:当然是我不能,我只提供尽力而为的服务,不保证你能不能交付,不保证能不能正确的交付,不保证能不能按顺序交付.要不然干嘛要你保证呢.说的好有道理,我呵呵一笑. 那么可靠数据传输到底能保证什么呢? 1.不错:就是传输的数据包没有错误 2.不丢:传输的数据包不丢失 3.不乱:传输的数据包顺序要保持正确的交付. 可靠传输协议凭什么能做出这样的保证呢? 1.差错检测:TCP将保持它首部和数据的检验

TCP可靠传输的实现

假设我们讨论A向B发送数据,A端有发送窗口,B端有接受窗口 根据 B 给出的窗口值 A 构造出自己的发送窗口,假如A收到了B的确认报文,此时窗口的值为20,确认序号的值为31,那么接收端会构造出下面的窗口 这里面前后沿可以不动和前移,但是前沿可以后移(不建议) 下面我们讨论发送窗口 (1)发送窗口表示,里面的数据在未收到确认数据报之前,都可以连续发送,但是发送了的,必须保留,以便于重传 (2)如果窗口越大,那么可以连续发送的却多,但是前提是接收窗口可以及时接收 (3)发送窗口后沿的部分表示已经确

Tcp可靠Udp不可靠原理

1. Socket缓冲区 应用程序通过调用send, read方法向网络上发送应用数据,该过程中由于应用程序调用send/write的速度同网络介质发送数据的速度存在差异,所以,应用通过socket发往 网络上的的数据会先被缓存,即socket发送缓冲区,等待网络空闲时再发送出去.同样,socket从网络上接受到的数据,也会被缓存,即socket接受缓冲区,等待应用程序把数 据从中读出.其中,应用程序调用send发送数据,是将数据拷贝到socket的内核发送缓冲区中,然后send便会返回,即se