一个更高效的RACK机制
void tcp_write_timer_handler(struct sock *sk)
{.......event = icsk->icsk_pending;switch (event) {case ICSK_TIME_REO_TIMEOUT:tcp_rack_reo_timeout(sk);break;case ICSK_TIME_EARLY_RETRANS:tcp_resume_early_retransmit(sk);break;......}
}
void tcp_rack_reo_timeout(struct sock *sk)
{struct tcp_sock *tp = tcp_sk(sk);struct skb_mstamp now;u32 timeout, prior_inflight;skb_mstamp_get(&now);prior_inflight = tcp_packets_in_flight(tp);tcp_rack_detect_loss(sk, &now, &timeout);/*判断丢包*/if (prior_inflight != tcp_packets_in_flight(tp)) {/*满足条件,说明rack有新判断出丢包*/if (inet_csk(sk)->icsk_ca_state != TCP_CA_Recovery) {/*之前未丢包,切换到recovery状态*/tcp_enter_recovery(sk, false);if (!inet_csk(sk)->icsk_ca_ops->cong_control)tcp_cwnd_reduction(sk, 1, 0);}/*有判断出新丢包,则进行重传*/tcp_xmit_retransmit_queue(sk);}if (inet_csk(sk)->icsk_pending != ICSK_TIME_RETRANS)/*重置为RTO定时器*/tcp_rearm_rto(sk);
}
static void tcp_rack_detect_loss(struct sock *sk, u32 *reo_timeout)
{struct tcp_sock *tp = tcp_sk(sk);struct sk_buff *skb, *n;u32 reo_wnd;*reo_timeout = 0;reo_wnd = tcp_rack_reo_wnd(sk);/*获取乱序时间窗口值*/list_for_each_entry_safe(skb, n, &tp->tsorted_sent_queue,tcp_tsorted_anchor) {/*遍历传输队列*/struct tcp_skb_cb *scb = TCP_SKB_CB(skb);s32 remaining;/* Skip ones marked lost but not yet retransmitted */if ((scb->sacked & TCPCB_LOST) &&!(scb->sacked & TCPCB_SACKED_RETRANS))continue;/*忽略已经标记丢失但未重传的skb*//*已经判断完最近被(s)ack确认skb的之前所有的包*/if (!tcp_rack_sent_after(tp->rack.mstamp, skb->skb_mstamp,tp->rack.end_seq, scb->end_seq))break;/* A packet is lost if it has not been s/acked beyond* the recent RTT plus the reordering window.*/remaining = tcp_rack_skb_timeout(tp, skb, reo_wnd);/*小于等于零,可以判断为丢包,大于零,为需要在额外等待的时间*/if (remaining <= 0) {tcp_mark_skb_lost(sk, skb);list_del_init(&skb->tcp_tsorted_anchor);} else {/* Record maximum wait time *//*记录需要等待最长的额外时间,用该值重置REO定时器*/*reo_timeout = max_t(u32, *reo_timeout, remaining);}}
}
void tcp_rack_update_reo_wnd(struct sock *sk, struct rate_sample *rs)
{struct tcp_sock *tp = tcp_sk(sk);/*TCP_RACK_STATIC_REO_WND为0x02,如果设置了该值,就回到旧版的静态时间窗口功能,默认是开启0x01*/if (sock_net(sk)->ipv4.sysctl_tcp_recovery & TCP_RACK_STATIC_REO_WND ||!rs->prior_delivered)return;/* Disregard DSACK if a rtt has not passed since we adjusted reo_wnd */if (before(rs->prior_delivered, tp->rack.last_delivered)) /*刚调整完乱序时间窗口,还未经过一轮,则忽略处理改d-sack*/tp->rack.dsack_seen = 0;/* Adjust the reo_wnd if update is pending */if (tp->rack.dsack_seen) {tp->rack.reo_wnd_steps = min_t(u32, 0xFF,tp->rack.reo_wnd_steps + 1);/*将时间窗口增加一个min_rtt/4*/tp->rack.dsack_seen = 0;tp->rack.last_delivered = tp->delivered;tp->rack.reo_wnd_persist = TCP_RACK_RECOVERY_THRESH;/*重置为16轮*/} else if (!tp->rack.reo_wnd_persist) {/*连续16轮没再收到D-SACK信息,则认为网络乱序已经变好,将时间窗口值变小*/tp->rack.reo_wnd_steps = 1;}
}
一个更高效的RACK机制相关推荐
- 【数据科学】 推荐一个更高效的数据清洗方法,建议收藏
今天来分享一个高效率的数据清洗的方法,毕竟我们平常在工作和生活当中经常会遇到需要去处理杂七杂八的数据集,有一些数据集中有缺失值.有些数据集中有极值.重复值等等. 01 导入库和读取数据 我们首先导入所 ...
- 多任务学习,如何设计一个更好的参数共享机制?| AAAI 2020
2019-12-26 05:44:43 作者 | 孙天祥 编辑 | 刘萍 原文标题:稀疏共享:当多任务学习遇见彩票假设 本文介绍了复旦大学邱锡鹏团队在AAAI 2020 上录用的一篇关于多任务学习的工 ...
- hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...
当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化. 数组法 最简单的,我们可以把 ...
- 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。...
微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...
- pushd 命令,了解一下! 一个比 cd 更高效的目录切换命令
第一篇博客,写点自己一直很想分享的东西! 熟悉基于Linux内核所衍生的各种发行版(RedHat, Centos, Fedora)操作系统的各位大佬,肯定对cd命令非常了解,知道它是用于目录切换的,今 ...
- Adaptive Execution让Spark SQL更高效更好用
本文所述内容均基于 2018年9月17日 Spark 最新 Spark Release 2.3.1 版本,以及截止到 2018年10月21日 Adaptive Execution 最新开发代码.自动设 ...
- c语言c2182是什么错误,C语言中一种更优雅的异常处理机制
上一篇文章对C语言中的goto语句进行了较深入的阐述,实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支持形式.后来为了更好地.更方便地支持异常处理编程机制,使得程序员在 ...
- 更强、更稳、更高效:解读 etcd 技术升级的三驾马车
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 陈星宇(宇慕 ...
- CVPR 2020 | 自适应聚合网络AANet:更高效的立体匹配
©PaperWeekly 原创 · 作者|张承灏 单位|中科院自动化所硕士生 研究方向|双目深度估计 本文介绍的是中科大团队在 CVPR 2020 上提出的一种高效立体匹配网络--自适应聚合网络 ...
- pyppeteer:比selenium更高效的爬虫利器
pyppeteer github地址:https://github.com/miyakogi/pyppeteer pyppeteer 英文文档地址: https://miyakogi.github.i ...
最新文章
- 2022-2028年中国加密货币交易所市场研究及前瞻分析报告
- Android P 电量管理,Android P亮点汇总:更智能 更简单
- received packet with own address as source address
- arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒
- 关于LIMIT(超出界限时,SQL执行也没有问题,而且结果集中只会到有数据的最后一条记录,不会出现空,已经过测试)
- mysql游标是什么特性_[转]MySQL游标特性
- 国际音标的HTML实体对照表
- macOS Monterey兼容哪些Mac电脑?
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(九)——运算放大器
- CAD线型设置:CAD软件中如何加粗曲线?
- 教你用Axure绘制三级菜单
- 软件测试睡眠原理,测一测你的睡眠质量
- java 小说系统_java 实现小说管理系统
- jQuery 效果 ——fadeIn() 方法、fadeOut() 方法
- 地图可视化 - 气泡点图
- 梅科尔工作室--梁嘉莹-鸿蒙笔记3
- 华为HCIE安全之常用的局域网攻击
- Hbuildx 无法运行项目的问题
- 【单目摄像头测量距离:相似三角形法】
- 优势分析- 性格测试
热门文章
- HDFS dfsclient读文件过程 源码分析
- js中的this指向问题
- 儿童吹泡泡水简单配方_请问儿童吹泡泡液如何制作?
- 计算机毕业设计ssm基于网络安全维护的机房设备管理19rya系统+程序+源码+lw+远程部署
- 如何提高团队管理能力10
- 汽车电子嵌入式相关知识
- [gdc17]寒霜引擎的HDR渲染探索
- 4和2大于号小于号箭头那边_‘’口诀化‘’教学之二――大于号和小于号
- opc ua与opc da区别_OPC,OPCDA,OPCUA
- 从零搭建Angular10项目