转自http://blog.csdn.net/goodluckwhh/article/details/10220999

一、SACK选项

默认情况下TCP采取的是累积确认机制,这时如果发生了报文乱序到达,接收方只会重复确认最后一个按序到达的报文段,为此发送方的处理只能是重复按序到达接收方的报文段之后的那个报文段,因而它无法准确知道哪些报文段到达了,哪些没有到达。
考虑以下情景,发送方的窗口状态如下:

如上图所示,主机A通过TCP发送10个长度都为100字节的报文段给主机B,其序号分别为0,100,200,300,400,500,600,00,800,900(图中以数字0-9代替)。主机B收到了序号为0和序号为100的报文段,但是序号为200,300,400的丢失了。之后主机B又收到了报文段500,600,700,800,900。当收到后续这些分组时,主机B只能对报文段100继续进行确认,即发送确认号为200的ACK。主机A收到这样的确认时,能重传的唯一报文段就是报文段200,在报文段200的确认被收到之前发送窗口是无法移动的,这时状况就会很糟糕,发送方每重传一个丢失的报文段,接收方就确认一个(由于是累积确认的,所以情况可能更糟,接收方每次都在等待一段时间后才发送确认),然后发送窗口向前移动一个,这个过程一直持续到报文段200,300,400都被接收方到。显然这种工作方式效率很低,降低了吞吐量。
SACK是TCP选项,它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息。根据这些信息TCP就可以只重传哪些真正丢失的报文段。
需要注意的是只有收到失序的分组时才会可能会发送SACK,TCP的ACK还是建立在累积确认的基础上的。也就是说如果收到的报文段与期望收到的报文段的序号相同就会发送累积的ACK,SACK只是针对失序到达的报文段的。
SACK包括了两个TCP选项,一个选项用于标识是否支持SACK,是在TCP连接建立时时发送;另一种选项则包含了具体的SACK信息。

1.SACK允许选项

该选项格式如下所示:

它的工作机制类似于窗口扩大选项和事件戳选项,只能应用于SYN报文段,在连接建立阶段,主动发起连接的一方在它的SYN中指定选项。只有在它从另一方的SYN中收到了这个选项之后,FAK机制才会被使能。

2.SACK选项

SACK选项的格式如下图所示:

该选项长度可变,但由于整个TCP选项长度不超过40字节,所以实际最多不超过4组边界值。
该选项参数告诉发送哪些报文段是已经接收到并缓存的不连续的报文段,发送方可根据此信息检查究竟是哪个块丢失,从而发送相应的报文段。

  1. LeftEdgeofBlock:不连续块的第一个报文段的序列号
  2. RightEdgeofBlock:不连续块的最后一个报文段的序列号之后的序列号。

3.SACK的产生

SACK由接收方产生并通告给发送方,其产生有以下几种情形:

3.1中间有丢包或延迟时的SACK

如果接收方接收到的报文段序号大于所期待的序号,说明有报文段被丢弃或者出现了大的延迟,此时可以发送SACK通知发送方。
为反映接收方的接收缓存和网络传输情况,SACK中的第一个块必须描述是那个报文段触发了该SACK的发送,接收方应该尽可能地在SACK选项部分中填写尽可能多的块信息,让发送方能了解当前网络传输情况的最新信息。

3.2对重复发送包的SACK(D-SACK)

RFC2883中对SACK进行了扩展。SACK中的信息描述的是收到的报文段,这些报文段可能是正常接收的,也可能是重复接收的,通过对SACK进行扩展,D-SACK可以在SACK选项中描述它重复收到的报文段。但是需要注意的是D-SACK只用于报告接收端收到的最后一个报文与已经接收了的报文的重复部分,比如(来自RFC):

Transmitted       Received                              ACK Sent

Segment            Segment                               (Including SACK Blocks)
 500-999             500-999                               1000
 1000-1499         (data packet dropped)
 1500-1999         (delayed)
 2000-2499         (data packet dropped)
 2500-2999         (delayed)
 3000-3499         (data packet dropped)
 3500-3999         3500-3999                           1000, SACK=3500-4000
 1000-1499         (data packet dropped)
 1500-2999         1500-1999                           1000, SACK=1500-2000, 3500-4000
                              2000-2499                           1000, SACK=2000-2500, 1500-2000, 3500-4000
                              1500-2999                           1000, SACK=1500-2000, 1500-3000, 3500-4000

可以看出最后一个SACK的第一个块是一个D-SACK,它包含的范围是1500-2000,而不是1500-2500。

在D-SACK使用了SACK同样的工作过程,它只是SACK的一个协议扩展。当使用D-SACK时,选项中的第一个字段的含义是“重复收到的报文段的序号”。其规则:

  • length后的第一个block(也就是第一个4字节)将包含重复收到的报文段的序号。
  • 如果D-SACK报告的报文段的序号在累积确认的报文段之后(并且不是期望收到的报文段,因为这是SACK工作的基础,也是D-SACK的基础),则在这个SACK选项中跟在D-SACK之后的第一个非D-SACK块将按照SACK的格式描述该报文段(被D-SACK确认的报文段,但是它所报告的可能比D-SACK报告的大,比如例子中的最后一个S-ACK)
  • 跟在D-SACK之后的SACK将按照SACK的方式工作。
  • 如果有多个被重复接收的报文段,则D-SACK只包含其中第一个。

如果收到了D-SACK,就表明接收方接收到了重复的报文段,这可能意味着网络中出现了复制或者是发送方过早重传了,或者是ACK丢失导致了不必要的重传。

4.发送方对SACK的响应

TCP的发送方(实际上也就是连接的双方,因为TCP是全双工的)需要维护一个未被确认的重传报文段队列,报文段未被确认前是不能释放的。重传送队列中的每个报文段都有一个标志位“SACKed”标识该报文段是否被SACK过,对于已经被SACK过的块,在重传时将被跳过。
发送方根据接收到的SACK的信息设置重传队列中的报文段的sacked标记。
当支持D-SACK时,发送方通过如下方式来判断是一个SACK还是一个D-SACK:

  • 如果SACK中的第一个block指定的序列号小于被累积确认的最后一个序列号,则是一个D-SACK
  • 如果SACK中的第一个block指定的序列号落在了其后的block描述的某个范围之内(因为SACK的格式是用两个值描述一个报文段的序号范围),则就是一个D-SACK。

二、F-RTO(ForwardRTORecovery)

根据TCP采取的拥塞控制机制,如果出现了超时,则就会进入拥塞避免算法,而且对于超时的情形会执行“慢启动”,这会极大的降低TCP的吞吐量。
但是由于TCP是建立在IP之上的,IP是无连接的,不同的IP数据报可能走不同的路径,因而属于一个TCP连接的不同的报文段可能走的是不同的路径,这意味着它们可能乱序到达。因此超时可能是因为报文段在IP中走了一条低速路径,并不是真的出现了丢包。考虑以下情景,两个主机A和B之间进行TCP通信,A要发送TCP报文段a,b,c,d,e到B:

  1. A发送报文段a,这时候IP网络选择的路径是path1,它是一个“正常”的路径
  2. IP网络路由发生变化,A和B之间的路径变成了path2,它是一个“低速”路径
  3. A发送报文段b,这时候IP网络使用新的“低速”路径path2
  4. IP网络路由发生变化,A和B之间的路径又变回了path1,它是一个“正常”路径
  5. A发送报文段c,这时候IP网络选择的路径是path1
  6. B收到报文段a,并对它进行确认
  7. A发送报文段d,并使用路径path1
  8. A发送报文段e,并使用路径path1
  9. B收到报文段c,报文乱序,不进行确认
  10. A发现报文段b超时,并开始执行拥塞算法
  11. B收到报文段b,并对报文段b和c进行确认
  12. B收到报文段d,并对它进行确认
  13. B收到报文段e,并对它进行确认

这个简单的场景中,很明显报文不是丢弃了,只是因为IP网络的路由变动出现了延时抖动,从而出现了一个虚假的超时。在实际网络中,延时抖动是不可避免的,因而应该要避免这种抖动导致TCP执行拥塞避免算法。TCP采用了F-RTO来解决该问题。
F-RTO的基本思想是判断RTO是否正常,从而决定是否执行拥塞避免算法。方法是观察RTO之后的两个ACK。如果ACK不是冗余ACK,并且确认的包不是重传的,会认为RTO是虚假的就不执行拥塞避免算法。

转载于:https://www.cnblogs.com/lovemyspring/articles/4270233.html

传输层学习之五(TCP的SACK,F-RTO)相关推荐

  1. 传输层端口、TCP和UDP的概念

    端口 端口号用来识别同一台计算机中进行通信的不同应用程序. 端口用一个16位端口号进行标志.端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程. 简单来说 客户机上运行着多个应用进程, ...

  2. 计算机网络-传输层(传输层概述,TCP,UDP协议概述)

    文章目录 1. 传输层概述 2. TCP,UDP协议概述 3. 传输层的寻址与端口 1. 传输层概述 传输层是只有主机才有的层次. 传输层功能: 传输层提供进程和进程之间的逻辑通信. 网络层提供主机到 ...

  3. 网络编程(part8)--传输层服务之TCP和UDP

    鄙人学习笔记 文章目录 传输层服务 面向连接的传输服务(基于TCP协议的数据传输) 传输特征 实现手段 适用情况 面向无连接的传输服务(基于UDP协议的数据传输) 传输特点 适用情况 传输层服务 面向 ...

  4. TCP/IP(五)传输层之细说TCP的三次握手和四次挥手

    前言 这一篇我将介绍的是大家面试经常被会问到的,三次握手四次挥手的过程.以前我听到这个是什么意思呀?听的我一脸蒙逼,但是学习之后就原来就那么回事! 一.运输层概述 1.1.运输层简介 这一层的功能也挺 ...

  5. 计算机网络概述---传输层 UDP和TCP

    传输层的功能 传输层为应用进程间提供端到端的逻辑通信(网络层是提供主机之间的逻辑通信), 传输层两大重要的功能:复用 和 分用. 复用:在发送端,多个应用进程公用一个传输层: 分用:在接收端,传输层会 ...

  6. 传输层协议(TCP/UDP)介绍

    一,TCP/IP协议族的传输层协议概况:  1,TCP:传输控制协议  2,UDP:用户数据报协议  二,TCP/UDP协议详解:  1,TCP  a.TCP是面向连接的,可靠的进程到进程通信的协议 ...

  7. 网络编程之 传输层的协议TCP与UDP

    传输层协议: TCP和UDP的区别: TCP:面向连接(经历三次握手).传输可靠(保证数据正确性,保证数据顺序).用于传输大量数据(流模式).速度慢,建立连接需要开销较多(时间,系统资源). 服务端和 ...

  8. Http是传输层吗?TCP是个么层?IP/TCP与HTTP的关系?

    Http http是超文本传输协议,HTTP协议是属于应用层,与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的. TCP TCP协议位于传输层,提供可靠的字节流服务. 为了方便传输,将大块 ...

  9. 传输层协议之TCP协议详解

    传输层重点协议:UDP和TCP. 作用:负责数据能够从发送端传输到接收端.(在进行网络编程时,我们会使用到socket,然而一旦调用socket就进入到了传输层的范畴内) 前面我们已经讲过UDP协议了 ...

最新文章

  1. Mybatis逆向工程过程中出现targetRuntime in context mybatisGenerator is invalid
  2. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity
  3. anaconda的scikit-learn报错It seems that scikit-learn has not been built
  4. 如何使用Pycharm2019连接服务器,同时在Pycham2019中同步修改服务器上的代码
  5. 文巾解题 994. 腐烂的橘子
  6. Java 8 CompletableFuture 教程
  7. 半个月两次投资,百度健康再扩服务版图
  8. Unity协程(Coroutine)原理深入剖析
  9. linux下的osd服务,OSD通知来到GNOME Shell
  10. 5安卓输入法键盘显示 搜索_手机输入法谁更黑科技?讯飞搜狗百度大PK
  11. 自学者福利!腾讯Java开发面试记录,砥砺前行!
  12. pcb 受潮_怎样让PCB远离潮湿危害
  13. Python--站在巨人肩膀上
  14. 理性的赌徒-SSD写带宽保持恒稳的秘密
  15. Centos7 出现xxx不在sudoers文件中的解决方案
  16. 数字音视频技术是我国产业发展的重大核心技术
  17. 计算机音乐数字乐谱未闻花名,未闻花名简谱(歌词)-演唱-小叶歌曲谱
  18. 如何在MMIT上使用WMLScript文件(How To Use WMLScript Files With MMIT)
  19. QQ音乐for Mac 已经登陆MAC OSX
  20. 爬虫-Python编程入门

热门文章

  1. sql语句返回近似值
  2. 网络主机和交换机端口位置的有效定位方法
  3. Object类的用法(二)
  4. IT巨头埃森哲遭 LockBit 勒索攻击,黑客威胁泄露数据
  5. Exploit 代码用于攻击中?GitHub 马上删除
  6. 找到软件供应链的薄弱链条
  7. 点击复制,兼容ios-safari
  8. vue-router的beforeEach的使用?
  9. 深度学习与人工智能革命:part IV
  10. 系统安装无法找寻硬盘!!!【全系列】