关于CentOS 6.7之一个TCP重传细节的证实

如果你真的就看完了《packetdrill框架点滴剖析以及TCP重传的一个细节》,我觉得你应该有一个疑问,那就是RH发行版使用的2.6.32内核真的使用了PRR降窗算法吗?为此,我把故事再撸一遍。
        按照标准的2.6.32内核,第一次收到SACK的时候,在进入重传之前,拥塞窗口的值应该是in_flight+1,即2+1=3个段,也就是说可以重传1个段,但是抓包发现重传了2个段,tcpprobe也证实了在进入重传之前,拥塞窗口的值是4,而in_flight的值为2,完全对不上tcp_cwnd_down函数的逻辑啊!
        我此时认为一定是哪里我理解错了,肯定是个小问题,于是我试图用tcpprobe去probe这个降窗函数,然而加载模块失败,也就是说系统找不到tcp_cwnd_down这个符号。这隐约让我觉得RH对内核做了patch,以前用Debian的时候发生过这样的事,毕竟每一类发行版甚至同一个发行版的不同版本就是一次定制。于是我在/proc/kallsyms里面找名字比较像的降窗函数,但是没有找到。然后,我准备在http://vault.centos.org/6.7/updates/Source/SPackages/上看看有没有什么端倪。
我的系统发行版版本是:CentOS release 6.7 (Final)
于是我下载了kernel-2.6.32-573.1.1.el6.src.rpm,安装后我查看了源码,主要是tcp_fastretrans_alert的最后:

        if (do_lost || (tcp_is_fack(tp) && tcp_head_timedout(sk)))
                tcp_update_scoreboard(sk, fast_rexmit);
        tp->prr_delivered += newly_acked_sacked;
        tcp_update_cwnd_in_recovery(sk, newly_acked_sacked, fast_rexmit, flag);
        tcp_xmit_retransmit_queue(sk);
       
注意,在重传之前并没有调用社区版本内核的tcp_cwnd_down来执行Rate Halving降窗算法。我有看一看tcp_update_cwnd_in_recovery的欲望:
/* This function implements the PRR algorithm, specifcally the PRR-SSRB
 * (proportional rate reduction with slow start reduction bound) as described in
 * http://www.ietf.org/id/draft-mathis-tcpm-proportional-rate-reduction-01.txt.
 * It computes the number of packets to send (sndcnt) based on packets newly
 * delivered:
 *   1) If the packets in flight is larger than ssthresh, PRR spreads the
 *      cwnd reductions across a full RTT.
 *   2) If packets in flight is lower than ssthresh (such as due to excess
 *      losses and/or application stalls), do not perform any further cwnd
 *      reductions, but instead slow start up to ssthresh.
 */
static void tcp_update_cwnd_in_recovery(struct sock *sk, int newly_acked_sacked,
                                        int fast_rexmit, int flag)
{
        struct tcp_sock *tp = tcp_sk(sk);
        int sndcnt = 0;
        int delta = tp->snd_ssthresh - tcp_packets_in_flight(tp);

        if (tcp_packets_in_flight(tp) > tp->snd_ssthresh) {
                u64 dividend = (u64)tp->snd_ssthresh * tp->prr_delivered +
                               tp->prior_cwnd - 1;
                sndcnt = div_u64(dividend, tp->prior_cwnd) - tp->prr_out;
        } else {
                sndcnt = min_t(int, delta,
                               max_t(int, tp->prr_delivered - tp->prr_out,
                                     newly_acked_sacked) + 1);
        }

        sndcnt = max(sndcnt, (fast_rexmit ? 1 : 0));
        tp->snd_cwnd = tcp_packets_in_flight(tp) + sndcnt;
}


这就是PRR了。通过rpm安装包的发布时间以及PRR草案正式变成标准的时间,我们可以看到RH对这个PRR patch的反应是多么的及时。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
OSSEC linux(server) windows(agent)史上最详细中文配置 作者:谭丙章 E-mail:feifengwind@163.com ossec官方网站: http://www.ossec.net/ ossec帮助文档: http://ossec-docs.readthedocs.org/en/latest/manual/index.html 介绍 SSEC是一款开源的多平台的入侵检测系统,可以运行于Windows, Linux, OpenBSD/FreeBSD, 以及 MacOS等

反汇编mbr - 2016-07-22 19:07:23

https://notelzg.github.io/2016/07/17/disamy-mbr/ 个人博客,排版更好 今天把我们每次开机都用到的MBR,反汇编看看里面的引导代码是怎么样的顺便说一下 MBR 相关的开机过程。以及我们经常用的U盘自启动 程序到底值怎么玩的。 window开机流程 流程 加电--BIOS-- MBR-- DPT-- pbr-- Bootmgr-- bcd-- Winload.exe--- —- 内核加载– 整个windows7系统 细节 在CPU上电之后,若由硬盘启动,则BIO
Members 成员 Members are used for registering and authenticating external users of an Umbraco installation (ie. forum members, intranet users and so forth). Unlike with Document Types and Media Types everything is done in the Members section both defining a
特此说明:我参考了李林锋老师写的《netty权威指南》一书,支持大家买正版书学习。学会了,赶紧写下来,不但为了加深记忆也希望对大家有所帮助! 上节我们讲解了LineBasedFrameDecoder和StringDecoder的使用,如果大家理解了这二个东西,那么这一章学起来将是轻车熟路。话不多说开始吧。 本章我们将讲解一下内容: DelimiterBasedFrameDecoder(可以自动完成以分隔符做结束标志的消息解码)FixedLengthFrameDecoder(可以自动完成对定长消息的解码)

漫谈处理器体系结构 - 2016-07-22 19:07:08

漫谈处理器体系结构 前言: 这篇博客本应该是《 深入理解计算机体系结构 》(第二版)中第一部分第4章处理器体系结构的读后感,但是感觉这样的名字有点low,因为毕竟加入了自己的理解和总结。 ISA(Instruction-Set Architecture) 几乎所有讲体系结构的书都会讲到这个指令集。指令集确实应该是最先说明的问题。一句话概括起来指令集就是说CPU能干什么事。基本常用的指令集包括:传送指令、算术逻辑指令、跳转指令等。是体系结构需要实现的功能。指令集对人类来说是友好的,可阅读的。但对于只认识01

Linux学习---文件查找 - 2016-07-22 18:07:56

grep, egrep, fgrep  :文本查找 文件查找 locate 全系统查找,非实时,模糊匹配。查找时根据全系统文件数据库进行的。 系统在每天的计划任务时间生成数据库。 updatedb  手动生成文件数据库。 速度快。 find 实时查找,精确。速度慢。 遍历指定目录中所有文件完成查找。 支持多种查找标准。 find   PATH   查找标准   找到后的处理动作           路径默认:表示当前目录           标准默认:指定路径下所有文件           动作默认:为打
在上一篇文章中,详细讲述了Spring中注册AOP解析器的过程。在这篇文章中,将进一步讲解Advisors的创建过程。 Spring中注册AOP解析器的所有操作都是针对AnnotationAwareAspectJAutoProxyCreator进行的。AnnotationAwareAspectJAutoProxyCreator是实现AOP的根本。首先观察AnnotationAwareAspectJAutoProxyCreator的类层次结构。 图1 AnnotationAwareAspectJAutoPr
 总体来说 设计模式 分为三大类:创建型模式、结构型模式和行为型模式。 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则。设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:  Java经典设计模式之五大创建模式(附实例和详解) 。 接下来我们看看结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。其中的对象的适配器模式是各种结构
大话设计模式 1 面向对象的好处 可维护、可重复、可扩展 。 2 包含的角色 简单工厂模式包含三个角色: 工厂类Factory :工厂类是用来制造产品的。因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数。这个函数能够根据“标识符”的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的。 抽象产品类AbstractProduct :抽象产品是从其他具体产品抽象出来的。抽象产品类只有一个。
Linux常用命令 (1)ls 查看当前目录下所有目录和文件 ls -l会将目录和文件竖着排,并且可以提供文件数据 上图最左边以“d”开头的是目录,以“-”开头的是文件。后面是文件和目录的权限,后面是占了多少空间的大小,然后是创建人和所有人是谁,然后是实际当中所占空间,后面是创建的时间,最右边是目录或文件的名字。 ls -m会适合左右屏幕宽度将目录和文件列出 后面的不常用的不再介绍,用到可以去查 (2)cd 打开目录 cd /打开根目录 cd /dev 打开dev目录(绝对路径) cd /之后再cd dev