参考教材:TCP-IP Guide

引入理由

在文章TCP-IP详解:超时重传机制中,有介绍到快速重传和超时重传都会面临到一个重传什么包的问题,因为发送端也不清楚丢失包后面传送的数据是否有成功的送到。主要原因还是对于TCP的确认系统,不是特别的好处理这种不连续确认的状况了,只有低于ACK number的片段都被收到才有进行ACK,out-of-order的片段只能是等待,同时,这个时间窗口是无法向右移动的。

举个例子:

1. 服务发送4个片段给客户端,seg1(seq=1,len=80),seg2(seq=81,len=120), seg3(seq=201,len=160),seg4(seq=361,len=140)

2. 服务器收到seg1和seg2的ACK = 201,所以此时seg1 seg2变成发送并已经确认范畴的数据包,被移除滑动窗口,此时服务器又可以多发80+120 byte数据

3. 假设seg3由于某些原因丢失,这个时候服务器仍然可以像客户端发送数据,但是服务器会等待seg3的ACK,否则窗口无法滑动,卡主了

4. seg3丢失了,即使后面的seg4收到了,客户端也无法告知服务器已经收到了seg4,试想一下,如果窗口也够大,服务器可以继续持续发送更多的片段,那么这些片段被客户端接收,只能存放到队列中,无法进行确认

正式因为后续OUT-OF-ORDER的报文段的发送状况也不清楚,所以Server也不是特别清楚要如何去处理这种状况,不过一般来说只能有2中状况:

1. 只重传超时的数据包,这种方法是最常想到的,比较实用与后面的数据包都能够正常接收的状况,只重传超时的数据包,但是如果比较坏的情况下,丢失了很多封包呢?  那就需要一个一个的等待超时了,很浪费时间。

2. 重传这个片段以及之后的所有包,这种方法在最坏的状况下,看起来效率还是挺高的,但是如果只有一个包丢失,就去重传后面所有接受到的包,流量浪费也是很严重的。

总之对于上面阐述的问题,没有想到一个好的思路来解。但是RFC2018提供了一个SACK的方法,有效的解决这个问题

SACK(Selective Acknowledgment)

SACK是一个TCP的选项,来允许TCP单独确认非连续的片段,用于告知真正丢失的包,只重传丢失的片段。要使用SACK,2个设备必须同时支持SACK才可以,建立连接的时候需要使用SACK Permitted的option,如果允许,后续的传输过程中TCP segment中的可以携带SACK option,这个option内容包含一系列的非连续的没有确认的数据的seq range,这些

SYN包中SACK Permitted 选项,双方都支持才对

SACK option格式

Kind 5  Length  剩下的都是没有确认的segment的range了 比如说segment 501-600 没有被确认,那么Left Edge of 1st Block = 501,Right Edge of 1st Block = 600,TCP的选项不能超过40个字节,所以边界不能超过4组

可以看下实际的tcpdump抓包中的SACK option,如下图,使用tcp.option.sack进行过滤,可以看到这个SACK option只有一个片段,接收并没有进行确认,范围是18761~20101

再来将上面的例子

客户端收到seg4的时候,发送seg3的ACK 会产生一个SACK的option(361~500),Server收到这个ACK后,就知道seg3丢失了,但是seg4已经收到了但是并没有确认,所以就只会重传seg3

SACK的产生,RFC2018

SACK通常是由数据接收方产生,如果在connection建立的时候,SYN包中有SACK-Permitted 的选项为true,同时自身也支持SACK,那么可以在接收异常的时候,产生SACK option. 如果要发送,SACK中需要携带接收队列中所有没有被确认的数据段信息。

如果接收方选择发送带有SACK的ACK,需要遵循如下规则:

1. 第一个block需要指出是哪一个segment触发SACK option ,我认为就是谁乱序了,才会导致SACK

2. 尽可能多的把所有的block填满

3. SACK 要报告最近接收的不连续的数据块

接收端的行为:

1. 数据没有被确认前,都会保持在滑动窗口内

2. 每一个数据包都有一个SACKed的标志,对于已经标示的segment,重新发送的时候会忽略

3. 如果SACK丢失,超时重传之后,重置所有数据包SACKed 标志

D-SACK RFC2883

D-SACK主要是使用了SACK来告诉发送方有哪些数据被重复接收了,如果是D-SACK,那么SACK option的第一个block代表被重复发送的序列片段

需要注意的点:

1. D-SACK仅仅是接收端报告一个重复的连续的片段

2. 每个重复的连续片段只能在一个block中

3.  重复片段的序列号

4. 第二个block指的是data没有被确认的

分析一下RFC2883的例子:

1. Reproting a Duplicate Segment

如下图: 发送端发送seg1和seg2,但是接收端的ACK都被drop掉了,超时重传seg1,然后接收端就发了一个D-SACK,告诉发送端3000~3499重复接收,需要接收4000的。

2. 报告OUT-OF-ORDER段和重传段

从图中可以看出seg4 out-of-order会触发SACK,说明已经收到但是没有确认的数据,但是这个丢掉了,通过发送方又重传了seg1,然后接收方此时会生成D-SACK,block1中存放了dup的segment,block2中存放了收到但没有确认的segment

还有比较多的例子,详细的可以参考 RFC2883。

总起来说D-SACK还是带了诸多的好处,能否让发送方了解是ACK丢了还是发送的数据包丢了,重复发送就说明是ACK丢了呗,同时也能够掌握网络上的一些事情,比如out-of-order,超时重传等,这样了解了网络,才能更好的做流控。

TCP-IP详解:SACK选项(Selective Acknowledgment)相关推荐

  1. TCP/IP详解 第十二章(9) TCP断开连接

    前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林当年校招时常因 TCP 面试题被刷, ...

  2. 《TCP/IP详解卷一》学习笔记

    <TCP/IP详解卷一>学习笔记 第1章 概述 第3章 IP:网际协议 第6章 ICMP:internet控制报文协议 第7/8章 Ping/Traceroute程序 第9/10章 IP路 ...

  3. 《TCP/IP详解·卷1:协议》随笔(已完结)

    第一章.概述 Internet的成功 Internet体系结构被设计成支持现有网络互联,同时提供了广泛的服务与协议操作. 选用数据包的分组交换主要是因为它的鲁棒性与效率,而相对来说数据安全性与交付可预 ...

  4. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. TCP/IP详解--第十七章

     第17章 TCP:传输控制协议 17.1    引言   本章将介绍 TCP为应用层提供的服务,以及 TCP首部中的各个字段.随后的几章我们在了 解TCP的工作过程中将对这些字段作详细介绍. 对TC ...

  6. TCP/IP详解--第十五章

     第15章 TFTP:简单文件传送协议 15.1    引言   TFTP(Trivial File Transfer Protocol) 即简单文件传送协议,最初打算用于引导无盘系统 (通常是工作站 ...

  7. TCP/IP详解--第一章

    说明:专栏中的内容是<TCP/IP详解>这本书,博主分享在此. 第1章概     述 1.1   引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但  TCP/IP协 ...

  8. 《TCP/IP详解》

    明天又开新课了,用到的课本是<TCP/IP详解 卷2:实现>,TCP/IP论著中的the Bible. 分享一下百度百科里关于这三卷书内容的简介: <TCP/IP详解,卷1:协议&g ...

  9. TCP/IP详解学习笔记-基本概念

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  10. 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议

    4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...

最新文章

  1. Laravel学习笔记(二)
  2. |Vijos|树状数组|P1512 SuperBrother打鼹鼠
  3. 退出循环:break 跳过当前的这次循环,直接开始下一次循环:continue
  4. Go语言GO111MODULE设置
  5. 【活动报名】2021蚂蚁链开发者大会
  6. 精密制造业行业_精密制造业行业前景(全球精密制造业排名)
  7. 利用python进行数据分析—9.数据规整:连接、联合与重塑
  8. 命令行配置Windows SNMP服务
  9. web前端开发技术——第六章课后习题实验
  10. 本地计算机策略打不开怎么办,我的电脑的本地组策略编辑器怎么打不开?
  11. 360°环视性能倍增,瑞芯微首发全景环视芯片方案
  12. 【云服务架构】大健康之互联网医疗解决方案
  13. esp32的python教程步数采集_ESP32CAM micropython的操作指南
  14. 一个团购安卓APP界面的制作以及细节
  15. 微信端小区垃圾回收系统
  16. 百度总裁张亚勤宣布10月退休,李彦宏的人才建设要加紧了
  17. aba会导致问题_ABA问题的本质及其解决办法
  18. 追书神器(一)—Scrapy入门
  19. LeNet-1998-Yann LeCun
  20. UE接入LTE网络协议架构

热门文章

  1. 20155322 2016-2017-2 《Java程序设计》第8周学习总结
  2. 鸿鹄818芯片:小米电视千万销量面前的“水滴”
  3. 贪心算法解决汽车加油问题
  4. SpringAnimation弹簧动画简单使用(个人学习记录)
  5. 用友财务系统对接第三方业务系统达到财务业务一体化管理
  6. cannot be resolved解决方法
  7. 2的负x次幂图像_函数Y等于2的X次方图像怎么画?求过程
  8. Linux LED子系统调试与应用 设备树官方文档与 gpio-leds.c 源码详解
  9. 洛谷【入门4】数组 P2141 [NOIP2014 普及组] 珠心算测验
  10. 普渡大学科技学院计算机信息技术,普渡大学-学院介绍